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