]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/cl_weapons.c
-Fixed Engineer bug where holding down +use key near a building would sprint spam...
[divverent/nexuiz.git] / TeamNexuiz / game / gamec / cl_weapons.c
1 \r
2 // generic weapons table\r
3 // add new weapons here\r
4 void (float wreq) w_railgun;\r
5 void(float wpn, float wrequest) weapon_action =\r
6 {\r
7         if ((self.reload_time + .25) > time) { \r
8                 return; }\r
9         if (wpn == WEP5)\r
10         {\r
11                 wpn = self.wpn5.weapon;\r
12 \r
13                 // various extra weapons the player can equip\r
14                 if (wpn == WEP_LASER)\r
15                         w_laser(wrequest);\r
16                 else if (wpn == WEP_SHOTGUN)\r
17                         w_shotgun(wrequest);\r
18                 else if (wpn == WEP_UZI)\r
19                         w_uzi(wrequest);\r
20                 else if (wpn == WEP_GRENADE_LAUNCHER)\r
21                         w_glauncher(wrequest);\r
22                 else if (wpn == WEP_ELECTRO)\r
23                         w_electro(wrequest);\r
24                 else if (wpn == WEP_CRYLINK)\r
25                         w_crylink(wrequest);\r
26                 else if (wpn == WEP_NEX)\r
27                         w_nex(wrequest);\r
28                 else if (wpn == WEP_HAGAR)\r
29                         w_hagar(wrequest);\r
30                 else if (wpn == WEP_ROCKET_LAUNCHER)\r
31                         w_rlauncher(wrequest);\r
32                 return;\r
33         }\r
34         else if(self.class == CLASS_SCOUT)\r
35         {\r
36                 if (wpn == WEP1)\r
37                         w_shotgun(wrequest);\r
38                 else if (wpn == WEP2)\r
39                         w_grapple(wrequest);\r
40                 else if (wpn == WEP3)\r
41                         w_uzi(wrequest);\r
42                 else if (wpn == WEP4)\r
43                         w_crylink(wrequest);\r
44         }\r
45         else if(self.class == CLASS_SPY)\r
46         {\r
47                 if (wpn == WEP1)\r
48                         w_laser(wrequest);\r
49                 else if (wpn == WEP2)\r
50                         w_uzi(wrequest);\r
51                 else if (wpn == WEP3)\r
52                         w_uzi(wrequest);\r
53                 else if (wpn == WEP4)\r
54                         w_uzi(wrequest);\r
55         }\r
56         else if(self.class == CLASS_SOLDIER)\r
57         {\r
58                 if (wpn == WEP1)\r
59                         w_shotgun(wrequest);\r
60                 else if (wpn == WEP2)\r
61                         w_namek(wrequest);\r
62                 else if (wpn == WEP3)\r
63                         w_electro(wrequest);\r
64                 else if (wpn == WEP4)\r
65                         w_rlauncher(wrequest);\r
66         }\r
67         else if(self.class == CLASS_PYRO)\r
68         {\r
69                 if (wpn == WEP1)\r
70                         w_bombletts(wrequest);\r
71                 else if (wpn == WEP2)\r
72                         w_flamer(wrequest);\r
73                 else if (wpn == WEP3)\r
74                         w_rincendiary(wrequest);\r
75                 else if (wpn == WEP4)\r
76                         w_hotbombs(wrequest);\r
77         }\r
78         else if(self.class == CLASS_MEDIC)\r
79         {\r
80                 if (wpn == WEP1)\r
81                         w_shotgun(wrequest);\r
82                 else if (wpn == WEP2)\r
83                         w_electro(wrequest);\r
84                 else if (wpn == WEP3)\r
85                         w_laser(wrequest);\r
86                 else if (wpn == WEP4)\r
87                         w_uzi(wrequest);\r
88         }\r
89         else if(self.class == CLASS_ENGINEER)\r
90         {\r
91                 if (wpn == WEP1)\r
92                         w_laser(wrequest);\r
93                 else if (wpn == WEP2)\r
94                         w_railgun(wrequest);\r
95                 else if (wpn == WEP3)\r
96                         w_shotgun(wrequest);\r
97                         //w_electro(wrequest);\r
98                 else if (wpn == WEP4)\r
99                         w_electro(wrequest);\r
100                         //w_rlauncher(wrequest);\r
101         }\r
102         else\r
103         {\r
104                 if (wpn == WEP_LASER)\r
105                         w_laser(wrequest);\r
106                 else if (wpn == WEP_SHOTGUN)\r
107                         w_shotgun(wrequest);\r
108                 else if (wpn == WEP_UZI)\r
109                         w_uzi(wrequest);\r
110                 else if (wpn == WEP_GRENADE_LAUNCHER)\r
111                         w_glauncher(wrequest);\r
112                 else if (wpn == WEP_ELECTRO)\r
113                         w_electro(wrequest);\r
114                 else if (wpn == WEP_CRYLINK)\r
115                         w_crylink(wrequest);\r
116                 else if (wpn == WEP_NEX)\r
117                         w_nex(wrequest);\r
118                 else if (wpn == WEP_HAGAR)\r
119                         w_hagar(wrequest);\r
120                 else if (wpn == WEP_ROCKET_LAUNCHER)\r
121                         w_rlauncher(wrequest);\r
122         }\r
123 \r
124 };\r
125 \r
126 void () CheckTeamClass =\r
127 {\r
128         if (self.impulse_wait > time)   // So the GUI menus doesnt flicker\r
129                 return;\r
130         if (self.playerclass < 1)               // Bring up menu if no team/class\r
131         {\r
132                 if (self.team_no < 1)\r
133                 {\r
134                         stuffcmd(self, "set scmenu_directmenu TeamSelect; togglemenu\n");\r
135                 }\r
136                 else \r
137                 {\r
138                         stuffcmd(self, "set scmenu_directmenu ClassSelect; togglemenu\n");\r
139                 }\r
140                 self.impulse_wait = time + .5;\r
141                 return;\r
142         }\r
143 };\r
144 \r
145 // switch between weapons\r
146 void(float imp) W_SwitchWeapon\r
147 {\r
148 /*      if (self.reload_time > time - .1)\r
149         {\r
150                 return;\r
151         }*/\r
152         weapon_hasammo = TRUE;\r
153         if (!client_hasweapon(self, imp, TRUE))\r
154         {\r
155                 if (!weapon_hasammo)\r
156                         sprint(self, "You don't have any ammo for that weapon\n");\r
157                 else\r
158                         sprint(self, "You don't own that weapon\n");\r
159         }\r
160         else\r
161                 self.switchweapon = imp;\r
162 };\r
163 \r
164 // next weapon\r
165 void() W_NextWeapon =\r
166 {\r
167         local float weaponwant, i;\r
168 \r
169         weaponwant = self.switchweapon + 1;\r
170         if (weaponwant < WEP_FIRST)\r
171                 weaponwant = WEP_LAST;\r
172         if (weaponwant > WEP_LAST)\r
173                 weaponwant = WEP_FIRST;\r
174         weapon_hasammo = TRUE;\r
175         i = 0;\r
176         while(!client_hasweapon(self, weaponwant, TRUE))\r
177         {\r
178                 i = i + 1;\r
179                 if(i >= 20)\r
180                         return; // failed; there's probably some weird problem causing an infinite loop\r
181                 weaponwant = weaponwant + 1;\r
182                 if (weaponwant < WEP_FIRST)\r
183                         weaponwant = WEP_LAST;\r
184                 if (weaponwant > WEP_LAST)\r
185                         weaponwant = WEP_FIRST;\r
186         }\r
187         self.switchweapon = weaponwant;\r
188 };\r
189 \r
190 // prev weapon\r
191 void() W_PreviousWeapon =\r
192 {\r
193         local float weaponwant, i;\r
194 \r
195         weaponwant = self.switchweapon - 1;\r
196         if (weaponwant < WEP_FIRST)\r
197                 weaponwant = WEP_LAST;\r
198         if (weaponwant > WEP_LAST)\r
199                 weaponwant = WEP_FIRST;\r
200         weapon_hasammo = TRUE;\r
201         i = 0;\r
202         while(!client_hasweapon(self, weaponwant, TRUE))\r
203         {\r
204                 i = i + 1;\r
205                 if(i >= 20)\r
206                         return; // failed; there's probably some weird problem causing an infinite loop\r
207                 weaponwant = weaponwant - 1;\r
208                 if (weaponwant < WEP_FIRST)\r
209                         weaponwant = WEP_LAST;\r
210                 if (weaponwant > WEP_LAST)\r
211                         weaponwant = WEP_FIRST;\r
212         }\r
213         self.switchweapon = weaponwant;\r
214 };\r
215 \r
216 void () Use_Function;\r
217 // Brought back weapon frame\r
218 void() W_WeaponFrame =\r
219 {\r
220         if (self.current_menu > 0)                              // calls the text menu display\r
221         {\r
222                 Player_Menu ();\r
223                 if ((self.impulse > 0) && (self.impulse < 11))\r
224                 {\r
225                         Menu_Input (self.impulse);\r
226                 }\r
227         }\r
228         if(self.buttonuse)\r
229                 Use_Function();         // for engineer and medic, though I'm putting this in engineer.c...\r
230 \r
231         if (self.button0 || self.button2 || self.button3  || self.button4)\r
232                 CheckTeamClass();\r
233         if (!self.weaponentity || self.health <= 0)\r
234                 return; // Dead player can't use weapons and injure impulse commands\r
235 \r
236         if (cvar("g_antilag"))\r
237         {\r
238                 // if aiming at a player and the original trace won't hit that player\r
239                 // anymore, try aiming at the player's new position\r
240                 if (self.cursor_trace_ent)\r
241                 {\r
242                         if (self.cursor_trace_ent.takedamage)\r
243                         {\r
244                                 traceline(self.origin + self.view_ofs, self.cursor_trace_endpos, FALSE, self);\r
245                                 if (trace_ent != self.cursor_trace_ent)\r
246                                 {\r
247                                         traceline(self.origin + self.view_ofs, self.cursor_trace_ent.origin + (self.cursor_trace_ent.mins + self.cursor_trace_ent.maxs) * 0.5, FALSE, self);\r
248                                         if (trace_ent == self.cursor_trace_ent)\r
249                                                 self.cursor_trace_endpos = trace_endpos;\r
250                                 }\r
251                         }\r
252                 }\r
253                 self.v_angle = vectoangles(self.cursor_trace_endpos - (self.origin + self.view_ofs));\r
254                 self.v_angle_x = 0 - self.v_angle_x;\r
255         }\r
256 \r
257         makevectors(self.v_angle);\r
258 \r
259         // Change weapon\r
260         if (self.weapon != self.switchweapon)\r
261         {\r
262                 //bprint("switching weapon: ");\r
263                 //bprint(ftos(self.weapon));\r
264                 //bprint(" --> ");\r
265                 //bprint(ftos(self.switchweapon));\r
266                 //bprint("\n");\r
267 \r
268                 //self.weaponentity.state = WS_CLEAR;\r
269                 if (self.weaponentity.state == WS_CLEAR)\r
270                 {\r
271                         //bprint("switching in\n");\r
272                         self.weaponentity.state = WS_RAISE;\r
273                         weapon_action(self.switchweapon, WR_SETUP);\r
274                         // VorteX: add player model weapon select frame here\r
275                         // setcustomframe(PlayerWeaponRaise);\r
276                         weapon_action(self.weapon, WR_UPDATECOUNTS);\r
277                         weapon_action(self.weapon, WR_RAISE);\r
278                 }\r
279                 else if (self.weaponentity.state == WS_READY)\r
280                 {\r
281                         //bprint("switching out\n");\r
282                         sound (self, CHAN_WEAPON, "weapons/weapon_switch.wav", 1, ATTN_NORM);\r
283                         self.weaponentity.state = WS_DROP;\r
284                         // VorteX: add player model weapon deselect frame here\r
285                         // setcustomframe(PlayerWeaponDrop);\r
286                         weapon_action(self.weapon, WR_DROP);\r
287                 }\r
288         }\r
289 \r
290         if (self.button0)\r
291                 weapon_action(self.weapon, WR_FIRE1);\r
292         if (self.button3)\r
293                 weapon_action(self.weapon, WR_FIRE2);\r
294 \r
295         // do weapon think\r
296         if (time >= self.weapon_nextthink)\r
297                 if (self.weapon_nextthink > 0)\r
298                         self.weapon_think();\r
299 \r
300         // weapon bobbing and script actions\r
301         local float bobintensity, q1pitching, framespeed, diff;\r
302         local vector vel, realorg, layer1, boblayer;\r
303 \r
304         bobintensity = cvar("g_viewweapon_bobintensity"); // weapon bob intensity\r
305         q1pitching = fabs(cvar("g_viewweapon_q1pitching")); // q1 style of "bob" when looking up and down\r
306 \r
307         realorg = self.weaponentity.origin + self.weaponentity.view_ofs;\r
308         realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position\r
309 \r
310         // VorteX: actually this is needed for weapon screen offset\r
311         if (q1pitching)\r
312         {\r
313                 self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5);\r
314                 self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5);\r
315         }\r
316 \r
317         // weapon origin interpolation, layer 1\r
318         if (realorg != self.weaponentity.pos1)\r
319         {\r
320                 framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1)\r
321                 diff = vlen(realorg - self.weaponentity.pos1);\r
322                 // VorteX: add speed modifier (haste)?\r
323                 layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg);\r
324                 if (diff <= vlen(layer1))\r
325                         layer1 = normalize(self.weaponentity.pos1 - realorg)*diff;\r
326         }\r
327 \r
328         // weapon bobbing (q3-style)\r
329         if (self.flags & FL_ONGROUND && self.waterlevel < 2)\r
330         {\r
331                 // VorteX: only xy velocity matters\r
332                 vel_x = self.velocity_x;\r
333                 vel_y = self.velocity_y;\r
334                 framespeed = vlen(vel);\r
335                 // Y axis\r
336                 diff = bobintensity*framespeed/300;\r
337                 self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10;\r
338                 boblayer_y = diff*cos(self.weaponentity.destvec_y + 90);\r
339                 // Z axis\r
340                 diff = bobintensity*framespeed/540;\r
341                 self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20;\r
342                 boblayer_z = diff*cos(self.weaponentity.destvec_z);\r
343                 self.weaponentity.finaldest = boblayer;\r
344         }\r
345         else if (self.waterlevel > 0)\r
346         {// swim, all velocity matters\r
347                 // X axis\r
348                 framespeed = vlen(self.velocity);\r
349                 diff = bobintensity*framespeed/100;\r
350                 self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6;\r
351                 boblayer_x = diff*cos(self.weaponentity.destvec_x);\r
352                 self.weaponentity.finaldest = boblayer;\r
353         }\r
354         else\r
355                 self.weaponentity.finaldest = '0 0 0';\r
356         self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;\r
357 };