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