]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/cl_weapons.c
Simple respawn effect for items
[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         // Change weapon
91         if (self.weapon != self.switchweapon)
92         {
93                 if (self.weaponentity.state == WS_CLEAR)
94                 {
95                         self.weaponentity.state = WS_RAISE;
96                         weapon_action(self.switchweapon, WR_SETUP);
97                         // VorteX: add player model weapon select frame here
98                         // setcustomframe(PlayerWeaponRaise);
99                         weapon_action(self.weapon, WR_UPDATECOUNTS);
100                         weapon_action(self.weapon, WR_RAISE);
101                 }
102                 else if (self.weaponentity.state == WS_READY)
103                 {
104                         sound (self, CHAN_WEAPON, "weapons/weapon_switch.wav", 1, ATTN_NORM);
105                         self.weaponentity.state = WS_DROP;
106                         // VorteX: add player model weapon deselect frame here
107                         // setcustomframe(PlayerWeaponDrop);
108                         weapon_action(self.weapon, WR_DROP);
109                 }
110         }
111
112         if (self.button0)
113                 weapon_action(self.weapon, WR_FIRE1);
114         if (self.button3)
115                 weapon_action(self.weapon, WR_FIRE2);
116
117         // do weapon think
118         if (time >= self.weapon_nextthink)
119                 if (self.weapon_nextthink > 0)
120                         self.weapon_think();
121
122         // weapon bobbing and script actions
123         local float bobintensity, q1pitching, framespeed, diff;
124         local vector vel, realorg, layer1, layer2, boblayer;
125
126         bobintensity = cvar("g_viewweapon_bobintensity"); // weapon bob intensity
127         q1pitching = fabs(cvar("g_viewweapon_q1pitching")); // q1 style of "bob" when looking up and down
128
129         realorg = self.weaponentity.origin + self.weaponentity.view_ofs;
130         realorg = realorg - self.weaponentity.finaldest; // finaldest is last bob position
131
132         // VorteX: actually this is needed for weapon screen offset
133         if (q1pitching)
134         {
135                 self.weaponentity.view_ofs_x = q1pitching*bound(-5.5, self.v_angle_x/45, 5.5);
136                 self.weaponentity.view_ofs_z = q1pitching*bound(-1.5, self.v_angle_x/60, 1.5);
137         }
138
139         // weapon origin interpolation, layer 1
140         if (realorg != self.weaponentity.pos1)
141         {
142                 framespeed = frametime*self.weaponentity.lip*10; // lip is speed of origin changing (of layer1)
143                 diff = vlen(realorg - self.weaponentity.pos1);
144                 // VorteX: add speed modifier (haste)?
145                 layer1 = frametime*10*self.weaponentity.lip*normalize(self.weaponentity.pos1 - realorg);
146                 if (diff <= vlen(layer1))
147                         layer1 = normalize(self.weaponentity.pos1 - realorg)*diff;
148         }
149
150         // weapon bobbing (q3-style)
151         if (self.flags & FL_ONGROUND && self.waterlevel < 2)
152         {
153                 // VorteX: only xy velocity matters
154                 vel_x = self.velocity_x;
155                 vel_y = self.velocity_y;
156                 framespeed = vlen(vel);
157                 // Y axis
158                 diff = bobintensity*framespeed/300;
159                 self.weaponentity.destvec_y = self.weaponentity.destvec_y + frametime*10;
160                 boblayer_y = diff*cos(self.weaponentity.destvec_y + 90);
161                 // Z axis
162                 diff = bobintensity*framespeed/540;
163                 self.weaponentity.destvec_z = self.weaponentity.destvec_z + frametime*20;
164                 boblayer_z = diff*cos(self.weaponentity.destvec_z);
165                 self.weaponentity.finaldest = boblayer;
166         }
167         else if (self.waterlevel > 0)
168         {// swim, all velocity matters
169                 // X axis
170                 framespeed = vlen(self.velocity);
171                 diff = bobintensity*framespeed/100;
172                 self.weaponentity.destvec_x = self.weaponentity.destvec_x + frametime*6;
173                 boblayer_x = diff*cos(self.weaponentity.destvec_x);
174                 self.weaponentity.finaldest = boblayer;
175         }
176         else
177                 self.weaponentity.finaldest = '0 0 0';
178         self.weaponentity.origin = realorg + boblayer + layer1 - self.weaponentity.view_ofs;
179 };