sound(this, CH_TRIGGER, SND_KA_RESPAWN, VOL_BASE, ATTEN_NONE); // ATTEN_NONE (it's a sound intended to be heard anywhere)
}
+.float timepoints_counter;
+MUTATOR_HOOKFUNCTION(ka, reset_map_global)
+{
+ FOREACH_CLIENT(true,
+ {
+ it.timepoints_counter = 0;
+ });
+ return true;
+}
+
void ka_TimeScoring(entity this)
{
if(this.owner.ballcarried)
{ // add points for holding the ball after a certain amount of time
+ float timescore = 0;
if(autocvar_g_keepaway_score_timepoints)
- GameRules_scoring_add(this.owner, SCORE, autocvar_g_keepaway_score_timepoints);
+ timescore = autocvar_g_keepaway_score_timepoints / max(0.001, autocvar_g_keepaway_score_timeinterval);
+
+ if (timescore)
+ GameRules_scoring_add_float2int(this.owner, SCORE, timescore, timepoints_counter, 1);
- GameRules_scoring_add(this.owner, KEEPAWAY_BCTIME, autocvar_g_keepaway_score_timeinterval);
- this.nextthink = time + autocvar_g_keepaway_score_timeinterval;
+ GameRules_scoring_add(this.owner, KEEPAWAY_BCTIME, 1);
+ this.nextthink = time + 1;
}
}
this.effects |= EF_NODRAW;
settouch(this, func_null);
setthink(this, ka_TimeScoring);
- this.nextthink = time + autocvar_g_keepaway_score_timeinterval;
+ this.nextthink = time + 1;
this.takedamage = DAMAGE_NO;
this.event_damage = func_null;
this.damagedbycontents = false;
{
entity e = new(keepawayball);
setmodel(e, MDL_KA_BALL);
+ e.solid = SOLID_TRIGGER; // before setsize to ensure area grid linking
setsize(e, '-16 -16 -20', '16 16 20'); // 20 20 20 was too big, player is only 16 16 24... gotta cheat with the Z (20) axis so that the particle isn't cut off
e.damageforcescale = autocvar_g_keepawayball_damageforcescale;
e.takedamage = DAMAGE_YES;
e.event_damage = ka_DamageEvent;
e.damagedbycontents = true;
IL_PUSH(g_damagedbycontents, e);
- e.solid = SOLID_TRIGGER;
set_movetype(e, MOVETYPE_BOUNCE);
e.glow_color = autocvar_g_keepawayball_trail_color;
e.glow_trail = true;
}
}
-MUTATOR_HOOKFUNCTION(ka, Damage_Calculate) // for changing damage and force values that are applied to players in damage.qc
+MUTATOR_HOOKFUNCTION(ka, Damage_Calculate) // for changing damage and force values that are applied to players
{
entity frag_attacker = M_ARGV(1, entity);
entity frag_target = M_ARGV(2, entity);
M_ARGV(4, float) *= autocvar_g_keepaway_ballcarrier_selfdamage;
M_ARGV(6, vector) *= autocvar_g_keepaway_ballcarrier_selfforce;
}
- else // damage done to noncarriers
+ else // damage done to other ballcarriers
{
M_ARGV(4, float) *= autocvar_g_keepaway_ballcarrier_damage;
M_ARGV(6, vector) *= autocvar_g_keepaway_ballcarrier_force;
}
}
- else // if the target is a noncarrier
+ else // if the attacker is a noncarrier
{
if(frag_target == frag_attacker) // damage done to yourself
{