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