]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/mutator_campcheck.qc
Merge branch 'master' into Mario/vaporizer_damage
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_campcheck.qc
index 2ec584db4cb23d265c5b105aceb2dbf6a3f33c7b..2839ae09b6e546ee01faa1adf04be0ed0fc39e90 100644 (file)
@@ -1,11 +1,17 @@
+#include "../_all.qh"
+
+#include "mutator.qh"
+
+#include "../campaign.qh"
+
 .float campcheck_nextcheck;
 .float campcheck_traveled_distance;
 
 MUTATOR_HOOKFUNCTION(campcheck_PlayerDies)
 {
-       Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_CAMPCHECK);
+       Kill_Notification(NOTIF_ONE, self, MSG_CENTER_CPID, CPID_CAMPCHECK);
 
-       return FALSE;
+       return false;
 }
 
 MUTATOR_HOOKFUNCTION(campcheck_PlayerDamage)
@@ -18,21 +24,26 @@ MUTATOR_HOOKFUNCTION(campcheck_PlayerDamage)
                frag_attacker.campcheck_traveled_distance = autocvar_g_campcheck_distance;
        }
 
-       return FALSE;
+       return false;
 }
 
 MUTATOR_HOOKFUNCTION(campcheck_PlayerThink)
 {
+       if(!gameover)
+       if(!warmup_stage) // don't consider it camping during warmup?
+       if(time >= game_starttime)
        if(IS_PLAYER(self))
+       if(IS_REAL_CLIENT(self)) // bots may camp, but that's no reason to constantly kill them
        if(self.deadflag == DEAD_NO)
        if(!self.frozen)
+       if(!self.BUTTON_CHAT)
        if(autocvar_g_campcheck_interval)
        {
                vector dist;
 
                // calculate player movement (in 2 dimensions only, so jumping on one spot doesn't count as movement)
                dist = self.prevorigin - self.origin;
-               dist_z = 0;
+               dist.z = 0;
                self.campcheck_traveled_distance += fabs(vlen(dist));
 
                if((autocvar_g_campaign && !campaign_bots_may_start) || (time < game_starttime) || (round_handler_IsActive() && !round_handler_IsRoundStarted()))
@@ -54,9 +65,12 @@ MUTATOR_HOOKFUNCTION(campcheck_PlayerThink)
                        self.campcheck_nextcheck = time + autocvar_g_campcheck_interval;
                        self.campcheck_traveled_distance = 0;
                }
+
+               return false;
        }
 
-       return FALSE;
+       self.campcheck_nextcheck = time + autocvar_g_campcheck_interval; // one of the above checks failed, so keep the timer up to date
+       return false;
 }
 
 MUTATOR_HOOKFUNCTION(campcheck_PlayerSpawn)
@@ -64,13 +78,13 @@ MUTATOR_HOOKFUNCTION(campcheck_PlayerSpawn)
        self.campcheck_nextcheck = time + autocvar_g_campcheck_interval * 2;
        self.campcheck_traveled_distance = 0;
 
-       return FALSE;
+       return false;
 }
 
 MUTATOR_HOOKFUNCTION(campcheck_BuildMutatorsString)
 {
        ret_string = strcat(ret_string, ":CampCheck");
-       return FALSE;
+       return false;
 }
 
 MUTATOR_DEFINITION(mutator_campcheck)
@@ -81,5 +95,5 @@ MUTATOR_DEFINITION(mutator_campcheck)
        MUTATOR_HOOK(PlayerSpawn, campcheck_PlayerSpawn, CBC_ORDER_ANY);
        MUTATOR_HOOK(BuildMutatorsString, campcheck_BuildMutatorsString, CBC_ORDER_ANY);
 
-       return FALSE;
+       return false;
 }