2 float generator_precached;
5 vector randompos(vector m1, vector m2)
9 v_x = m2_x * random() + m1_x;
10 v_y = m2_y * random() + m1_y;
11 v_z = m2_z * random() + m1_z;
15 void generator_precache()
17 if(generator_precached)
18 return; // already precached
20 precache_model("models/onslaught/generator.md3");
21 precache_model("models/onslaught/generator_dead.md3");
22 precache_model("models/onslaught/generator_dmg1.md3");
23 precache_model("models/onslaught/generator_dmg2.md3");
24 precache_model("models/onslaught/generator_dmg3.md3");
25 precache_model("models/onslaught/generator_dmg4.md3");
26 precache_model("models/onslaught/generator_dmg5.md3");
27 precache_model("models/onslaught/generator_dmg6.md3");
28 precache_model("models/onslaught/generator_dmg7.md3");
29 precache_model("models/onslaught/generator_dmg8.md3");
30 precache_model("models/onslaught/generator_dmg9.md3");
31 precache_model("models/onslaught/generator_dead.md3");
33 precache_model("models/onslaught/ons_ray.md3");
34 precache_sound("onslaught/shockwave.wav");
35 precache_sound("weapons/grenade_impact.wav");
36 precache_sound("weapons/rocket_impact.wav");
38 precache_model("models/onslaught/gen_gib1.md3");
39 precache_model("models/onslaught/gen_gib2.md3");
40 precache_model("models/onslaught/gen_gib3.md3");
42 generator_precached = TRUE;
45 void ons_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
47 self.velocity = self.velocity + vforce;
51 void ons_throwgib_think()
55 self.nextthink = time + 0.05;
57 d = self.giblifetime - time;
61 self.think = SUB_Remove;
69 pointparticles(particleeffectnum("onslaught_generator_gib_flame"), self.origin, '0 0 0', 1);
72 void ons_throwgib(vector v_from, vector v_to, string smodel, float f_lifetime, float b_burn)
78 setmodel(gib, smodel);
79 setorigin(gib, v_from);
80 gib.solid = SOLID_CORPSE;
81 gib.movetype = MOVETYPE_BOUNCE;
84 gib.giblifetime = time + f_lifetime;
88 gib.think = ons_throwgib_think;
89 gib.nextthink = time + 0.05;
93 gib.think = SUB_Remove;
94 gib.nextthink = time + gib.giblifetime;
98 void onslaught_generator_ray_think()
100 self.nextthink = time + 0.05;
103 self.think = SUB_Remove;
116 void onslaught_generator_ray_spawn(vector org)
120 setmodel(e, "models/onslaught/ons_ray.md3");
122 e.angles = randomvec() * 360;
124 e.scale = random() * 5 + 8;
125 e.think = onslaught_generator_ray_think;
126 e.nextthink = time + 0.05;
129 void generator_draw()
134 if(time < self.move_time)
143 if(self.count==40||self.count==20)
144 sound(self, CH_TRIGGER, "onslaught/shockwave.wav", VOL_BASE, ATTN_NORM);
151 ons_throwgib(self.origin + '0 0 40', (100 * randomvec() - '1 1 1') * 11 + '0 0 20', "models/onslaught/gen_gib1.md3", 6, TRUE);
153 ons_throwgib(self.origin + '0 0 40', (100 * randomvec() - '1 1 1') * 12 + '0 0 20', "models/onslaught/gen_gib2.md3", 6, TRUE);
155 ons_throwgib(self.origin + '0 0 40', (100 * randomvec() - '1 1 1') * 13 + '0 0 20', "models/onslaught/gen_gib3.md3", 6, TRUE);
161 org = self.origin + randompos('-30 -30 -30' * i + '0 0 -20', '30 30 30' * i + '0 0 20');
162 pointparticles(particleeffectnum("onslaught_generator_gib_explode"), org, '0 0 0', 1);
165 // Short explosion sound + small explosion
168 te_explosion(self.origin);
169 sound(self, CH_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
173 org = self.origin + randompos(self.mins + '8 8 8', self.maxs + '-8 -8 -8');
174 pointparticles(particleeffectnum("onslaught_generator_smallexplosion"), org, '0 0 0', 1);
179 onslaught_generator_ray_spawn(self.origin);
187 pointparticles(particleeffectnum("onslaught_generator_finalexplosion"), org, '0 0 0', 1);
188 sound(self, CH_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
191 self.move_time = time + 0.05;
197 void generator_damage(float hp)
200 setmodel(self, "models/onslaught/generator_dead.md3");
201 else if(hp < self.max_health * 0.10)
202 setmodel(self, "models/onslaught/generator_dmg9.md3");
203 else if(hp < self.max_health * 0.20)
204 setmodel(self, "models/onslaught/generator_dmg8.md3");
205 else if(hp < self.max_health * 0.30)
206 setmodel(self, "models/onslaught/generator_dmg7.md3");
207 else if(hp < self.max_health * 0.40)
208 setmodel(self, "models/onslaught/generator_dmg6.md3");
209 else if(hp < self.max_health * 0.50)
210 setmodel(self, "models/onslaught/generator_dmg5.md3");
211 else if(hp < self.max_health * 0.60)
212 setmodel(self, "models/onslaught/generator_dmg4.md3");
213 else if(hp < self.max_health * 0.70)
214 setmodel(self, "models/onslaught/generator_dmg3.md3");
215 else if(hp < self.max_health * 0.80)
216 setmodel(self, "models/onslaught/generator_dmg2.md3");
217 else if(hp < self.max_health * 0.90)
218 setmodel(self, "models/onslaught/generator_dmg1.md3");
219 else if(hp <= self.max_health || hp >= self.max_health)
220 setmodel(self, "models/onslaught/generator.md3");
222 setsize(self, GENERATOR_MIN, GENERATOR_MAX);
225 void generator_construct()
227 self.netname = "Generator";
229 setorigin(self, self.origin);
230 setmodel(self, "models/onslaught/generator.md3");
231 setsize(self, GENERATOR_MIN, GENERATOR_MAX);
233 self.move_movetype = MOVETYPE_NOCLIP;
234 self.solid = SOLID_BBOX;
235 self.movetype = MOVETYPE_NOCLIP;
236 self.move_origin = self.origin;
237 self.move_time = time;
238 self.drawmask = MASK_NORMAL;
240 self.draw = generator_draw;
244 void generator_changeteam()
246 self.glowmod = Team_ColorRGB(self.team - 1);
247 self.teamradar_color = Team_ColorRGB(self.team - 1);
250 self.colormap = 1024 + (self.team - 1) * 17;
260 self.origin_x = ReadCoord();
261 self.origin_y = ReadCoord();
262 self.origin_z = ReadCoord();
263 setorigin(self, self.origin);
265 self.health = ReadByte();
266 self.max_health = ReadByte();
267 self.count = ReadByte();
272 generator_precache();
273 generator_construct();
274 self.colormap = 1024;
275 self.glowmod = '1 1 0';
282 if(_tmp != self.team)
285 generator_changeteam();
290 if(_tmp != self.health)
291 generator_damage(_tmp);
299 float generator_send(entity to, float sf)
301 WriteByte(MSG_ENTITY, ENT_CLIENT_GENERATOR);
302 WriteByte(MSG_ENTITY, sf);
305 WriteCoord(MSG_ENTITY, self.origin_x);
306 WriteCoord(MSG_ENTITY, self.origin_y);
307 WriteCoord(MSG_ENTITY, self.origin_z);
309 WriteByte(MSG_ENTITY, self.health);
310 WriteByte(MSG_ENTITY, self.max_health);
311 WriteByte(MSG_ENTITY, self.count);
316 WriteByte(MSG_ENTITY, self.team);
319 WriteByte(MSG_ENTITY, 0);
321 WriteByte(MSG_ENTITY, ceil((self.health / self.max_health) * 255));
327 void generator_link(void() spawnproc)
329 Net_LinkEntity(self, TRUE, 0, generator_send);
330 self.think = spawnproc;
331 self.nextthink = time;