]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_weapons.c
Updating
[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 float   JUMPBOUND_STARTSPEED    = 120;
74 float   JUMPBOUND_MAXAMP                = 6;
75 float   JUMPBOUND_MINAMP                = 0.5;
76 void() W_WeaponFrame =
77 {
78         if (!self.weaponentity || self.health <= 0) 
79                 return; // Dead player can't use weapons and injure impulse commands
80         
81         // Change weapon
82         if (self.switchweapon > 0)
83         { 
84                 if (self.weapon == self.switchweapon)
85                         self.switchweapon = FALSE; // same weapon
86                 else
87                 {
88                         if (self.weaponentity.state == WS_CLEAR)
89                         {
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;
97                         }
98                         else if (self.weaponentity.state == WS_READY)
99                         {
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);
104                         }
105                 }
106         }
107
108         if (self.button0)
109                 weapon_action(self.weapon, WR_FIRE1);
110         if (self.button3)
111                 weapon_action(self.weapon, WR_FIRE2);
112         if (self.button4)
113                 weapon_action(self.weapon, WR_FIRE3);
114
115         // do weapon think
116         if (time >= self.weapon_nextthink)
117                 if (self.weapon_nextthink > 0)
118                         self.weapon_think();
119
120         // weapon bobbing and script actions
121         local float bobintensity, q1pitching, framespeed, diff;
122         local vector vel, realorg, layer1, layer2, boblayer;
123
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
126
127         realorg = self.weaponentity.origin + self.weaponentity.view_ofs;
128         realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position
129
130         // VorteX: actually this is needed for weapon screen offset
131         if (q1pitching)
132         {
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);
135         }
136
137         // weapon origin interpolation, layer 1
138         if (realorg != self.weaponentity.pos1)
139         {
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;
146         }
147
148         // weapon bobbing (q3-style)
149         if (self.flags & FL_ONGROUND && self.waterlevel < 2)
150         {
151                 // VorteX: only xy velocity matters
152                 vel_x = self.velocity_x;
153                 vel_y = self.velocity_y;
154                 framespeed = vlen(vel);
155                 // Y axis
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); 
159                 // Z axis
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;
164         }
165         else if (self.waterlevel > 0)
166         {// swim, all velocity matters
167                 // X axis 
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;
173         }
174         self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;
175 };