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 // switch between weapons
26 void(float imp) W_SwitchWeapon
28 weapon_hasammo = TRUE;
29 if (!client_hasweapon(self, imp, TRUE))
32 sprint(self, "You don't have any ammo for that weapon\n");
34 sprint(self, "You don't own that weapon\n");
37 self.switchweapon = imp;
43 local float weaponwant;
45 weaponwant = self.weapon + 1;
46 weapon_hasammo = TRUE;
47 while(!client_hasweapon(self, weaponwant, TRUE))
49 weaponwant = weaponwant + 1;
50 if (weaponwant > WEP_LAST)
51 weaponwant = WEP_FIRST;
53 self.switchweapon = weaponwant;
57 void() W_PreviousWeapon =
59 local float weaponwant;
61 weaponwant = self.weapon - 1;
62 weapon_hasammo = TRUE;
63 while(!client_hasweapon(self, weaponwant, TRUE))
65 weaponwant = weaponwant - 1;
66 if (weaponwant < WEP_FIRST)
67 weaponwant = WEP_LAST;
69 self.switchweapon = weaponwant;
72 // Bringed back weapon frame
73 float JUMPBOUND_STARTSPEED = 120;
74 float JUMPBOUND_MAXAMP = 6;
75 float JUMPBOUND_MINAMP = 0.5;
76 void() W_WeaponFrame =
78 if (!self.weaponentity || self.health <= 0)
79 return; // Dead player can't use weapons and injure impulse commands
82 if (self.switchweapon > 0)
84 if (self.weapon == self.switchweapon)
85 self.switchweapon = FALSE; // same weapon
88 if (self.weaponentity.state == WS_CLEAR)
90 self.weaponentity.state = WS_RAISE;
91 weapon_action(self.switchweapon, WR_SETUP);
92 // VorteX: add player model weapon select frame here
93 // setcustomframe(PlayerWeaponRaise);
94 weapon_action(self.weapon, WR_UPDATECOUNTS);
95 weapon_action(self.weapon, WR_RAISE);
96 self.switchweapon = FALSE;
98 else if (self.weaponentity.state == WS_READY)
100 self.weaponentity.state = WS_DROP;
101 // VorteX: add player model weapon deselect frame here
102 // setcustomframe(PlayerWeaponDrop);
103 weapon_action(self.weapon, WR_DROP);
109 weapon_action(self.weapon, WR_FIRE1);
111 weapon_action(self.weapon, WR_FIRE2);
113 weapon_action(self.weapon, WR_FIRE3);
116 if (time >= self.weapon_nextthink)
117 if (self.weapon_nextthink > 0)
120 // weapon bobbing and script actions
121 local float bobintensity, q1pitching, framespeed, diff;
122 local vector vel, realorg, layer1, layer2, boblayer;
124 bobintensity = cvar("cl_weapon_bobintensity"); // weapon bob intensity
125 q1pitching = fabs(cvar("cl_weapon_q1pitching")); // q1 style of "bob" when looking up and down
127 realorg = self.weaponentity.origin + self.weaponentity.view_ofs;
128 realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position
130 // VorteX: actually this is needed for weapon screen offset
133 self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5);
134 self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5);
137 // weapon origin interpolation, layer 1
138 if (realorg != self.weaponentity.pos1)
140 framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1)
141 diff = vlen(realorg - self.weaponentity.pos1);
142 // VorteX: add speed modifier (haste)?
143 layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg);
144 if (diff <= vlen(layer1))
145 layer1 = normalize(self.weaponentity.pos1 - realorg)*diff;
148 // weapon bobbing (q3-style)
149 if (self.flags & FL_ONGROUND && self.waterlevel < 2)
151 // VorteX: only xy velocity matters
152 vel_x = self.velocity_x;
153 vel_y = self.velocity_y;
154 framespeed = vlen(vel);
156 diff = bobintensity*framespeed/300;
157 self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10;
158 boblayer_y = diff*cos(self.weaponentity.destvec_y + 90);
160 diff = bobintensity*framespeed/540;
161 self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20;
162 boblayer_z = diff*cos(self.weaponentity.destvec_z);
163 self.weaponentity.finaldest = boblayer;
165 else if (self.waterlevel > 0)
166 {// swim, all velocity matters
168 framespeed = vlen(self.velocity);
169 diff = bobintensity*framespeed/100;
170 self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6;
171 boblayer_x = diff*cos(self.weaponentity.destvec_x);
172 self.weaponentity.finaldest = boblayer;
174 self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;