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