]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/cheats.qc
Factor "impulse" cheats out of cl_impulse.qc
[divverent/nexuiz.git] / data / qcsrc / server / cheats.qc
1 void CopyBody(float keepvelocity);
2
3 .float maycheat;
4 float sv_cheats;
5 float autocvar_sv_cheats;
6
7 #define CHIMPULSE_SPEEDRUN_INIT 30
8 #define CHIMPULSE_GIVE_ALL 99
9 #define CHIMPULSE_CLONE_MOVING 140
10 #define CHIMPULSE_SPEEDRUN 141
11 #define CHIMPULSE_CLONE_STANDING 142
12 #define CHIMPULSE_TELEPORT 143
13 #define CHIMPULSE_R00T 148
14
15 float CheatsAllowed(float i, string cmd) // the cheat gets passed as argument for possible future ACL checking
16 {
17         if(i == CHIMPULSE_CLONE_MOVING || i == CHIMPULSE_CLONE_STANDING)
18                 if(self.lip < sv_clones)
19                         return 1;
20         if(self.maycheat)
21                 return 1;
22         if(sv_cheats && autocvar_sv_cheats)
23                 return 1;
24         if(autocvar_sv_cheats)
25                 sprint(self, "Cheats are not yet allowed, and will be activated at next map change.\n");
26         return 0;
27 }
28
29 float CheatImpulse(float i)
30 {
31         if not(CheatsAllowed(i, string_null))
32                 return 0;
33         switch(i)
34         {
35                 float wep;
36                 entity e, e2;
37                 vector org;
38
39                 case CHIMPULSE_SPEEDRUN_INIT: // deploy personal waypoint
40                         if(!self.personal)
41                         {
42                                 self.personal = spawn();
43                                 self.personal.classname = "personal_wp";
44                         }
45                         self.personal.origin = self.origin;
46                         self.personal.v_angle = self.v_angle;
47                         self.personal.velocity = self.velocity;
48                         self.personal.ammo_rockets = self.ammo_rockets;
49                         self.personal.ammo_nails = self.ammo_nails;
50                         self.personal.ammo_cells = self.ammo_cells;
51                         self.personal.ammo_shells = self.ammo_shells;
52                         self.personal.ammo_fuel = self.ammo_fuel;
53                         self.personal.health = self.health;
54                         self.personal.armorvalue = self.armorvalue;
55                         self.personal.weapons = self.weapons;
56                         self.personal.items = self.items;
57                         self.personal.pauserotarmor_finished = self.pauserotarmor_finished;
58                         self.personal.pauserothealth_finished = self.pauserothealth_finished;
59                         self.personal.pauserotfuel_finished = self.pauserotfuel_finished;
60                         self.personal.pauseregen_finished = self.pauseregen_finished;
61                         self.personal.strength_finished = self.strength_finished;
62                         self.personal.invincible_finished = self.invincible_finished;
63                         self.personal.teleport_time = time;
64                         return 1;
65                 case CHIMPULSE_CLONE_MOVING:
66                         makevectors (self.v_angle);
67                         self.velocity = self.velocity + v_forward * 300;
68                         CopyBody(1);
69                         self.lip += 1;
70                         self.velocity = self.velocity - v_forward * 300;
71                         return 1;
72                 case CHIMPULSE_CLONE_STANDING:
73                         CopyBody(0);
74                         self.lip += 1;
75                         return 1;
76                 case CHIMPULSE_GIVE_ALL:
77                         self.weapons |= WEPBIT_ALL;
78                         self.items |= IT_UNLIMITED_AMMO;
79                         self.ammo_shells = g_pickup_shells_max;
80                         self.ammo_nails = g_pickup_nails_max;
81                         self.ammo_rockets = g_pickup_rockets_max;
82                         self.ammo_cells = g_pickup_cells_max;
83                         self.ammo_fuel = g_pickup_fuel_max;
84                         self.health = g_pickup_healthsmall_max;
85                         self.armorvalue = g_pickup_armorsmall_max;
86                         self.pauserotarmor_finished = time + cvar("g_balance_pause_armor_rot_spawn");
87                         self.pauserothealth_finished = time + cvar("g_balance_pause_health_rot_spawn");
88                         self.pauserotfuel_finished = time + cvar("g_balance_pause_fuel_rot_spawn");
89                         self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
90                         // precache weapon models/sounds
91                         wep = WEP_FIRST;
92                         while (wep <= WEP_LAST)
93                         {
94                                 weapon_action(wep, WR_PRECACHE);
95                                 wep = wep + 1;
96                         }
97                         return 1;
98                 case CHIMPULSE_SPEEDRUN:
99                         if(self.personal)
100                         {
101                                 self.speedrunning = TRUE;
102                                 tracebox(self.personal.origin, self.mins, self.maxs, self.personal.origin, MOVE_WORLDONLY, self);
103                                 if(trace_startsolid)
104                                 {
105                                         sprint(self, "Cannot move there, cheater - only waypoints set using g_waypointsprite_personal work\n");
106                                 }
107                                 else
108                                 {
109                                         // Abort speedrun, teleport back
110                                         setorigin(self, self.personal.origin);
111                                         self.oldvelocity = self.velocity = self.personal.velocity;
112                                         self.angles = self.personal.v_angle;
113                                         self.fixangle = TRUE;
114                                         if(self.flagcarried)
115                                         {
116                                                 bprint("The ", self.flagcarried.netname, " was returned to base by its carrier\n");
117                                                 ReturnFlag(self.flagcarried);
118                                         }
119                                 }
120                                 if(g_ctf)
121                                 {
122                                         self.ammo_rockets = 999;
123                                         self.ammo_nails = 999;
124                                         self.ammo_cells = 999;
125                                         self.ammo_shells = 999;
126                                         self.ammo_fuel = 999;
127                                         self.health = start_health;
128                                         self.armorvalue = start_armorvalue;
129                                         self.weapons |= weaponsInMap;
130                                         self.pauserotarmor_finished = time + cvar("g_balance_pause_armor_rot_spawn");
131                                         self.pauserothealth_finished = time + cvar("g_balance_pause_health_rot_spawn");
132                                         self.pauserotfuel_finished = time + cvar("g_balance_pause_fuel_rot_spawn");
133                                         self.pauseregen_finished = time + cvar("g_balance_pause_health_regen_spawn");
134                                         self.strength_finished = 0;
135                                         self.invincible_finished = 0;
136                                 }
137                                 else
138                                 {
139                                         self.ammo_rockets = self.personal.ammo_rockets;
140                                         self.ammo_nails = self.personal.ammo_nails;
141                                         self.ammo_cells = self.personal.ammo_cells;
142                                         self.ammo_shells = self.personal.ammo_shells;
143                                         self.ammo_fuel = self.personal.ammo_fuel;
144                                         self.health = self.personal.health;
145                                         self.armorvalue = self.personal.armorvalue;
146                                         self.weapons = self.personal.weapons;
147                                         self.items = self.personal.items;
148                                         self.pauserotarmor_finished = time + self.personal.pauserotarmor_finished - self.personal.teleport_time;
149                                         self.pauserothealth_finished = time + self.personal.pauserothealth_finished - self.personal.teleport_time;
150                                         self.pauserotfuel_finished = time + self.personal.pauserotfuel_finished - self.personal.teleport_time;
151                                         self.pauseregen_finished = time + self.personal.pauseregen_finished - self.personal.teleport_time;
152                                         self.strength_finished = time + self.personal.strength_finished - self.personal.teleport_time;
153                                         self.invincible_finished = time + self.personal.invincible_finished - self.personal.teleport_time;
154                                 }
155                                 return 1;
156                         }
157                         else if(self.deadflag != DEAD_NO)
158                                 sprint(self, "UR DEAD AHAHAH))\n");
159                         else
160                                 sprint(self, "No waypoint set, cheater (use g_waypointsprite_personal to set one)\n");
161                         return 0;
162                 case CHIMPULSE_TELEPORT:
163                         if(MoveToRandomMapLocation(self, DPCONTENTS_SOLID | DPCONTENTS_CORPSE | DPCONTENTS_PLAYERCLIP, DPCONTENTS_SLIME | DPCONTENTS_LAVA | DPCONTENTS_SKY | DPCONTENTS_BODY | DPCONTENTS_DONOTENTER, Q3SURFACEFLAG_SKY, ((sv_cheats >= 2) ? 100000 : 100), 1024, 256))
164                         {
165                                 self.angles_x = -self.angles_x;
166                                 self.fixangle = TRUE;
167                                 self.velocity = '0 0 0';
168                                 return 1;
169                         }
170                         else
171                                 sprint(self, "Emergency teleport could not find a good location, forget it!\n");
172                         return 0;
173                 case CHIMPULSE_R00T:
174                         FOR_EACH_PLAYER(e)
175                         {
176                                 if( e.playermodel == "models/player/jeandarc.zym"
177                                                 ||  e.playermodel == "models/player/pyria.zym"
178                                                 ||  e.playermodel == "models/player/skadi.zym"
179                                                 || (e.playermodel == "models/player/specop.zym" && random() < 0.5) // you never know
180                                                 ||  e.playermodel == "models/player/visitant.zym")
181                                 {
182                                         makevectors(e.angles);
183                                         traceline(e.origin, e.origin + v_right * 256, MOVE_NORMAL, e);
184                                 }
185                                 else
186                                 {
187                                         org_x = random();
188                                         org_y = random();
189                                         org_z = 0;
190                                         org = normalize(org);
191                                         traceline(e.origin, e.origin + org * 256, MOVE_NORMAL, e); // random direction
192                                 }
193
194                                 org = findbetterlocation(trace_endpos, 12);
195
196                                 e2 = spawn();
197                                 setorigin(e2, org);
198                                 pointparticles(particleeffectnum("rocket_explode"), org, '0 0 0', 1);
199                                 sound(e2, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
200                                 RadiusDamage(e2, e, 1000, 0, 128, e, 500, DEATH_CHEAT, world);
201                                 remove(e2);
202                         }
203                         print("404 Sportsmanship not found.\n");
204                         return 1;
205         }
206         return 0;
207 }
208
209 float CheatCommand(string cmd)
210 {
211         if not(CheatsAllowed(0, cmd))
212                 return 0;
213         return 0;
214 }