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