4 void turret_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
6 self.velocity += vforce;
10 vector v_from, vector v_to, vector v_colormod,
12 float f_lifetime, float f_fadetime, float b_burn)
19 gib.classname = "turret_gib";
20 setmodel(gib, smodel);
21 setorigin(gib, v_from);
22 SUB_SetFade(gib,time + f_lifetime, 2);
24 gib.solid = SOLID_BBOX;
25 gib.movetype = MOVETYPE_BOUNCE;
26 gib.takedamage = DAMAGE_YES;
27 gib.event_damage = turret_gib_damage;
29 gib.effects = EF_LOWPRECISION;
30 gib.flags = FL_NOTARGET;
31 gib.colormod = v_colormod;
37 burn.effects = EF_LOWPRECISION;//|EF_FLAME;
38 setattachment(burn,gib,"");
39 setorigin(burn,(gib.mins + gib.maxs) * 0.5);
40 SUB_SetFade(burn,time + (f_lifetime * 0.5), 2);
44 void turret_gib_boom()
50 for (i = 1; i < 5; i = i +1)
53 gib.classname = "turret_gib";
55 s = strcat("models/turrets/head-gib",ftos(i));
59 setorigin(gib,self.origin);
61 SUB_SetFade(gib,time + 5,2);
63 gib.solid = SOLID_BBOX;
64 gib.movetype = MOVETYPE_BOUNCE;
66 gib.damageforcescale = 2;
67 gib.takedamage = DAMAGE_YES;
68 gib.event_damage = turret_gib_damage;
70 gib.effects = EF_LOWPRECISION;
71 gib.flags = FL_NOTARGET;
72 gib.velocity = self.velocity + (randomvec() * 700);
73 gib.avelocity = randomvec() * 64;
76 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
77 WriteByte (MSG_BROADCAST, 78);
78 WriteCoord (MSG_BROADCAST, self.origin_x);
79 WriteCoord (MSG_BROADCAST, self.origin_y);
80 WriteCoord (MSG_BROADCAST, self.origin_z);
86 vector v_from, vector v_to, vector v_colormod,
87 entity e_mimic, float boomtime)
93 gib.classname = "turret_gib";
94 setmodel(gib,e_mimic.model);
95 setorigin(gib,v_from);
97 gib.solid = SOLID_BBOX;
99 gib.movetype = MOVETYPE_BOUNCE;
101 gib.damageforcescale = 2;
102 gib.takedamage = DAMAGE_YES;
103 gib.event_damage = turret_gib_damage;
105 gib.effects = EF_LOWPRECISION;
106 gib.flags = FL_NOTARGET;
107 gib.colormod = v_colormod;
109 gib.avelocity = randomvec() * 32;
110 gib.think = turret_gib_boom;
111 gib.nextthink = boomtime;
112 //gib.effects = EF_FLAME;
117 * Spawn a boom, trow fake bits arround
118 * and hide the real ones.
120 void turret_stdproc_die()
125 self.deadflag = DEAD_DEAD;
126 self.tur_head.deadflag = self.deadflag;
128 sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
129 org2 = self.origin + '0 0 40';
132 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
133 WriteByte (MSG_BROADCAST, 78);
134 WriteCoord (MSG_BROADCAST, org2_x);
135 WriteCoord (MSG_BROADCAST, org2_y);
136 WriteCoord (MSG_BROADCAST, org2_z);
138 // Unsolidify and hide real parts
139 self.solid = SOLID_NOT;
140 self.tur_head.solid = self.solid;
143 self.tur_head.alpha = self.alpha;
144 self.customizeentityforclient = SUB_False;
145 self.tur_head.customizeentityforclient = SUB_False;
147 self.event_damage = SUB_Null;
148 self.takedamage = DAMAGE_NO;
151 self.tur_head.effects = self.effects;
154 // Trow fake parts arround
156 if not(self.damage_flags & TFL_DMG_DEATH_NOGIBS)
158 makevectors(self.angles);
161 turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib2.md3", min(self.respawntime, 20), 1, 1);
163 t_dir = (v_up * 700) + (randomvec() * 300);
164 turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib3.md3", min(self.respawntime, 10), 1, 1);
166 t_dir = (v_up * 700) + (randomvec() * 300);
167 turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib4.md3", min(self.respawntime, 10), 1, 1);
171 turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib1.md3", min(self.respawntime, 20), 1, 1);
174 // Blow the top part up into the air
175 turret_trowgib2( self.origin + (v_up * 50), v_up * 150 + randomvec() * 50, '0.2 0.2 0.2', self.tur_head,time + 0.5 + (random() * 0.5));
179 //RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world);
181 if(self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
183 if (self.turret_diehook)
184 self.turret_diehook();
186 remove(self.tur_head);
192 self.nextthink = time + self.respawntime;
193 self.think = turret_stdproc_respawn;
195 if (self.turret_diehook)
196 self.turret_diehook();
200 var const float SUB_NullFloat();
201 void turret_stdproc_respawn()
203 // Make sure all parts belong to the same team since
204 // this function doubles as "teamchange" function.
206 self.tur_head.team = self.team;
207 self.colormod = '0 0 0';
211 case COLOR_TEAM1: // Red
212 self.colormod = '1.4 0.8 0.8';
215 case COLOR_TEAM2: // Blue
216 self.colormod = '0.8 0.8 1.4';
219 case COLOR_TEAM3: // Yellow
220 self.colormod = '1.4 1.4 0.6';
223 case COLOR_TEAM4: // Pink
224 self.colormod = '1.4 0.6 1.4';
228 self.deadflag = DEAD_NO;
229 self.effects = EF_LOWPRECISION;
230 self.tur_head.effects = self.effects;
231 self.solid = SOLID_BBOX;
233 self.tur_head.alpha = self.alpha;
235 self.customizeentityforclient = SUB_NullFloat;
236 self.tur_head.customizeentityforclient = SUB_NullFloat;
238 self.takedamage = DAMAGE_AIM;
239 self.event_damage = turret_stdproc_damage;
241 self.avelocity = '0 0 0';
242 self.tur_head.avelocity = self.avelocity;
243 self.tur_head.angles = self.idle_aim;
244 self.health = self.tur_health;
247 self.volly_counter = self.shot_volly;
248 self.ammo = self.ammo_max;
250 self.nextthink = time + self.ticrate;
251 self.think = turret_think;
253 if (self.turret_respawnhook)
254 self.turret_respawnhook();
259 * Standard damage proc.
261 void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
265 if (self.health <= 0)
268 // Inactive turrets take no damage. (hm..)
269 if not (self.tur_active)
273 if (self.team == attacker.team)
275 // This does not happen anymore. Re-enable if you fix that.
276 if(clienttype(attacker) == CLIENTTYPE_REAL)
277 sprint(attacker, "\{1}Turret tells you: I'm on your team!\n");
279 if(autocvar_g_friendlyfire)
280 damage = damage * autocvar_g_friendlyfire;
285 self.health = self.health - damage;
287 // thorw head slightly off aim when hit?
288 if (self.damage_flags & TFL_DMG_HEADSHAKE)
290 self.tur_head.angles_x = self.tur_head.angles_x + (-0.5 + random()) * damage;
291 self.tur_head.angles_y = self.tur_head.angles_y + (-0.5 + random()) * damage;
294 if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
295 self.velocity = self.velocity + vforce;
297 // FIXME: Better damage feedback?
299 if (self.health <= 0)
301 self.event_damage = SUB_Null;
302 self.tur_head.event_damage = SUB_Null;
303 self.takedamage = DAMAGE_NO;
304 self.nextthink = time;
305 self.think = turret_stdproc_die;