]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_weapons.c
cleaned a lot of weapon code
[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.switchweapon + 1;
46         if (weaponwant < WEP_FIRST)
47                 weaponwant = WEP_LAST;
48         if (weaponwant > WEP_LAST)
49                 weaponwant = WEP_FIRST;
50         weapon_hasammo = TRUE;
51         while(!client_hasweapon(self, weaponwant, TRUE))
52         {
53                 weaponwant = weaponwant + 1;
54                 if (weaponwant < WEP_FIRST)
55                         weaponwant = WEP_LAST;
56                 if (weaponwant > WEP_LAST)
57                         weaponwant = WEP_FIRST;
58         }
59         self.switchweapon = weaponwant;
60 };
61
62 // prev weapon
63 void() W_PreviousWeapon =
64 {
65         local float weaponwant;
66
67         weaponwant = self.switchweapon - 1;
68         if (weaponwant < WEP_FIRST)
69                 weaponwant = WEP_LAST;
70         if (weaponwant > WEP_LAST)
71                 weaponwant = WEP_FIRST;
72         weapon_hasammo = TRUE;
73         while(!client_hasweapon(self, weaponwant, TRUE))
74         {
75                 weaponwant = weaponwant - 1;
76                 if (weaponwant < WEP_FIRST)
77                         weaponwant = WEP_LAST;
78                 if (weaponwant > WEP_LAST)
79                         weaponwant = WEP_FIRST;
80         }
81         self.switchweapon = weaponwant;
82 };
83
84 // Bringed back weapon frame
85 void() W_WeaponFrame =
86 {
87         if (!self.weaponentity || self.health <= 0)
88                 return; // Dead player can't use weapons and injure impulse commands
89
90         makevectors(self.v_angle);
91
92         // Change weapon
93         if (self.weapon != self.switchweapon)
94         {
95                 if (self.weaponentity.state == WS_CLEAR)
96                 {
97                         self.weaponentity.state = WS_RAISE;
98                         weapon_action(self.switchweapon, WR_SETUP);
99                         // VorteX: add player model weapon select frame here
100                         // setcustomframe(PlayerWeaponRaise);
101                         weapon_action(self.weapon, WR_UPDATECOUNTS);
102                         weapon_action(self.weapon, WR_RAISE);
103                 }
104                 else if (self.weaponentity.state == WS_READY)
105                 {
106                         sound (self, CHAN_WEAPON, "weapons/weapon_switch.wav", 1, ATTN_NORM);
107                         self.weaponentity.state = WS_DROP;
108                         // VorteX: add player model weapon deselect frame here
109                         // setcustomframe(PlayerWeaponDrop);
110                         weapon_action(self.weapon, WR_DROP);
111                 }
112         }
113
114         if (self.button0)
115                 weapon_action(self.weapon, WR_FIRE1);
116         if (self.button3)
117                 weapon_action(self.weapon, WR_FIRE2);
118
119         // do weapon think
120         if (time >= self.weapon_nextthink)
121                 if (self.weapon_nextthink > 0)
122                         self.weapon_think();
123
124         // weapon bobbing and script actions
125         local float bobintensity, q1pitching, framespeed, diff;
126         local vector vel, realorg, layer1, boblayer;
127
128         bobintensity = cvar("g_viewweapon_bobintensity"); // weapon bob intensity
129         q1pitching = fabs(cvar("g_viewweapon_q1pitching")); // q1 style of "bob" when looking up and down
130
131         realorg = self.weaponentity.origin + self.weaponentity.view_ofs;
132         realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position
133
134         // VorteX: actually this is needed for weapon screen offset
135         if (q1pitching)
136         {
137                 self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5);
138                 self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5);
139         }
140
141         // weapon origin interpolation, layer 1
142         if (realorg != self.weaponentity.pos1)
143         {
144                 framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1)
145                 diff = vlen(realorg - self.weaponentity.pos1);
146                 // VorteX: add speed modifier (haste)?
147                 layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg);
148                 if (diff <= vlen(layer1))
149                         layer1 = normalize(self.weaponentity.pos1 - realorg)*diff;
150         }
151
152         // weapon bobbing (q3-style)
153         if (self.flags & FL_ONGROUND && self.waterlevel < 2)
154         {
155                 // VorteX: only xy velocity matters
156                 vel_x = self.velocity_x;
157                 vel_y = self.velocity_y;
158                 framespeed = vlen(vel);
159                 // Y axis
160                 diff = bobintensity*framespeed/300;
161                 self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10;
162                 boblayer_y = diff*cos(self.weaponentity.destvec_y + 90);
163                 // Z axis
164                 diff = bobintensity*framespeed/540;
165                 self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20;
166                 boblayer_z = diff*cos(self.weaponentity.destvec_z);
167                 self.weaponentity.finaldest = boblayer;
168         }
169         else if (self.waterlevel > 0)
170         {// swim, all velocity matters
171                 // X axis
172                 framespeed = vlen(self.velocity);
173                 diff = bobintensity*framespeed/100;
174                 self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6;
175                 boblayer_x = diff*cos(self.weaponentity.destvec_x);
176                 self.weaponentity.finaldest = boblayer;
177         }
178         else
179                 self.weaponentity.finaldest = '0 0 0';
180         self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;
181 };