]> icculus.org git repositories - divverent/nexuiz.git/blob - TeamNexuiz/game/gamec/cl_weapons.c
Added a Game C folder
[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 // switch between weapons\r
124 void(float imp) W_SwitchWeapon\r
125 {\r
126 /*      if (self.reload_time > time - .1)\r
127         {\r
128                 return;\r
129         }*/\r
130         weapon_hasammo = TRUE;\r
131         if (!client_hasweapon(self, imp, TRUE))\r
132         {\r
133                 if (!weapon_hasammo)\r
134                         sprint(self, "You don't have any ammo for that weapon\n");\r
135                 else\r
136                         sprint(self, "You don't own that weapon\n");\r
137         }\r
138         else\r
139                 self.switchweapon = imp;\r
140 };\r
141 \r
142 // next weapon\r
143 void() W_NextWeapon =\r
144 {\r
145         local float weaponwant, i;\r
146 \r
147         weaponwant = self.switchweapon + 1;\r
148         if (weaponwant < WEP_FIRST)\r
149                 weaponwant = WEP_LAST;\r
150         if (weaponwant > WEP_LAST)\r
151                 weaponwant = WEP_FIRST;\r
152         weapon_hasammo = TRUE;\r
153         i = 0;\r
154         while(!client_hasweapon(self, weaponwant, TRUE))\r
155         {\r
156                 i = i + 1;\r
157                 if(i >= 20)\r
158                         return; // failed; there's probably some weird problem causing an infinite loop\r
159                 weaponwant = weaponwant + 1;\r
160                 if (weaponwant < WEP_FIRST)\r
161                         weaponwant = WEP_LAST;\r
162                 if (weaponwant > WEP_LAST)\r
163                         weaponwant = WEP_FIRST;\r
164         }\r
165         self.switchweapon = weaponwant;\r
166 };\r
167 \r
168 // prev weapon\r
169 void() W_PreviousWeapon =\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 // Brought back weapon frame\r
195 void() W_WeaponFrame =\r
196 {\r
197         if (!self.weaponentity || self.health <= 0)\r
198                 return; // Dead player can't use weapons and injure impulse commands\r
199 \r
200         if (cvar("g_antilag"))\r
201         {\r
202                 // if aiming at a player and the original trace won't hit that player\r
203                 // anymore, try aiming at the player's new position\r
204                 if (self.cursor_trace_ent)\r
205                 {\r
206                         if (self.cursor_trace_ent.takedamage)\r
207                         {\r
208                                 traceline(self.origin + self.view_ofs, self.cursor_trace_endpos, FALSE, self);\r
209                                 if (trace_ent != self.cursor_trace_ent)\r
210                                 {\r
211                                         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
212                                         if (trace_ent == self.cursor_trace_ent)\r
213                                                 self.cursor_trace_endpos = trace_endpos;\r
214                                 }\r
215                         }\r
216                 }\r
217                 self.v_angle = vectoangles(self.cursor_trace_endpos - (self.origin + self.view_ofs));\r
218                 self.v_angle_x = 0 - self.v_angle_x;\r
219         }\r
220 \r
221         makevectors(self.v_angle);\r
222 \r
223         // Change weapon\r
224         if (self.weapon != self.switchweapon)\r
225         {\r
226                 //bprint("switching weapon: ");\r
227                 //bprint(ftos(self.weapon));\r
228                 //bprint(" --> ");\r
229                 //bprint(ftos(self.switchweapon));\r
230                 //bprint("\n");\r
231 \r
232                 //self.weaponentity.state = WS_CLEAR;\r
233                 if (self.weaponentity.state == WS_CLEAR)\r
234                 {\r
235                         //bprint("switching in\n");\r
236                         self.weaponentity.state = WS_RAISE;\r
237                         weapon_action(self.switchweapon, WR_SETUP);\r
238                         // VorteX: add player model weapon select frame here\r
239                         // setcustomframe(PlayerWeaponRaise);\r
240                         weapon_action(self.weapon, WR_UPDATECOUNTS);\r
241                         weapon_action(self.weapon, WR_RAISE);\r
242                 }\r
243                 else if (self.weaponentity.state == WS_READY)\r
244                 {\r
245                         //bprint("switching out\n");\r
246                         sound (self, CHAN_WEAPON, "weapons/weapon_switch.wav", 1, ATTN_NORM);\r
247                         self.weaponentity.state = WS_DROP;\r
248                         // VorteX: add player model weapon deselect frame here\r
249                         // setcustomframe(PlayerWeaponDrop);\r
250                         weapon_action(self.weapon, WR_DROP);\r
251                 }\r
252         }\r
253 \r
254         if (self.button0)\r
255                 weapon_action(self.weapon, WR_FIRE1);\r
256         if (self.button3)\r
257                 weapon_action(self.weapon, WR_FIRE2);\r
258 \r
259         // do weapon think\r
260         if (time >= self.weapon_nextthink)\r
261                 if (self.weapon_nextthink > 0)\r
262                         self.weapon_think();\r
263 \r
264         // weapon bobbing and script actions\r
265         local float bobintensity, q1pitching, framespeed, diff;\r
266         local vector vel, realorg, layer1, boblayer;\r
267 \r
268         bobintensity = cvar("g_viewweapon_bobintensity"); // weapon bob intensity\r
269         q1pitching = fabs(cvar("g_viewweapon_q1pitching")); // q1 style of "bob" when looking up and down\r
270 \r
271         realorg = self.weaponentity.origin + self.weaponentity.view_ofs;\r
272         realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position\r
273 \r
274         // VorteX: actually this is needed for weapon screen offset\r
275         if (q1pitching)\r
276         {\r
277                 self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5);\r
278                 self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5);\r
279         }\r
280 \r
281         // weapon origin interpolation, layer 1\r
282         if (realorg != self.weaponentity.pos1)\r
283         {\r
284                 framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1)\r
285                 diff = vlen(realorg - self.weaponentity.pos1);\r
286                 // VorteX: add speed modifier (haste)?\r
287                 layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg);\r
288                 if (diff <= vlen(layer1))\r
289                         layer1 = normalize(self.weaponentity.pos1 - realorg)*diff;\r
290         }\r
291 \r
292         // weapon bobbing (q3-style)\r
293         if (self.flags & FL_ONGROUND && self.waterlevel < 2)\r
294         {\r
295                 // VorteX: only xy velocity matters\r
296                 vel_x = self.velocity_x;\r
297                 vel_y = self.velocity_y;\r
298                 framespeed = vlen(vel);\r
299                 // Y axis\r
300                 diff = bobintensity*framespeed/300;\r
301                 self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10;\r
302                 boblayer_y = diff*cos(self.weaponentity.destvec_y + 90);\r
303                 // Z axis\r
304                 diff = bobintensity*framespeed/540;\r
305                 self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20;\r
306                 boblayer_z = diff*cos(self.weaponentity.destvec_z);\r
307                 self.weaponentity.finaldest = boblayer;\r
308         }\r
309         else if (self.waterlevel > 0)\r
310         {// swim, all velocity matters\r
311                 // X axis\r
312                 framespeed = vlen(self.velocity);\r
313                 diff = bobintensity*framespeed/100;\r
314                 self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6;\r
315                 boblayer_x = diff*cos(self.weaponentity.destvec_x);\r
316                 self.weaponentity.finaldest = boblayer;\r
317         }\r
318         else\r
319                 self.weaponentity.finaldest = '0 0 0';\r
320         self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;\r
321 };