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