2 void turrets_precache()
4 precache_model ("models/turrets/ewheel-base2.md3");
5 precache_model ("models/turrets/ewheel-gun1.md3");
6 precache_model ("models/turrets/base.md3");
7 precache_model ("models/turrets/flac.md3");
8 precache_model ("models/turrets/reactor.md3");
9 precache_model ("models/turrets/hellion.md3");
10 precache_model ("models/turrets/hk.md3");
11 precache_model ("models/turrets/machinegun.md3");
12 precache_model ("models/turrets/mlrs.md3");
13 precache_model ("models/turrets/phaser.md3");
14 precache_model ("models/turrets/phaser_beam.md3");
15 precache_model ("models/turrets/plasma.md3");
16 precache_model ("models/turrets/plasmad.md3");
17 precache_model ("models/turrets/tesla_head.md3");
18 precache_model ("models/turrets/tesla_base.md3");
19 precache_model ("models/turrets/walker_head_minigun.md3");
20 precache_model ("models/turrets/walker_body.md3");
21 precache_model ("models/turrets/walker_props.md3");
22 precache_model ("models/turrets/walker_spawn.md3");
23 precache_model ("models/turrets/rocket.md3");
25 precache_sound ("turrets/phaser.wav");
26 precache_sound ("weapons/rocket_impact.wav");
27 precache_sound ("weapons/uzi_fire.wav");
32 dprint("Removing turret type ", ftos(self.turret_type), "\n");
34 remove(self.tur_head);
35 self.tur_head = world;
38 void turret_changeteam()
40 self.colormod = '0 0 0';
43 case COLOR_TEAM1: // Red
44 self.colormod = '2 0.5 0.5';
47 case COLOR_TEAM2: // Blue
48 self.colormod = '0.5 0.5 2';
51 case COLOR_TEAM3: // Yellow
52 self.colormod = '1.4 1.4 0.6';
55 case COLOR_TEAM4: // Pink
56 self.colormod = '1.4 0.6 1.4';
60 self.tur_head.colormod = self.colormod;
63 void turret_head_draw()
66 dt = time - self.move_time;
67 self.move_time = time;
71 self.angles += dt * self.move_avelocity;
72 self.drawmask = MASK_NORMAL;
77 if (self.health < 127)
79 te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
81 self.drawmask = MASK_NORMAL;
84 void turret_moving_head_draw()
86 self.drawmask = MASK_NORMAL;
89 void turret_moving_draw()
93 dt = time - self.move_time;
94 self.move_time = time;
98 fixedmakevectors(self.angles);
99 movelib_groundalign4point(300, 100, 0.25);
101 setorigin(self, self.origin + self.velocity * dt);
102 if(self.turret_type == TID_WALKER)
103 setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
105 setorigin(self.tur_head, self.origin);
106 self.tur_head.angles += dt * self.tur_head.move_avelocity;
108 if (self.health < 127)
110 te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
112 self.drawmask = MASK_NORMAL;
115 string tid2info_base;
116 string tid2info_head;
119 void turret_tid2info(float _tid)
121 tid2info_base = "models/turrets/base.md3";
122 tid2info_min = '-32 -32 0';
123 tid2info_max = '32 32 64';
128 tid2info_base = "models/turrets/ewheel-base2.md3";
129 tid2info_head = "models/turrets/ewheel-gun1.md3";
132 tid2info_head = "models/turrets/flac.md3";
135 tid2info_head = "models/turrets/reactor.md3";
136 tid2info_min = '-34 -34 0';
137 tid2info_max = '34 34 90';
140 tid2info_head = "models/turrets/hellion.md3";
143 tid2info_head = "models/turrets/hk.md3";
146 tid2info_head = "models/turrets/machinegun.md3";
149 tid2info_head = "models/turrets/mlrs.md3";
152 tid2info_head = "models/turrets/phaser.md3";
155 tid2info_head = "models/turrets/plasma.md3";
157 case TID_PLASMA_DUAL:
158 tid2info_head = "models/turrets/plasmad.md3";
161 tid2info_base = "models/turrets/tesla_base.md3";
162 tid2info_head = "models/turrets/tesla_head.md3";
163 tid2info_min = '-60 -60 0';
164 tid2info_max ='60 60 128';
167 tid2info_base = "models/turrets/walker_body.md3";
168 tid2info_head = "models/turrets/walker_head_minigun.md3";
169 tid2info_min = '-70 -70 0';
170 tid2info_max = '70 70 95';
175 //void(entity e, entity tagentity, string tagname) setattachment = #443;
176 void turret_construct()
178 if(self.tur_head == world)
179 self.tur_head = spawn();
181 turret_tid2info(self.turret_type);
183 setorigin(self, self.origin);
185 self.tur_head.classname = "turret_head";
186 self.tur_head.owner = self;
188 setmodel(self, tid2info_base);
189 setmodel(self.tur_head, tid2info_head);
191 self.tur_head.move_movetype = MOVETYPE_NOCLIP;
192 self.move_movetype = MOVETYPE_NOCLIP;
193 self.tur_head.angles = self.angles;
195 setsize(self, tid2info_min, tid2info_max);
196 setsize(self.tur_head, '0 0 0', '0 0 0');
198 setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
200 self.solid = SOLID_BBOX;
201 self.tur_head.solid = SOLID_NOT;
202 self.movetype = MOVETYPE_NOCLIP;
203 self.tur_head.movetype = MOVETYPE_NOCLIP;
204 self.draw = turret_draw;
205 self.tur_head.draw = turret_head_draw;
206 self.entremove = turret_remove;
208 if(self.turret_type == TID_EWHEEL || self.turret_type == TID_WALKER)
211 self.move_movetype = MOVETYPE_BOUNCE;
212 self.move_origin = self.origin;
213 self.move_time = time;
215 self.movetype = MOVETYPE_NOCLIP;
216 self.tur_head.movetype = MOVETYPE_NOCLIP;
217 self.draw = turret_moving_draw;
218 self.tur_head.draw = turret_moving_head_draw;
222 entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, float _explode);
223 void turret_gibboom();
225 void turret_gib_draw()
227 Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
229 self.drawmask = MASK_NORMAL;
233 if(time >= self.nextthink)
241 self.alpha = bound(0, self.nextthink - time, 1);
242 if(self.alpha < ALPHA_MIN_VISIBLE)
247 void turret_gibboom()
250 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
251 pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
253 for (i = 1; i < 5; i = i +1)
254 turret_gibtoss(strcat("models/turrets/head-gib", ftos(i), ".md3"), self.origin, self.velocity + randomvec() * 700, '0 0 0', FALSE);
257 entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, float _explode)
262 setorigin(gib, _from);
263 setmodel(gib, _model);
264 gib.colormod = _cmod;
265 gib.solid = SOLID_CORPSE;
266 gib.draw = turret_gib_draw;
271 gib.nextthink = time + 0.2 * (autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15));
272 gib.effects = EF_FLAME;
275 gib.nextthink = time + autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15);
278 gib.move_movetype = MOVETYPE_BOUNCE;
279 gib.move_origin = gib.origin = _from;
280 gib.move_velocity = _to;
281 gib.move_avelocity = prandomvec() * 32;
282 gib.move_time = time;
283 gib.damageforcescale = 1;
293 setmodel(self.tur_head, "");
294 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
295 pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
296 turret_tid2info(self.turret_type);
299 if(self.turret_type == TID_EWHEEL)
300 turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
301 else if (self.turret_type == TID_WALKER)
302 turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
303 else if (self.turret_type == TID_TESLA)
304 turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
309 turret_gibtoss("models/turrets/base-gib2.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
310 turret_gibtoss("models/turrets/base-gib3.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
311 turret_gibtoss("models/turrets/base-gib4.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
314 turret_gibtoss("models/turrets/base-gib1.md3", self.origin, '0 0 0', '0 0 0', TRUE);
317 headgib = turret_gibtoss(tid2info_head, self.origin + '0 0 32', '0 0 200' + randomvec() * 200, '-1 -1 -1', TRUE);
318 headgib.angles = headgib.move_angles = self.tur_head.angles;
319 headgib.avelocity = headgib.move_avelocity = self.tur_head.move_avelocity + randomvec() * 45;
320 headgib.avelocity_y = headgib.move_avelocity_y = headgib.move_avelocity_y * 5;
321 headgib.gravity = 0.5;
331 self.turret_type = ReadByte();
332 dprint("Constructing turret type ", ftos(self.turret_type), "\n");
334 self.origin_x = ReadCoord();
335 self.origin_y = ReadCoord();
336 self.origin_z = ReadCoord();
338 self.angles_x = ReadAngle();
339 self.angles_y = ReadAngle();
346 self.tur_head.move_angles_x = ReadShort();
347 self.tur_head.move_angles_y = ReadShort();
348 self.tur_head.angles = self.angles + self.tur_head.move_angles;
353 self.tur_head.move_avelocity_x = ReadShort();
354 self.tur_head.move_avelocity_y = ReadShort();
359 self.origin_x = ReadShort();
360 self.origin_y = ReadShort();
361 self.origin_z = ReadShort();
362 setorigin(self, self.origin);
364 self.velocity_x = ReadShort();
365 self.velocity_y = ReadShort();
366 self.velocity_z = ReadShort();
368 self.angles_y = ReadShort();
370 self.move_time = time;
371 self.move_velocity = self.velocity;
372 self.move_origin = self.origin;
377 self.frame1time = ReadCoord();
378 self.frame = ReadByte();
386 _team -= 1; // /&)=(%&#)&%)/#&)=½!!!½!!". thanks.
387 self.health = ReadByte();
388 if(_team != self.team)