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