]> icculus.org git repositories - divverent/nexuiz.git/blob - qcsrc/gamec/w_electro.c
Updating
[divverent/nexuiz.git] / qcsrc / gamec / w_electro.c
1 void() electro_ready_01;
2 void() electro_fire1_01;
3 void() electro_fire2_01;
4 void() electro_fire3_01;
5 void() electro_deselect_01;
6 void() electro_select_01;
7
8 float() electro_check = 
9 {
10         if (self.ammo_cells > 0) 
11                 return TRUE; 
12         return FALSE;
13 };
14
15 void(float req) w_electro =
16 {
17         if (req == WR_IDLE)
18                 electro_ready_01();
19         else if (req == WR_FIRE1)
20                 weapon_prepareattack(electro_check, electro_check, electro_fire1_01, 0.4);
21         else if (req == WR_FIRE2)
22                 weapon_prepareattack(electro_check, electro_check, electro_fire2_01, 2);
23         else if (req == WR_FIRE3)
24                 weapon_prepareattack(electro_check, electro_check, electro_fire3_01, 0.4);
25         else if (req == WR_RAISE)
26                 electro_select_01();
27         else if (req == WR_UPDATECOUNTS)
28                 self.currentammo = self.ammo_cells;
29         else if (req == WR_DROP)
30                 electro_deselect_01();
31         else if (req == WR_SETUP)
32                 weapon_setup(WEP_ELECTRO, "w_electro.zym", IT_CELLS);
33         else if (req == WR_CHECKAMMO)
34                 weapon_hasammo = electro_check();
35 };               
36
37
38 void W_Electro_Touch (void)
39 {
40         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
41         WriteByte (MSG_BROADCAST, 79);
42         WriteCoord (MSG_BROADCAST, self.origin_x);
43         WriteCoord (MSG_BROADCAST, self.origin_y);
44         WriteCoord (MSG_BROADCAST, self.origin_z);
45         WriteCoord (MSG_BROADCAST, 0);          // SeienAbunae: groan... Useless clutter
46         WriteCoord (MSG_BROADCAST, 0);          // Sajt: Yeah.. I agree with him
47         WriteCoord (MSG_BROADCAST, 0);
48         WriteByte (MSG_BROADCAST, 155);
49         self.event_damage = SUB_Null;
50         RadiusDamage (self, self.owner, 50, 10, 70, world, 50, IT_ELECTRO);
51         sound (self, CHAN_IMPACT, "weapons/plasmahit.wav", 1, ATTN_NORM);
52         remove (self);
53 }
54
55 void() W_Electro_Attack
56 {
57         entity  proj;
58         float postion;
59
60         postion = self.electrocount;
61         makevectors(self.v_angle);
62         sound (self, CHAN_WEAPON, "weapons/electro_fire.wav", 1, ATTN_NORM);
63
64         proj = spawn ();
65         proj.owner = self;
66         proj.classname = "spike";
67
68         proj.movetype = MOVETYPE_FLY; 
69         proj.solid = SOLID_BBOX;
70         proj.effects = 1;
71         
72         vector org;
73         org = self.origin + self.view_ofs + v_forward * 18 + v_right * 7 + v_up * -9;
74
75         te_smallflash(org);
76
77         //entity        flash;
78         //flash = spawn ();
79         //flash.drawonlytoclient;
80         //setorigin (flash, org);
81         //setmodel (flash, "models/flash.md3");
82         //flash.velocity = v_forward * 9;
83         //flash.angles = vectoangles (flash.velocity);
84         //SUB_SetFade (flash, time + 0 + random () * 4);
85
86         setmodel (proj, "models/elaser.mdl");
87         setsize (proj, '0 0 0', '0 0 0');
88         if (postion == 0)
89         setorigin (proj, self.origin + self.view_ofs + v_forward * 18 + v_right * 5 + v_up * -14);
90         if (postion == 1)
91         setorigin (proj, self.origin + self.view_ofs + v_forward * 18 + v_right * 10 + v_up * -12);
92         if (postion == 2)
93         setorigin (proj, self.origin + self.view_ofs + v_forward * 18 + v_right * 15 + v_up * -14);
94
95         proj.velocity = v_forward * 9999;
96         proj.touch = W_Electro_Touch;
97         proj.think = SUB_Remove;
98         proj.nextthink = time + 1.5;
99
100         proj.angles = vectoangles (proj.velocity);
101
102         proj.effects = proj.effects | EF_ADDITIVE;
103
104         self.attack_finished = time + 0.4;
105         self.ammo_cells = self.ammo_cells - 1;
106 }
107
108 void W_Plasma_Explode (entity ignore)
109 {
110         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
111         WriteByte (MSG_BROADCAST, 79);
112         WriteCoord (MSG_BROADCAST, self.origin_x);
113         WriteCoord (MSG_BROADCAST, self.origin_y);
114         WriteCoord (MSG_BROADCAST, self.origin_z);
115         WriteCoord (MSG_BROADCAST, 0);          // SeienAbunae: groan... Useless clutter
116         WriteCoord (MSG_BROADCAST, 0);
117         WriteCoord (MSG_BROADCAST, 0);
118         WriteByte (MSG_BROADCAST, 155);
119
120         te_customflash (self.origin, 5000, 10, '0 0 1');
121
122         self.event_damage = SUB_Null;
123         RadiusDamage (self, self.owner, 100, 50, 100, world, 50, IT_ELECTRO);
124         sound (self, CHAN_IMPACT, "weapons/plasmahit.wav", 1, ATTN_NORM);
125
126         remove (self);
127 }
128
129 void W_Plasma_Explode2 (entity ignore)
130 {
131         WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
132         WriteByte (MSG_BROADCAST, 79);
133         WriteCoord (MSG_BROADCAST, self.origin_x);
134         WriteCoord (MSG_BROADCAST, self.origin_y);
135         WriteCoord (MSG_BROADCAST, self.origin_z);
136         WriteCoord (MSG_BROADCAST, 0);          // SeienAbunae: groan... Useless clutter
137         WriteCoord (MSG_BROADCAST, 0);
138         WriteCoord (MSG_BROADCAST, 0);
139         WriteByte (MSG_BROADCAST, 155);
140
141         te_customflash (self.origin, 5000, 10, '0 0 1');
142
143         self.event_damage = SUB_Null;
144         RadiusDamage (self, self.owner, 150, 50, 150, world, 150, IT_ELECTRO);
145         sound (self, CHAN_IMPACT, "weapons/plasmahit.wav", 1, ATTN_NORM);
146
147         remove (self);
148 }
149
150 void W_Plasma_FuseExplode (void)
151 {
152         W_Plasma_Explode2 (world);
153 }
154
155 void W_Plasma_Touch (void)
156 {
157         if (other.classname == "player" || other.classname == "corpse")
158                 W_Plasma_Explode (other);
159         else
160                 sound (self, CHAN_BODY, "weapons/grenade_bounce.wav", 1, ATTN_NORM);
161 }
162
163 void W_Plasma_Damage (vector hitloc, float damage, entity inflictor, entity attacker, float deathtype)
164 {
165         self.health = self.health - damage;
166         if (self.health <= 0)
167                 W_Plasma_FuseExplode ();
168 }
169
170 void() W_Electro_Attack2
171 {
172         entity  Plasma;
173         float postion;
174
175         postion = self.electrocount;
176         makevectors(self.v_angle);
177         sound (self, CHAN_WEAPON, "weapons/electro_fire.wav", 1, ATTN_NORM);
178
179         self.punchangle_x = -4;
180
181         Plasma = spawn ();
182         Plasma.owner = self;
183         Plasma.classname = "grenade";
184         Plasma.effects = 1;
185
186         Plasma.movetype = MOVETYPE_BOUNCE;
187         Plasma.solid = SOLID_BBOX;
188         
189         vector org;
190         org = self.origin + self.view_ofs + v_forward * 18 + v_right * 7 + v_up * -9;
191         te_smallflash(org);
192
193         Plasma.takedamage = DAMAGE_YES;
194         Plasma.damageforcescale = 4;
195         Plasma.health = 5;
196         Plasma.event_damage = W_Plasma_Damage;
197
198         setmodel (Plasma, "models/elaser.mdl");
199         setsize (Plasma, '-6 -6 -3', '6 6 3');
200
201         if (postion == 0)
202         setorigin (Plasma, self.origin + self.view_ofs + v_forward * 18 + v_right * 0 + v_up * -14);
203         if (postion == 1)
204         setorigin (Plasma, self.origin + self.view_ofs + v_forward * 18 + v_right * 10 + v_up * -12);
205         if (postion == 2)
206         setorigin (Plasma, self.origin + self.view_ofs + v_forward * 18 + v_right * 20 + v_up * -14);
207
208         Plasma.velocity = v_forward * 900 + v_up * 200;
209         Plasma.angles = vectoangles (Plasma.velocity);
210         Plasma.avelocity = '0 0 0';
211
212         Plasma.touch = W_Plasma_Touch;
213         Plasma.think = W_Plasma_FuseExplode;
214         Plasma.nextthink = time + 2;
215
216         Plasma.effects = Plasma.effects | EF_ADDITIVE;
217
218         self.attack_finished = time + 1;
219         self.ammo_cells = self.ammo_cells - 2;
220
221 }
222
223 void() W_Electro_Attack3 
224 {
225         entity  proj;
226         vector org;
227         float postion;
228
229         postion = self.electrocount;
230         makevectors(self.v_angle);
231         sound (self, CHAN_WEAPON, "weapons/electro_fire.wav", 1, ATTN_NORM);
232
233         proj = spawn ();
234         proj.owner = self;
235         proj.classname = "spike";
236
237         proj.movetype = MOVETYPE_BOUNCEMISSILE; 
238         proj.solid = SOLID_BBOX;
239         proj.effects = 1;
240         
241         org = self.origin + self.view_ofs + v_forward * 18 + v_right * 7 + v_up * -9;
242         te_smallflash(org);
243
244         setmodel (proj, "models/bullet.mdl");
245         setsize (proj, '0 0 0', '0 0 0');
246         if (postion == 0)
247         setorigin (proj, self.origin + self.view_ofs + v_forward * 18 + v_right * 5 + v_up * -14);
248         if (postion == 1)
249         setorigin (proj, self.origin + self.view_ofs + v_forward * 18 + v_right * 10 + v_up * -12);
250         if (postion == 2)
251         setorigin (proj, self.origin + self.view_ofs + v_forward * 18 + v_right * 15 + v_up * -14);
252
253         proj.velocity = v_forward * 9999;
254         proj.think = W_Electro_Touch;
255         proj.nextthink = time + 8;
256
257         proj.effects = proj.effects | EF_ADDITIVE;
258
259         self.attack_finished = time + 0.4;
260         self.ammo_cells = self.ammo_cells - 1;
261
262 }
263
264
265 // weapon frames 
266
267 void()  electro_ready_01 =      {weapon_thinkf(WFRAME_IDLE, 0.1, electro_ready_01); self.weaponentity.state = WS_READY;};
268 void()  electro_select_01 =     {weapon_thinkf(-1, 0.3, w_ready); weapon_boblayer1(16, '0 0 0');};
269 void()  electro_deselect_01 =   {weapon_thinkf(-1, 0.3, w_clear); weapon_boblayer1(16, '0 20 -40');};
270 void()  electro_fire1_01 =      
271 {
272         weapon_doattack(electro_check, electro_check, W_Electro_Attack);
273         
274         self.electrocount = self.electrocount + 1;
275                 if (self.electrocount == 3)
276                         self.electrocount = 0;
277
278         weapon_thinkf(WFRAME_FIRE1, 0.3, electro_ready_01);
279 };
280 void()  electro_fire2_01 =      
281 {
282         weapon_doattack(electro_check, electro_check, W_Electro_Attack2);
283
284         self.electrocount = self.electrocount + 1;
285                 if (self.electrocount == 3)
286                         self.electrocount = 0;
287
288         weapon_thinkf(WFRAME_FIRE2, 0.3, electro_ready_01);
289 };
290 void()  electro_fire3_01 =      
291 {
292         weapon_doattack(electro_check, electro_check, W_Electro_Attack3);
293
294         self.electrocount = self.electrocount + 1;
295                 if (self.electrocount == 3)
296                         self.electrocount = 0;
297
298         weapon_thinkf(WFRAME_FIRE2, 0.3, electro_ready_01);
299 };