]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/gamemodes/gamemode/keepaway/sv_keepaway.qc
Add Team Keepaway, a teamplay variant of Keepaway where points are awarded for each...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / gamemodes / gamemode / keepaway / sv_keepaway.qc
index 5b40ed02ccba5ebad778c6ca86d5c102f40feb68..d42703fb297c4a05b0fb8a1d7f6fa0ded7e40bfe 100644 (file)
@@ -77,15 +77,29 @@ void ka_RespawnBall(entity this) // runs whenever the ball needs to be relocated
        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 / 1)); // interval is divided by 1 so that time always shows "seconds"
-               this.nextthink = time + autocvar_g_keepaway_score_timeinterval;
+               GameRules_scoring_add(this.owner, KEEPAWAY_BCTIME, 1);
+               this.nextthink = time + 1;
        }
 }
 
@@ -129,7 +143,7 @@ void ka_TouchEvent(entity this, entity toucher) // runs any time that the ball c
        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;
@@ -233,13 +247,13 @@ void ka_SpawnBall()
 {
        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;
@@ -417,7 +431,7 @@ MUTATOR_HOOKFUNCTION(ka, PlayerUseKey)
        }
 }
 
-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);
@@ -433,13 +447,13 @@ MUTATOR_HOOKFUNCTION(ka, Damage_Calculate) // for changing damage and force valu
                        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
                {