]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_weapons.c
More Vortex changes
[divverent/nexuiz.git] / qcsrc / gamec / cl_weapons.c
1 // generic weapons table
2 // add new weapons here
3 void(float wpn, float wrequest) weapon_action =
4 {
5         if (wpn == WEP_LASER)                           
6                 w_laser(wrequest);
7         else if (wpn == WEP_SHOTGUN) 
8                 w_shotgun(wrequest);
9         else if (wpn == WEP_UZI) 
10                 w_uzi(wrequest);
11         else if (wpn == WEP_GRENADE_LAUNCHER) 
12                 w_glauncher(wrequest);
13         else if (wpn == WEP_ELECTRO) 
14                 w_electro(wrequest);
15         else if (wpn == WEP_CRYLINK) 
16                 w_crylink(wrequest);
17         else if (wpn == WEP_NEX) 
18                 w_nex(wrequest);
19         else if (wpn == WEP_HAGAR) 
20                 w_hagar(wrequest);
21         else if (wpn == WEP_ROCKET_LAUNCHER) 
22                 w_rlauncher(wrequest);
23 };      
24
25 // switch between weapons 
26 void(float imp) W_SwitchWeapon 
27 {
28         weapon_hasammo = TRUE;
29         if (!client_hasweapon(self, imp, TRUE))
30         {
31                 if (!weapon_hasammo)
32                         sprint(self, "You don't have any ammo for that weapon\n");
33                 else
34                         sprint(self, "You don't own that weapon\n");
35         }
36         else
37                 self.switchweapon = imp;
38 };
39         
40 // next weapon
41 void() W_NextWeapon =
42 {
43         local float weaponwant;
44
45         weaponwant = self.weapon + 1;
46         weapon_hasammo = TRUE;
47         while(!client_hasweapon(self, weaponwant, TRUE))
48         {
49                 weaponwant = weaponwant + 1;
50                 if (weaponwant > WEP_LAST)
51                         weaponwant = WEP_FIRST;
52         }
53         self.switchweapon = weaponwant;
54 };
55
56 // prev weapon
57 void() W_PreviousWeapon =
58 {
59         local float weaponwant;
60
61         weaponwant = self.weapon - 1;
62         weapon_hasammo = TRUE;
63         while(!client_hasweapon(self, weaponwant, TRUE))
64         {
65                 weaponwant = weaponwant - 1;
66                 if (weaponwant < WEP_FIRST)
67                         weaponwant = WEP_LAST;
68         }
69         self.switchweapon = weaponwant;
70 };
71
72 // Bringed back weapon frame
73 void() W_WeaponFrame =
74 {
75         if (!self.weaponentity || self.health <= 0) 
76                 return; // Dead player can't use weapons and injure impulse commands
77         
78         // Change weapon
79         if (self.switchweapon > 0)
80         { 
81                 if (self.weapon == self.switchweapon)
82                         self.switchweapon = FALSE; // same weapon
83                 else
84                 {
85                         if (self.weaponentity.state == WS_CLEAR)
86                         {
87                                 self.weaponentity.state = WS_RAISE;
88                                 weapon_action(self.switchweapon, WR_SETUP);
89                                 // VorteX: add player model weapon select frame here
90                                 // setcustomframe(PlayerWeaponRaise);
91                                 weapon_action(self.weapon, WR_UPDATECOUNTS);
92                                 weapon_action(self.weapon, WR_RAISE);
93                                 self.switchweapon = FALSE;
94                         }
95                         else if (self.weaponentity.state == WS_READY)
96                         {
97                                 self.weaponentity.state = WS_DROP;
98                                 // VorteX: add player model weapon deselect frame here
99                                 // setcustomframe(PlayerWeaponDrop);
100                                 weapon_action(self.weapon, WR_DROP);
101                         }
102                 }
103         }
104
105         if (self.button0)
106                 weapon_action(self.weapon, WR_FIRE1);
107         if (self.button3)
108                 weapon_action(self.weapon, WR_FIRE2);
109         if (self.button4)
110                 weapon_action(self.weapon, WR_FIRE3);
111
112         // do weapon think
113         if (time >= self.weapon_nextthink)
114                 if (self.weapon_nextthink > 0)
115                         self.weapon_think();
116
117         // weapon bobbing and script actions
118         local float bobintensity, q1pitching, framespeed, diff;
119         local vector vel, realorg, layer1, layer2, boblayer;
120
121         bobintensity = cvar("cl_weapon_bobintensity"); // weapon bob intensity
122         q1pitching = fabs(cvar("cl_weapon_q1pitching")); // q1 style of "bob" when looking up and down
123
124         realorg = self.weaponentity.origin + self.weaponentity.view_ofs;
125         realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position
126
127         // VorteX: actually this is needed for weapon screen offset
128         if (q1pitching)
129         {
130                 self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5);
131                 self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5);
132         }
133
134         // weapon origin interpolation, layer 1
135         if (realorg != self.weaponentity.pos1)
136         {
137                 framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1)
138                 diff = vlen(realorg - self.weaponentity.pos1);
139                 // VorteX: add speed modifier (haste)?
140                 layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg);
141                 if (diff <= vlen(layer1))
142                         layer1 = normalize(self.weaponentity.pos1 - realorg)*diff;
143         }
144
145         // weapon bobbing (q3-style)
146         if (self.flags & FL_ONGROUND && self.waterlevel < 2)
147         {
148                 // VorteX: only xy velocity matters
149                 vel_x = self.velocity_x;
150                 vel_y = self.velocity_y;
151                 framespeed = vlen(vel);
152                 // Y axis
153                 diff = bobintensity*framespeed/300;
154                 self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10;
155                 boblayer_y = diff*cos(self.weaponentity.destvec_y + 90); 
156                 // Z axis
157                 diff = bobintensity*framespeed/540;
158                 self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20;
159                 boblayer_z = diff*cos(self.weaponentity.destvec_z); 
160                 self.weaponentity.finaldest = boblayer;
161         }
162         else if (self.waterlevel > 0)
163         {// swim, all velocity matters
164                 // X axis 
165                 framespeed = vlen(self.velocity);
166                 diff = bobintensity*framespeed/100;
167                 self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6;
168                 boblayer_x = diff*cos(self.weaponentity.destvec_x); 
169                 self.weaponentity.finaldest = boblayer;
170         }
171         self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;
172 };