1 // generic weapons table
2 // add new weapons here
3 void(float wpn, float wrequest) weapon_action =
5 if (cvar("g_minstagib"))
14 else if (wpn == WEP_SHOTGUN)
16 else if (wpn == WEP_UZI)
18 else if (wpn == WEP_GRENADE_LAUNCHER)
19 w_glauncher(wrequest);
20 else if (wpn == WEP_ELECTRO)
22 else if (wpn == WEP_CRYLINK)
24 else if (wpn == WEP_NEX)
26 else if (wpn == WEP_HAGAR)
28 else if (wpn == WEP_ROCKET_LAUNCHER)
29 w_rlauncher(wrequest);
32 // switch between weapons
33 void(float imp) W_SwitchWeapon
35 weapon_hasammo = TRUE;
36 if (!client_hasweapon(self, imp, TRUE))
39 sprint(self, "You don't have any ammo for that weapon\n");
41 sprint(self, "You don't own that weapon\n");
44 self.switchweapon = imp;
50 local float weaponwant;
52 weaponwant = self.switchweapon + 1;
53 if (weaponwant < WEP_FIRST)
54 weaponwant = WEP_LAST;
55 if (weaponwant > WEP_LAST)
56 weaponwant = WEP_FIRST;
57 weapon_hasammo = TRUE;
58 while(!client_hasweapon(self, weaponwant, TRUE))
60 weaponwant = weaponwant + 1;
61 if (weaponwant < WEP_FIRST)
62 weaponwant = WEP_LAST;
63 if (weaponwant > WEP_LAST)
64 weaponwant = WEP_FIRST;
66 self.switchweapon = weaponwant;
70 void() W_PreviousWeapon =
72 local float weaponwant;
74 weaponwant = self.switchweapon - 1;
75 if (weaponwant < WEP_FIRST)
76 weaponwant = WEP_LAST;
77 if (weaponwant > WEP_LAST)
78 weaponwant = WEP_FIRST;
79 weapon_hasammo = TRUE;
80 while(!client_hasweapon(self, weaponwant, TRUE))
82 weaponwant = weaponwant - 1;
83 if (weaponwant < WEP_FIRST)
84 weaponwant = WEP_LAST;
85 if (weaponwant > WEP_LAST)
86 weaponwant = WEP_FIRST;
88 self.switchweapon = weaponwant;
91 // Bringed back weapon frame
92 void() W_WeaponFrame =
94 if (!self.weaponentity || self.health <= 0)
95 return; // Dead player can't use weapons and injure impulse commands
97 if (cvar("g_antilag"))
99 // if aiming at a player and the original trace won't hit that player
100 // anymore, try aiming at the player's new position
101 if (self.cursor_trace_ent)
103 if (self.cursor_trace_ent.takedamage)
105 traceline(self.origin + self.view_ofs, self.cursor_trace_endpos, FALSE, self);
106 if (trace_ent != self.cursor_trace_ent)
108 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);
109 if (trace_ent == self.cursor_trace_ent)
110 self.cursor_trace_endpos = trace_endpos;
114 self.v_angle = vectoangles(self.cursor_trace_endpos - (self.origin + self.view_ofs));
115 self.v_angle_x = 0 - self.v_angle_x;
118 makevectors(self.v_angle);
121 if (self.weapon != self.switchweapon)
123 if (self.weaponentity.state == WS_CLEAR)
125 self.weaponentity.state = WS_RAISE;
126 weapon_action(self.switchweapon, WR_SETUP);
127 // VorteX: add player model weapon select frame here
128 // setcustomframe(PlayerWeaponRaise);
129 weapon_action(self.weapon, WR_UPDATECOUNTS);
130 weapon_action(self.weapon, WR_RAISE);
132 else if (self.weaponentity.state == WS_READY)
134 sound (self, CHAN_WEAPON, "weapons/weapon_switch.wav", 1, ATTN_NORM);
135 self.weaponentity.state = WS_DROP;
136 // VorteX: add player model weapon deselect frame here
137 // setcustomframe(PlayerWeaponDrop);
138 weapon_action(self.weapon, WR_DROP);
143 weapon_action(self.weapon, WR_FIRE1);
145 weapon_action(self.weapon, WR_FIRE2);
148 if (time >= self.weapon_nextthink)
149 if (self.weapon_nextthink > 0)
152 // weapon bobbing and script actions
153 local float bobintensity, q1pitching, framespeed, diff;
154 local vector vel, realorg, layer1, boblayer;
156 bobintensity = cvar("g_viewweapon_bobintensity"); // weapon bob intensity
157 q1pitching = fabs(cvar("g_viewweapon_q1pitching")); // q1 style of "bob" when looking up and down
159 realorg = self.weaponentity.origin + self.weaponentity.view_ofs;
160 realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position
162 // VorteX: actually this is needed for weapon screen offset
165 self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5);
166 self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5);
169 // weapon origin interpolation, layer 1
170 if (realorg != self.weaponentity.pos1)
172 framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1)
173 diff = vlen(realorg - self.weaponentity.pos1);
174 // VorteX: add speed modifier (haste)?
175 layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg);
176 if (diff <= vlen(layer1))
177 layer1 = normalize(self.weaponentity.pos1 - realorg)*diff;
180 // weapon bobbing (q3-style)
181 if (self.flags & FL_ONGROUND && self.waterlevel < 2)
183 // VorteX: only xy velocity matters
184 vel_x = self.velocity_x;
185 vel_y = self.velocity_y;
186 framespeed = vlen(vel);
188 diff = bobintensity*framespeed/300;
189 self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10;
190 boblayer_y = diff*cos(self.weaponentity.destvec_y + 90);
192 diff = bobintensity*framespeed/540;
193 self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20;
194 boblayer_z = diff*cos(self.weaponentity.destvec_z);
195 self.weaponentity.finaldest = boblayer;
197 else if (self.waterlevel > 0)
198 {// swim, all velocity matters
200 framespeed = vlen(self.velocity);
201 diff = bobintensity*framespeed/100;
202 self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6;
203 boblayer_x = diff*cos(self.weaponentity.destvec_x);
204 self.weaponentity.finaldest = boblayer;
207 self.weaponentity.finaldest = '0 0 0';
208 self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;