]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/mutators/mutator_campcheck.qc
Merge branch 'master' into TimePath/deathtypes
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / mutator_campcheck.qc
1
2 #include "mutator.qh"
3
4 #include "../campaign.qh"
5
6 .float campcheck_nextcheck;
7 .float campcheck_traveled_distance;
8
9 MUTATOR_HOOKFUNCTION(campcheck_PlayerDies)
10 {SELFPARAM();
11         Kill_Notification(NOTIF_ONE, self, MSG_CENTER_CPID, CPID_CAMPCHECK);
12
13         return false;
14 }
15
16 MUTATOR_HOOKFUNCTION(campcheck_PlayerDamage)
17 {
18         if(IS_PLAYER(frag_target))
19         if(IS_PLAYER(frag_attacker))
20         if(frag_attacker != frag_target)
21         {
22                 frag_target.campcheck_traveled_distance = autocvar_g_campcheck_distance;
23                 frag_attacker.campcheck_traveled_distance = autocvar_g_campcheck_distance;
24         }
25
26         return false;
27 }
28
29 MUTATOR_HOOKFUNCTION(campcheck_PlayerThink)
30 {SELFPARAM();
31         if(!gameover)
32         if(!warmup_stage) // don't consider it camping during warmup?
33         if(time >= game_starttime)
34         if(IS_PLAYER(self))
35         if(IS_REAL_CLIENT(self)) // bots may camp, but that's no reason to constantly kill them
36         if(self.deadflag == DEAD_NO)
37         if(!self.frozen)
38         if(!self.BUTTON_CHAT)
39         if(autocvar_g_campcheck_interval)
40         {
41                 vector dist;
42
43                 // calculate player movement (in 2 dimensions only, so jumping on one spot doesn't count as movement)
44                 dist = self.prevorigin - self.origin;
45                 dist.z = 0;
46                 self.campcheck_traveled_distance += fabs(vlen(dist));
47
48                 if((autocvar_g_campaign && !campaign_bots_may_start) || (time < game_starttime) || (round_handler_IsActive() && !round_handler_IsRoundStarted()))
49                 {
50                         self.campcheck_nextcheck = time + autocvar_g_campcheck_interval * 2;
51                         self.campcheck_traveled_distance = 0;
52                 }
53
54                 if(time > self.campcheck_nextcheck)
55                 {
56                         if(self.campcheck_traveled_distance < autocvar_g_campcheck_distance)
57                         {
58                                 Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_CAMPCHECK);
59                                 if(self.vehicle)
60                                         Damage(self.vehicle, self, self, autocvar_g_campcheck_damage * 2, DEATH_CAMP.m_id, self.vehicle.origin, '0 0 0');
61                                 else
62                                         Damage(self, self, self, bound(0, autocvar_g_campcheck_damage, self.health + self.armorvalue * autocvar_g_balance_armor_blockpercent + 5), DEATH_CAMP.m_id, self.origin, '0 0 0');
63                         }
64                         self.campcheck_nextcheck = time + autocvar_g_campcheck_interval;
65                         self.campcheck_traveled_distance = 0;
66                 }
67
68                 return false;
69         }
70
71         self.campcheck_nextcheck = time + autocvar_g_campcheck_interval; // one of the above checks failed, so keep the timer up to date
72         return false;
73 }
74
75 MUTATOR_HOOKFUNCTION(campcheck_PlayerSpawn)
76 {SELFPARAM();
77         self.campcheck_nextcheck = time + autocvar_g_campcheck_interval * 2;
78         self.campcheck_traveled_distance = 0;
79
80         return false;
81 }
82
83 MUTATOR_HOOKFUNCTION(campcheck_BuildMutatorsString)
84 {
85         ret_string = strcat(ret_string, ":CampCheck");
86         return false;
87 }
88
89 MUTATOR_DEFINITION(mutator_campcheck)
90 {
91         MUTATOR_HOOK(PlayerDies, campcheck_PlayerDies, CBC_ORDER_ANY);
92         MUTATOR_HOOK(PlayerDamage_Calculate, campcheck_PlayerDamage, CBC_ORDER_ANY);
93         MUTATOR_HOOK(PlayerPreThink, campcheck_PlayerThink, CBC_ORDER_ANY);
94         MUTATOR_HOOK(PlayerSpawn, campcheck_PlayerSpawn, CBC_ORDER_ANY);
95         MUTATOR_HOOK(BuildMutatorsString, campcheck_BuildMutatorsString, CBC_ORDER_ANY);
96
97         return false;
98 }