]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/cl_impulse.qc
eater -> predator, because that's a more correct word
[voretournament/voretournament.git] / data / qcsrc / server / cl_impulse.qc
1 /*\r
2  * Impulse map:\r
3  *\r
4  * 0 reserved (no input)\r
5  * 1 to 9, 14: weapon shortcuts\r
6  * 10: next weapon according to linear list\r
7  * 11: most recently used weapon\r
8  * 12: previous weapon according to linear list\r
9  * 13: best weapon according to priority list\r
10  * 15: next weapon according to priority list\r
11  * 16: previous weapon according to priority list\r
12  * 17: throw weapon\r
13  * 18: next weapon according to sbar_hudselector 1 list\r
14  * 19: previous weapon according to sbar_hudselector 1 list\r
15  *\r
16  * 30 to 39: create waypoints\r
17  * 47: clear personal waypoints\r
18  * 48: clear team waypoints\r
19  *\r
20  * 99: loaded\r
21  *\r
22  * 140: moving clone\r
23  * 141: ctf speedrun\r
24  * 142: fixed clone\r
25  * 143: emergency teleport\r
26  * 148: unfairly eliminate\r
27  *\r
28  * TODO:\r
29  * 200 to 209: prev weapon shortcuts\r
30  * 210 to 219: best weapon shortcuts\r
31  * 220 to 229: next weapon shortcuts\r
32  * 230 to 253: individual weapons (up to 24)\r
33  */\r
34 \r
35 void ImpulseCommands (void)\r
36 {\r
37         local float imp;\r
38         vector org;\r
39         float i;\r
40         float m;\r
41         entity e, e2;\r
42 \r
43         imp = self.impulse;\r
44         if (!imp || gameover)\r
45                 return;\r
46         self.impulse = 0;\r
47 \r
48         if (timeoutStatus == 2) //don't allow any impulses while the game is paused\r
49                 return;\r
50 \r
51         if(CheatImpulse(imp))\r
52         {\r
53         }\r
54         else if (imp >= 1 && imp <= 9)\r
55         {\r
56                 // weapon switching impulses\r
57                 if(self.deadflag == DEAD_NO)\r
58                         W_NextWeaponOnImpulse(imp);\r
59                 else\r
60                         self.impulse = imp; // retry in next frame\r
61         }\r
62         else if(imp >= 10 && imp <= 20)\r
63         {\r
64                 if(self.deadflag == DEAD_NO)\r
65                 {\r
66                         switch(imp)\r
67                         {\r
68                                 case 10:\r
69                                         W_NextWeapon (0);\r
70                                         break;\r
71                                 case 11:\r
72                                         W_SwitchWeapon (self.cnt); // previously used\r
73                                         break;\r
74                                 case 12:\r
75                                         W_PreviousWeapon (0);\r
76                                         break;\r
77                                 case 13:\r
78                                         W_SwitchWeapon (w_getbestweapon(self));\r
79                                         break;\r
80                                 case 14:\r
81                                         W_NextWeaponOnImpulse(0);\r
82                                         break;\r
83                                 case 15:\r
84                                         W_NextWeapon (2);\r
85                                         break;\r
86                                 case 16:\r
87                                         W_PreviousWeapon (2);\r
88                                         break;\r
89                                 case 17:\r
90                                         W_ThrowWeapon(W_CalculateProjectileVelocity(self.velocity, v_forward * 750), '0 0 0', TRUE);\r
91                                         break;\r
92                                 case 18:\r
93                                         W_NextWeapon (1);\r
94                                         break;\r
95                                 case 19:\r
96                                         W_PreviousWeapon (1);\r
97                                         break;\r
98                         }\r
99                 }\r
100                 else\r
101                         self.impulse = imp; // retry in next frame\r
102         }\r
103         else if(imp >= 200 && imp <= 229)\r
104         {\r
105                 if(self.deadflag == DEAD_NO)\r
106                 {\r
107                         // custom order weapon cycling\r
108                         i = mod(imp, 10);\r
109                         m = (imp - (210 + i)); // <0 for prev, =0 for best, >0 for next\r
110                         W_CycleWeapon(self.(cvar_cl_weaponpriorities[i]), m);\r
111                 }\r
112                 else\r
113                         self.impulse = imp; // retry in next frame\r
114         }\r
115         else if(imp >= 230 && imp <= 253)\r
116         {\r
117                 if(self.deadflag == DEAD_NO)\r
118                         W_SwitchWeapon (imp - 230 + WEP_FIRST);\r
119                 else\r
120                         self.impulse = imp; // retry in next frame\r
121         }\r
122         // deploy waypoints\r
123         else if (imp >= 30 && imp <= 49)\r
124         {\r
125                 entity wp;\r
126                 switch(imp)\r
127                 {\r
128                         case 30:\r
129                                 wp = WaypointSprite_DeployPersonal("waypoint", self.origin);\r
130                                 if(wp)\r
131                                 {\r
132                                         WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');\r
133                                         WaypointSprite_Ping(wp);\r
134                                 }\r
135                                 sprint(self, "personal waypoint spawned at location\n");\r
136                                 break;\r
137                         case 31:\r
138                                 WarpZone_crosshair_trace(self);\r
139                                 wp = WaypointSprite_DeployPersonal("waypoint", trace_endpos);\r
140                                 if(wp)\r
141                                 {\r
142                                         WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');\r
143                                         WaypointSprite_Ping(wp);\r
144                                 }\r
145                                 sprint(self, "personal waypoint spawned at crosshair\n");\r
146                                 break;\r
147                         case 32:\r
148                                 if(vlen(self.death_origin))\r
149                                 {\r
150                                         wp = WaypointSprite_DeployPersonal("waypoint", self.death_origin);\r
151                                         if(wp)\r
152                                         {\r
153                                                 WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');\r
154                                                 WaypointSprite_Ping(wp);\r
155                                         }\r
156                                         sprint(self, "personal waypoint spawned at death location\n");\r
157                                 }\r
158                                 break;\r
159                         case 33:\r
160                                 if(self.deadflag == DEAD_NO && teams_matter)\r
161                                 {\r
162                                         wp = WaypointSprite_Attach("helpme", TRUE);\r
163                                         if(wp)\r
164                                                 WaypointSprite_UpdateTeamRadar(wp, RADARICON_HELPME, '1 0.5 0'); // TODO choose better color\r
165                                         if(!wp)\r
166                                                 wp = self.waypointsprite_attachedforcarrier; // flag sprite?\r
167                                         if(wp)\r
168                                                 WaypointSprite_Ping(wp);\r
169                                         sprint(self, "HELP ME attached\n");\r
170                                 }\r
171                                 break;\r
172                         case 34:\r
173                                 wp = WaypointSprite_DeployFixed("here", FALSE, self.origin);\r
174                                 if(wp)\r
175                                 {\r
176                                         WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');\r
177                                         WaypointSprite_Ping(wp);\r
178                                 }\r
179                                 sprint(self, "HERE spawned at location\n");\r
180                                 break;\r
181                         case 35:\r
182                                 WarpZone_crosshair_trace(self);\r
183                                 wp = WaypointSprite_DeployFixed("here", FALSE, trace_endpos);\r
184                                 if(wp)\r
185                                 {\r
186                                         WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');\r
187                                         WaypointSprite_Ping(wp);\r
188                                 }\r
189                                 sprint(self, "HERE spawned at crosshair\n");\r
190                                 break;\r
191                         case 36:\r
192                                 if(vlen(self.death_origin))\r
193                                 {\r
194                                         wp = WaypointSprite_DeployFixed("here", FALSE, self.death_origin);\r
195                                         if(wp)\r
196                                         {\r
197                                                 WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');\r
198                                                 WaypointSprite_Ping(wp);\r
199                                         }\r
200                                         sprint(self, "HERE spawned at death location\n");\r
201                                 }\r
202                                 break;\r
203                         case 37:\r
204                                 wp = WaypointSprite_DeployFixed("danger", FALSE, self.origin);\r
205                                 if(wp)\r
206                                 {\r
207                                         WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');\r
208                                         WaypointSprite_Ping(wp);\r
209                                 }\r
210                                 sprint(self, "DANGER spawned at location\n");\r
211                                 break;\r
212                         case 38:\r
213                                 WarpZone_crosshair_trace(self);\r
214                                 wp = WaypointSprite_DeployFixed("danger", FALSE, trace_endpos);\r
215                                 if(wp)\r
216                                 {\r
217                                         WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');\r
218                                         WaypointSprite_Ping(wp);\r
219                                 }\r
220                                 sprint(self, "DANGER spawned at crosshair\n");\r
221                                 break;\r
222                         case 39:\r
223                                 if(vlen(self.death_origin))\r
224                                 {\r
225                                         wp = WaypointSprite_DeployFixed("danger", FALSE, self.death_origin);\r
226                                         if(wp)\r
227                                         {\r
228                                                 WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');\r
229                                                 WaypointSprite_Ping(wp);\r
230                                         }\r
231                                         sprint(self, "DANGER spawned at death location\n");\r
232                                 }\r
233                                 break;\r
234                         case 47:\r
235                                 WaypointSprite_ClearPersonal();\r
236                                 if(self.personal)\r
237                                 {\r
238                                         remove(self.personal);\r
239                                         self.personal = world;\r
240                                 }\r
241                                 sprint(self, "personal waypoint cleared\n");\r
242                                 break;\r
243                         case 48:\r
244                                 WaypointSprite_ClearOwned();\r
245                                 if(self.personal)\r
246                                 {\r
247                                         remove(self.personal);\r
248                                         self.personal = world;\r
249                                 }\r
250                                 sprint(self, "all waypoints cleared\n");\r
251                                 break;\r
252                 }\r
253         }\r
254         else if(imp >= 103 && imp <= 107)\r
255         {\r
256                 if(cvar("g_waypointeditor"))\r
257                 {\r
258                         switch(imp)\r
259                         {\r
260                                 case 103:\r
261                                         waypoint_schedulerelink(waypoint_spawn(self.origin, self.origin, 0));\r
262                                         bprint(strcat("Waypoint spawned at ",vtos(self.origin),"\n"));\r
263                                         break;\r
264                                 case 104:\r
265                                         e = navigation_findnearestwaypoint(self, FALSE);\r
266                                         if (e)\r
267                                         if not(e.wpflags & WAYPOINTFLAG_GENERATED)\r
268                                         {\r
269                                                 bprint(strcat("Waypoint removed at ",vtos(e.origin),"\n"));\r
270                                                 waypoint_remove(e);\r
271                                         }\r
272                                         break;\r
273                                 case 105:\r
274                                         waypoint_schedulerelinkall();\r
275                                         break;\r
276                                 case 106:\r
277                                         waypoint_saveall();\r
278                                         break;\r
279                                 case 107:\r
280                                         for(e = findchain(classname, "waypoint"); e; e = e.chain)\r
281                                         {\r
282                                                 e.colormod_x = 1;\r
283                                                 e.effects &~= EF_NODEPTHTEST | EF_RED | EF_BLUE;\r
284                                         }\r
285                                         e2 = navigation_findnearestwaypoint(self, FALSE);\r
286                                         navigation_markroutes(e2);\r
287                                         i = 0;\r
288                                         m = 0;\r
289                                         for(e = findchain(classname, "waypoint"); e; e = e.chain)\r
290                                         {\r
291                                                 if(e.wpcost >= 10000000)\r
292                                                 {\r
293                                                         print("unreachable: ", etos(e), " ", vtos(e.origin), "\n");\r
294                                                         e.colormod_x = 0.1;\r
295                                                         e.effects |= EF_NODEPTHTEST | EF_BLUE;\r
296                                                         ++i;\r
297                                                         ++m;\r
298                                                 }\r
299                                         }\r
300                                         if(i)\r
301                                                 print(ftos(i), " waypoints cannot be reached from here in any way (marked with blue light)\n");\r
302                                         navigation_markroutes_inverted(e2);\r
303                                         i = 0;\r
304                                         for(e = findchain(classname, "waypoint"); e; e = e.chain)\r
305                                         {\r
306                                                 if(e.wpcost >= 10000000)\r
307                                                 {\r
308                                                         print("cannot reach me: ", etos(e), " ", vtos(e.origin), "\n");\r
309                                                         e.colormod_x = 0.1;\r
310                                                         if not(e.effects & EF_NODEPTHTEST) // not already reported before\r
311                                                                 ++m;\r
312                                                         e.effects |= EF_NODEPTHTEST | EF_RED;\r
313                                                         ++i;\r
314                                                 }\r
315                                         }\r
316                                         if(i)\r
317                                                 print(ftos(i), " waypoints cannot walk to here in any way (marked with red light)\n");\r
318                                         if(m)\r
319                                                 print(ftos(m), " waypoints have been marked total\n");\r
320                                         i = 0;\r
321                                         for(e = findchain(classname, "info_player_deathmatch"); e; e = e.chain)\r
322                                         {\r
323                                                 org = e.origin;\r
324                                                 tracebox(e.origin, PL_MIN, PL_MAX, e.origin - '0 0 512', MOVE_NOMONSTERS, world);\r
325                                                 setorigin(e, trace_endpos);\r
326                                                 if(navigation_findnearestwaypoint(e, FALSE))\r
327                                                 {\r
328                                                         setorigin(e, org);\r
329                                                         e.effects &~= EF_NODEPTHTEST;\r
330                                                         e.model = "";\r
331                                                 }\r
332                                                 else\r
333                                                 {\r
334                                                         setorigin(e, org);\r
335                                                         print("spawn without waypoint: ", etos(e), " ", vtos(e.origin), "\n");\r
336                                                         e.effects |= EF_NODEPTHTEST;\r
337                                                         setmodel(e, self.model);\r
338                                                         e.frame = self.frame;\r
339                                                         e.skin = self.skin;\r
340                                                         setsize(e, '0 0 0', '0 0 0');\r
341                                                         ++i;\r
342                                                 }\r
343                                         }\r
344                                         if(i)\r
345                                                 print(ftos(i), " spawnpoints have no nearest waypoint (marked by player model)\n");\r
346                                         break;\r
347                         }\r
348                 }\r
349         }\r
350 #ifdef TETRIS\r
351         else if(imp == 100)\r
352                 TetrisImpulse();\r
353 #endif\r
354 }\r