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