1 // generic weapons table
2 // add new weapons here
3 void(float wpn, float wrequest) weapon_action =
7 else if (wpn == WEP_SHOTGUN)
9 else if (wpn == WEP_UZI)
11 else if (wpn == WEP_GRENADE_LAUNCHER)
12 w_glauncher(wrequest);
13 else if (wpn == WEP_ELECTRO)
15 else if (wpn == WEP_CRYLINK)
17 else if (wpn == WEP_NEX)
19 else if (wpn == WEP_HAGAR)
21 else if (wpn == WEP_ROCKET_LAUNCHER)
22 w_rlauncher(wrequest);
25 // think function for tossed weapons
26 void() thrown_wep_think
28 self.solid = SOLID_TRIGGER;
30 SUB_SetFade(self, time + 20, 1);
31 setorigin(self, self.origin);
34 // toss current weapon
44 setorigin(wep, e.origin);
45 makevectors(e.angles);
46 wep.classname = "droppedweapon";
47 wep.velocity = e.velocity * 0.5 + v_forward * 750;
48 SUB_SetFade(wep, time + 20, 1);
59 ammo = min(e.ammo_shells, wep.ammo_shells);
60 wep.ammo_shells = ammo;
61 e.ammo_shells -= ammo;
72 ammo = min(e.ammo_nails, wep.ammo_nails);
73 wep.ammo_nails = ammo;
76 else if(w == WEP_GRENADE_LAUNCHER)
78 w = IT_GRENADE_LAUNCHER;
84 weapon_grenadelauncher();
85 ammo = min(e.ammo_rockets, wep.ammo_rockets);
86 wep.ammo_rockets = ammo;
87 e.ammo_rockets -= ammo;
89 else if(w == WEP_ELECTRO)
98 ammo = min(e.ammo_cells, wep.ammo_cells);
99 wep.ammo_cells = ammo;
100 e.ammo_cells -= ammo;
102 else if(w == WEP_CRYLINK)
111 ammo = min(e.ammo_cells, wep.ammo_cells);
112 wep.ammo_cells = ammo;
113 e.ammo_cells -= ammo;
115 else if(w == WEP_NEX)
124 ammo = min(e.ammo_cells, wep.ammo_cells);
125 wep.ammo_cells = ammo;
126 e.ammo_cells -= ammo;
128 else if(w == WEP_HAGAR)
137 ammo = min(e.ammo_rockets, wep.ammo_rockets);
138 wep.ammo_rockets = ammo;
139 e.ammo_rockets -= ammo;
141 else if(w == WEP_ROCKET_LAUNCHER)
143 w = IT_ROCKET_LAUNCHER;
149 weapon_rocketlauncher();
150 ammo = min(e.ammo_rockets, wep.ammo_rockets);
151 wep.ammo_rockets = ammo;
152 e.ammo_rockets -= ammo;
156 sprint(e, strcat("You dropped the ^2", wep.netname, "\n"));
158 setorigin(wep, wep.origin);
159 wep.nextthink = time + 0.5;
160 wep.think = thrown_wep_think;
161 wep.classname = "droppedweapon";
162 e.items = e.items - (e.items & w);
163 e.switchweapon = w_getbestweapon(e);
164 if (e.switchweapon != e.weapon)
169 // switch between weapons
170 void(float imp) W_SwitchWeapon
172 weapon_hasammo = TRUE;
173 if (!client_hasweapon(self, imp, TRUE))
176 sprint(self, "You don't have any ammo for that weapon\n");
178 sprint(self, "You don't own that weapon\n");
182 self.cnt = self.weapon;
183 self.switchweapon = imp;
188 void() W_NextWeapon =
190 local float weaponwant, maxtries;
194 weaponwant = self.switchweapon + 1;
195 if (weaponwant < WEP_FIRST)
196 weaponwant = WEP_LAST;
197 if (weaponwant > WEP_LAST)
198 weaponwant = WEP_FIRST;
199 weapon_hasammo = TRUE;
200 while(!client_hasweapon(self, weaponwant, TRUE))
206 weaponwant = weaponwant + 1;
207 if (weaponwant < WEP_FIRST)
208 weaponwant = WEP_LAST;
209 if (weaponwant > WEP_LAST)
210 weaponwant = WEP_FIRST;
212 self.cnt = self.weapon;
213 self.switchweapon = weaponwant;
217 void() W_PreviousWeapon =
219 local float weaponwant, maxtries;
223 weaponwant = self.switchweapon - 1;
224 if (weaponwant < WEP_FIRST)
225 weaponwant = WEP_LAST;
226 if (weaponwant > WEP_LAST)
227 weaponwant = WEP_FIRST;
228 weapon_hasammo = TRUE;
229 while(!client_hasweapon(self, weaponwant, TRUE))
235 weaponwant = weaponwant - 1;
236 if (weaponwant < WEP_FIRST)
237 weaponwant = WEP_LAST;
238 if (weaponwant > WEP_LAST)
239 weaponwant = WEP_FIRST;
241 self.cnt = self.weapon;
242 self.switchweapon = weaponwant;
245 // Bringed back weapon frame
246 void() W_WeaponFrame =
248 if (!self.weaponentity || self.health <= 0)
249 return; // Dead player can't use weapons and injure impulse commands
251 makevectors(self.v_angle);
254 if (self.weapon != self.switchweapon)
256 if (self.weaponentity.state == WS_CLEAR)
258 self.weaponentity.state = WS_RAISE;
259 weapon_action(self.switchweapon, WR_SETUP);
260 // VorteX: add player model weapon select frame here
261 // setcustomframe(PlayerWeaponRaise);
262 weapon_action(self.weapon, WR_UPDATECOUNTS);
263 weapon_action(self.weapon, WR_RAISE);
265 else if (self.weaponentity.state == WS_READY)
267 sound (self, CHAN_WEAPON, "weapons/weapon_switch.ogg", 1, ATTN_NORM);
268 self.weaponentity.state = WS_DROP;
269 // VorteX: add player model weapon deselect frame here
270 // setcustomframe(PlayerWeaponDrop);
271 weapon_action(self.weapon, WR_DROP);
276 weapon_action(self.weapon, WR_FIRE1);
278 weapon_action(self.weapon, WR_FIRE2);
281 if (time >= self.weapon_nextthink)
282 if (self.weapon_nextthink > 0)
285 // weapon bobbing and script actions
286 local float bobintensity, q1pitching, framespeed, diff;
287 local vector vel, realorg, layer1, boblayer;
289 bobintensity = cvar("g_viewweapon_bobintensity"); // weapon bob intensity
290 q1pitching = fabs(cvar("g_viewweapon_q1pitching")); // q1 style of "bob" when looking up and down
292 realorg = self.weaponentity.origin + self.weaponentity.view_ofs;
293 realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position
295 // VorteX: actually this is needed for weapon screen offset
298 self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5);
299 self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5);
302 // weapon origin interpolation, layer 1
303 if (realorg != self.weaponentity.pos1)
305 framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1)
306 diff = vlen(realorg - self.weaponentity.pos1);
307 // VorteX: add speed modifier (haste)?
308 layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg);
309 if (diff <= vlen(layer1))
310 layer1 = normalize(self.weaponentity.pos1 - realorg)*diff;
313 // weapon bobbing (q3-style)
314 if (self.flags & FL_ONGROUND && self.waterlevel < 2)
316 // VorteX: only xy velocity matters
317 vel_x = self.velocity_x;
318 vel_y = self.velocity_y;
319 framespeed = vlen(vel);
321 diff = bobintensity*framespeed/300;
322 self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10;
323 boblayer_y = diff*cos(self.weaponentity.destvec_y + 90);
325 diff = bobintensity*framespeed/540;
326 self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20;
327 boblayer_z = diff*cos(self.weaponentity.destvec_z);
328 self.weaponentity.finaldest = boblayer;
330 else if (self.waterlevel > 0)
331 {// swim, all velocity matters
333 framespeed = vlen(self.velocity);
334 diff = bobintensity*framespeed/100;
335 self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6;
336 boblayer_x = diff*cos(self.weaponentity.destvec_x);
337 self.weaponentity.finaldest = boblayer;
340 self.weaponentity.finaldest = '0 0 0';
341 self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;