1 #include "generator.qh"
3 bool generator_precached;
7 vector randompos(vector m1, vector m2)
11 v_x = m2_x * random() + m1_x;
12 v_y = m2_y * random() + m1_y;
13 v_z = m2_z * random() + m1_z;
17 void generator_precache()
19 if(generator_precached)
20 return; // already precached
22 precache_model("models/onslaught/generator.md3");
23 precache_model("models/onslaught/generator_dead.md3");
24 precache_model("models/onslaught/generator_dmg1.md3");
25 precache_model("models/onslaught/generator_dmg2.md3");
26 precache_model("models/onslaught/generator_dmg3.md3");
27 precache_model("models/onslaught/generator_dmg4.md3");
28 precache_model("models/onslaught/generator_dmg5.md3");
29 precache_model("models/onslaught/generator_dmg6.md3");
30 precache_model("models/onslaught/generator_dmg7.md3");
31 precache_model("models/onslaught/generator_dmg8.md3");
32 precache_model("models/onslaught/generator_dmg9.md3");
33 precache_model("models/onslaught/generator_dead.md3");
35 precache_model("models/onslaught/ons_ray.md3");
36 precache_sound("onslaught/shockwave.wav");
37 precache_sound(W_Sound("grenade_impact"));
38 precache_sound(W_Sound("rocket_impact"));
39 precache_sound("onslaught/electricity_explode.wav");
41 generator_precached = true;
44 void ons_generator_ray_draw()
46 if(time < self.move_time)
49 self.move_time = time + 0.05;
66 void ons_generator_ray_spawn(vector org)
70 e.classname = "ons_ray";
71 setmodel(e, "models/onslaught/ons_ray.md3");
73 e.angles = randomvec() * 360;
75 e.movetype = MOVETYPE_NONE;
77 e.scale = random() * 5 + 8;
78 e.move_time = time + 0.05;
79 e.drawmask = MASK_NORMAL;
80 e.draw = ons_generator_ray_draw;
85 if(time < self.move_time)
90 // damaged fx (less probable the more damaged is the generator)
91 if(random() < 0.9 - self.health / self.max_health)
94 pointparticles(particleeffectnum("electro_ballexplode"), self.origin + randompos('-50 -50 -20', '50 50 50'), '0 0 0', 1);
95 sound(self, CH_TRIGGER, "onslaught/electricity_explode.wav", VOL_BASE, ATTEN_NORM);
98 pointparticles(particleeffectnum("torch_small"), self.origin + randompos('-60 -60 -20', '60 60 60'), '0 0 0', 1);
100 self.move_time = time + 0.1;
112 if(self.count==40||self.count==20)
114 sound(self, CH_TRIGGER, "onslaught/shockwave.wav", VOL_BASE, ATTEN_NORM);
115 pointparticles(particleeffectnum("electro_combo"), self.origin, '0 0 0', 6);
121 ons_generator_ray_spawn(self.origin);
127 org = self.origin + randompos('-30 -30 -30' * i + '0 0 -20', '30 30 30' * i + '0 0 20');
128 pointparticles(particleeffectnum("onslaught_generator_gib_explode"), org, '0 0 0', 1);
131 // Short explosion sound + small explosion
134 te_explosion(self.origin);
135 sound(self, CH_TRIGGER, W_Sound("grenade_impact"), VOL_BASE, ATTEN_NORM);
139 org = self.origin + randompos(self.mins + '8 8 8', self.maxs + '-8 -8 -8');
140 pointparticles(particleeffectnum("onslaught_generator_smallexplosion"), org, '0 0 0', 1);
147 pointparticles(particleeffectnum("onslaught_generator_finalexplosion"), org, '0 0 0', 1);
148 sound(self, CH_TRIGGER, W_Sound("rocket_impact"), VOL_BASE, ATTEN_NORM);
151 self.move_time = time + 0.05;
156 void generator_damage(float hp)
159 setmodel(self, "models/onslaught/generator_dead.md3");
160 else if(hp < self.max_health * 0.10)
161 setmodel(self, "models/onslaught/generator_dmg9.md3");
162 else if(hp < self.max_health * 0.20)
163 setmodel(self, "models/onslaught/generator_dmg8.md3");
164 else if(hp < self.max_health * 0.30)
165 setmodel(self, "models/onslaught/generator_dmg7.md3");
166 else if(hp < self.max_health * 0.40)
167 setmodel(self, "models/onslaught/generator_dmg6.md3");
168 else if(hp < self.max_health * 0.50)
169 setmodel(self, "models/onslaught/generator_dmg5.md3");
170 else if(hp < self.max_health * 0.60)
171 setmodel(self, "models/onslaught/generator_dmg4.md3");
172 else if(hp < self.max_health * 0.70)
173 setmodel(self, "models/onslaught/generator_dmg3.md3");
174 else if(hp < self.max_health * 0.80)
175 setmodel(self, "models/onslaught/generator_dmg2.md3");
176 else if(hp < self.max_health * 0.90)
177 setmodel(self, "models/onslaught/generator_dmg1.md3");
178 else if(hp <= self.max_health || hp >= self.max_health)
179 setmodel(self, "models/onslaught/generator.md3");
181 setsize(self, GENERATOR_MIN, GENERATOR_MAX);
184 void generator_construct()
186 self.netname = "Generator";
187 self.classname = "onslaught_generator";
189 setorigin(self, self.origin);
190 setmodel(self, "models/onslaught/generator.md3");
191 setsize(self, GENERATOR_MIN, GENERATOR_MAX);
193 self.move_movetype = MOVETYPE_NOCLIP;
194 self.solid = SOLID_BBOX;
195 self.movetype = MOVETYPE_NOCLIP;
196 self.move_origin = self.origin;
197 self.move_time = time;
198 self.drawmask = MASK_NORMAL;
200 self.draw = generator_draw;
204 void generator_changeteam()
208 self.glowmod = Team_ColorRGB(self.team - 1);
209 self.teamradar_color = Team_ColorRGB(self.team - 1);
210 self.colormap = 1024 + (self.team - 1) * 17;
214 self.colormap = 1024;
215 self.glowmod = '1 1 0';
216 self.teamradar_color = '1 1 0';
226 self.origin_x = ReadCoord();
227 self.origin_y = ReadCoord();
228 self.origin_z = ReadCoord();
229 setorigin(self, self.origin);
231 self.health = ReadByte();
232 self.max_health = ReadByte();
233 self.count = ReadByte();
234 self.team = ReadByte();
239 generator_changeteam();
240 generator_precache();
241 generator_construct();
248 if(_tmp != self.team)
251 generator_changeteam();
256 if(_tmp != self.health)
257 generator_damage(_tmp);