X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fgamemodes%2Fgamemode%2Fnexball%2Fnexball.qc;h=f208c151212f669c9ba8d21b128c9274dbd4d2bc;hb=ff169c9d675521c4e05efe123024cf9703fd4984;hp=62280d7c24c80dd1806dbd026e11f9d782c505b2;hpb=0ef42fd969f0608f8dbf4086f569ad34ac0271d5;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc index 62280d7c24..f208c15121 100644 --- a/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc +++ b/qcsrc/common/gamemodes/gamemode/nexball/nexball.qc @@ -13,8 +13,6 @@ MUTATOR_HOOKFUNCTION(cl_nb, WantEventchase) } #endif #ifdef SVQC -.float metertime = _STAT(NB_METERSTART); - .entity ballcarried; int autocvar_g_nexball_goalleadlimit; @@ -71,7 +69,7 @@ float OtherTeam(float t) //works only if there are two teams on the map! return e.team; } -const float ST_NEXBALL_GOALS = 1; +const int ST_NEXBALL_GOALS = 1; void nb_ScoreRules(int teams) { GameRules_scoring(teams, 0, 0, { @@ -154,9 +152,9 @@ void GiveBall(entity plyr, entity ball) ownr.effects &= ~autocvar_g_nexball_basketball_effects_default; ownr.ballcarried = NULL; GameRules_scoring_vip(ownr, false); - if(ownr.metertime) + if(STAT(NB_METERSTART, ownr)) { - ownr.metertime = 0; + STAT(NB_METERSTART, ownr) = 0; ownr.(weaponentity).state = WS_READY; } WaypointSprite_Kill(ownr.waypointsprite_attachedforcarrier); @@ -223,9 +221,9 @@ void DropBall(entity ball, vector org, vector vel) setthink(ball, ResetBall); ball.nextthink = min(time + autocvar_g_nexball_delay_idle, ball.teamtime); - if(ball.owner.metertime) + if(STAT(NB_METERSTART, ball.owner)) { - ball.owner.metertime = 0; + STAT(NB_METERSTART, ball.owner) = 0; .entity weaponentity = ball.weaponentity_fld; ball.owner.(weaponentity).state = WS_READY; } @@ -637,7 +635,7 @@ void SpawnGoal(entity this) EXACTTRIGGER_INIT; - if(this.team != GOAL_OUT && Team_TeamToNumber(this.team) != -1) + if(this.team != GOAL_OUT && Team_IsValidTeam(this.team)) { entity wp = WaypointSprite_SpawnFixed(WP_NbGoal, (this.absmin + this.absmax) * 0.5, this, sprite, RADARICON_NONE); wp.colormod = ((this.team) ? Team_ColorRGB(this.team) : '1 0.5 0'); @@ -722,136 +720,6 @@ spawnfunc(ball_bound) spawnfunc_nexball_out(this); } -//=======================// -// Weapon code // -//=======================// - - -void W_Nexball_Think(entity this) -{ - //dprint("W_Nexball_Think\n"); - //vector new_dir = steerlib_arrive(this.enemy.origin, 2500); - vector new_dir = normalize(this.enemy.origin + '0 0 50' - this.origin); - vector old_dir = normalize(this.velocity); - float _speed = vlen(this.velocity); - vector new_vel = normalize(old_dir + (new_dir * autocvar_g_nexball_safepass_turnrate)) * _speed; - //vector new_vel = (new_dir * autocvar_g_nexball_safepass_turnrate - - this.velocity = new_vel; - - this.nextthink = time; -} - -void W_Nexball_Touch(entity this, entity toucher) -{ - entity ball, attacker; - attacker = this.owner; - //this.think = func_null; - //this.enemy = NULL; - - PROJECTILE_TOUCH(this, toucher); - if(attacker.team != toucher.team || autocvar_g_nexball_basketball_teamsteal) - if((ball = toucher.ballcarried) && !STAT(FROZEN, toucher) && !IS_DEAD(toucher) && (IS_PLAYER(attacker))) - { - toucher.velocity = toucher.velocity + normalize(this.velocity) * toucher.damageforcescale * autocvar_g_balance_nexball_secondary_force; - UNSET_ONGROUND(toucher); - if(!attacker.ballcarried) - { - LogNB("stole", attacker); - _sound(toucher, CH_TRIGGER, ball.noise2, VOL_BASE, ATTEN_NORM); - - if(SAME_TEAM(attacker, toucher) && time > CS(attacker).teamkill_complain) - { - CS(attacker).teamkill_complain = time + 5; - CS(attacker).teamkill_soundtime = time + 0.4; - CS(attacker).teamkill_soundsource = toucher; - } - - GiveBall(attacker, toucher.ballcarried); - } - } - delete(this); -} - -void W_Nexball_Attack(entity actor, .entity weaponentity, float t) -{ - entity ball; - float mul, mi, ma; - if(!(ball = actor.ballcarried)) - return; - - W_SetupShot(actor, weaponentity, false, 4, SND_NB_SHOOT1, CH_WEAPON_A, 0); - tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, NULL); - if(trace_startsolid) - { - if(actor.metertime) - actor.metertime = 0; // Shot failed, hide the power meter - return; - } - - //Calculate multiplier - if(t < 0) - mul = 1; - else - { - mi = autocvar_g_nexball_basketball_meter_minpower; - ma = max(mi, autocvar_g_nexball_basketball_meter_maxpower); // avoid confusion - //One triangle wave period with 1 as max - mul = 2 * (t % g_nexball_meter_period) / g_nexball_meter_period; - if(mul > 1) - mul = 2 - mul; - mul = mi + (ma - mi) * mul; // range from the minimal power to the maximal power - } - - DropBall(ball, w_shotorg, W_CalculateProjectileVelocity(actor, actor.velocity, w_shotdir * autocvar_g_balance_nexball_primary_speed * mul, false)); - - - //TODO: use the speed_up cvar too ?? -} - -vector trigger_push_calculatevelocity(vector org, entity tgt, float ht); - -void W_Nexball_Attack2(entity actor, .entity weaponentity) -{ - if(actor.ballcarried.enemy) - { - entity _ball = actor.ballcarried; - W_SetupShot(actor, weaponentity, false, 4, SND_NB_SHOOT1, CH_WEAPON_A, 0); - DropBall(_ball, w_shotorg, trigger_push_calculatevelocity(_ball.origin, _ball.enemy, 32)); - setthink(_ball, W_Nexball_Think); - _ball.nextthink = time; - return; - } - - if(!autocvar_g_nexball_tackling) - return; - - W_SetupShot(actor, weaponentity, false, 2, SND_NB_SHOOT2, CH_WEAPON_A, 0); - entity missile = new(ballstealer); - - missile.owner = actor; - - set_movetype(missile, MOVETYPE_FLY); - PROJECTILE_MAKETRIGGER(missile); - - //setmodel(missile, "models/elaser.mdl"); // precision set below - setsize(missile, '0 0 0', '0 0 0'); - setorigin(missile, w_shotorg); - - W_SetupProjVelocity_Basic(missile, autocvar_g_balance_nexball_secondary_speed, 0); - missile.angles = vectoangles(missile.velocity); - settouch(missile, W_Nexball_Touch); - setthink(missile, SUB_Remove); - missile.nextthink = time + autocvar_g_balance_nexball_secondary_lifetime; //FIXME: use a distance instead? - - missile.effects = EF_BRIGHTFIELD | EF_LOWPRECISION; - missile.flags = FL_PROJECTILE; - IL_PUSH(g_projectiles, missile); - IL_PUSH(g_bot_dodge, missile); - - CSQCProjectile(missile, true, PROJECTILE_ELECTRO, true); -} - bool ball_customize(entity this, entity client) { if(!this.owner) @@ -879,61 +747,6 @@ bool ball_customize(entity this, entity client) return true; } -METHOD(BallStealer, wr_think, void(BallStealer thiswep, entity actor, .entity weaponentity, int fire)) -{ - TC(BallStealer, thiswep); - if(fire & 1) - if(weapon_prepareattack(thiswep, actor, weaponentity, false, autocvar_g_balance_nexball_primary_refire)) - if(autocvar_g_nexball_basketball_meter) - { - if(actor.ballcarried && !actor.metertime) - actor.metertime = time; - else - weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready); - } - else - { - W_Nexball_Attack(actor, weaponentity, -1); - weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready); - } - if(fire & 2) - if(weapon_prepareattack(thiswep, actor, weaponentity, true, autocvar_g_balance_nexball_secondary_refire)) - { - W_Nexball_Attack2(actor, weaponentity); - weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, autocvar_g_balance_nexball_secondary_animtime, w_ready); - } - - if(!(fire & 1) && actor.metertime && actor.ballcarried) - { - W_Nexball_Attack(actor, weaponentity, time - actor.metertime); - // DropBall or stealing will set metertime back to 0 - weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, autocvar_g_balance_nexball_primary_animtime, w_ready); - } -} - -METHOD(BallStealer, wr_setup, void(BallStealer this, entity actor, .entity weaponentity)) -{ - TC(BallStealer, this); - //weapon_setup(WEP_PORTO.m_id); -} - -METHOD(BallStealer, wr_reload, void(entity thiswep, entity actor, .entity weaponentity)) -{ - TC(BallStealer, this); -} - -METHOD(BallStealer, wr_checkammo1, bool(BallStealer this, entity actor, .entity weaponentity)) -{ - TC(BallStealer, this); - return true; -} - -METHOD(BallStealer, wr_checkammo2, bool(BallStealer this, entity actor, .entity weaponentity)) -{ - TC(BallStealer, this); - return true; -} - void nb_DropBall(entity player) { if(player.ballcarried && g_nexball) @@ -1038,14 +851,14 @@ MUTATOR_HOOKFUNCTION(nb, SpectateCopy) entity spectatee = M_ARGV(0, entity); entity client = M_ARGV(1, entity); - client.metertime = spectatee.metertime; + STAT(NB_METERSTART, client) = STAT(NB_METERSTART, spectatee); } MUTATOR_HOOKFUNCTION(nb, PlayerSpawn) { entity player = M_ARGV(0, entity); - player.metertime = 0; + STAT(NB_METERSTART, player) = 0; for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot) { .entity weaponentity = weaponentities[slot]; @@ -1060,18 +873,13 @@ MUTATOR_HOOKFUNCTION(nb, PlayerSpawn) return false; } -.float stat_sv_airspeedlimit_nonqw; -.float stat_sv_maxspeed; - -MUTATOR_HOOKFUNCTION(nb, PlayerPhysics) +MUTATOR_HOOKFUNCTION(nb, PlayerPhysics_UpdateStats) { entity player = M_ARGV(0, entity); + // these automatically reset, no need to worry if(player.ballcarried) - { - player.stat_sv_airspeedlimit_nonqw *= autocvar_g_nexball_basketball_carrier_highspeed; - player.stat_sv_maxspeed *= autocvar_g_nexball_basketball_carrier_highspeed; - } + STAT(MOVEVARS_HIGHSPEED, player) *= autocvar_g_nexball_basketball_carrier_highspeed; } MUTATOR_HOOKFUNCTION(nb, ForbidThrowCurrentWeapon) @@ -1094,7 +902,7 @@ MUTATOR_HOOKFUNCTION(nb, FilterItem) { entity item = M_ARGV(0, entity); - if(item.classname == "droppedweapon") + if(Item_IsLoot(item)) if(item.weapon == WEP_NEXBALL.m_id) return true; @@ -1112,7 +920,7 @@ MUTATOR_HOOKFUNCTION(nb, ItemTouch) return MUT_ITEMTOUCH_CONTINUE; } -MUTATOR_HOOKFUNCTION(nb, CheckAllowedTeams) +MUTATOR_HOOKFUNCTION(nb, TeamBalance_CheckAllowedTeams) { M_ARGV(1, string) = "nexball_team"; return true; @@ -1141,6 +949,7 @@ MUTATOR_HOOKFUNCTION(nb, SendWaypoint) REGISTER_MUTATOR(nb, g_nexball) { + MUTATOR_STATIC(); MUTATOR_ONADD { g_nexball_meter_period = autocvar_g_nexball_meter_period; @@ -1168,17 +977,7 @@ REGISTER_MUTATOR(nb, g_nexball) MUTATOR_ONROLLBACK_OR_REMOVE { WEP_NEXBALL.spawnflags |= WEP_FLAG_MUTATORBLOCKED; - // we actually cannot roll back nb_delayedinit here - // BUT: we don't need to! If this gets called, adding always - // succeeds. } - - MUTATOR_ONREMOVE - { - LOG_INFO("This is a game type and it cannot be removed at runtime."); - return -1; - } - return 0; }