4 void turret_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
\r
6 self.velocity += vforce;
\r
8 void turret_gibs_precash()
\r
10 precache_model("models/turrets/base-gib1.md3");
\r
11 precache_model("models/turrets/base-gib2.md3");
\r
12 precache_model("models/turrets/base-gib3.md3");
\r
13 precache_model("models/turrets/base-gib4.md3");
\r
15 precache_model("models/turrets/head-gib1.md3");
\r
16 precache_model("models/turrets/head-gib2.md3");
\r
17 precache_model("models/turrets/head-gib3.md3");
\r
18 precache_model("models/turrets/head-gib4.md3");
\r
21 void turret_trowgib(
\r
22 vector v_from, vector v_to, vector v_colormod,
\r
24 float f_lifetime, float f_fadetime, float b_burn)
\r
31 gib.classname = "turret_gib";
\r
32 setmodel(gib,smodel);
\r
33 setorigin(gib,v_from);
\r
34 SUB_SetFade(gib,time + f_lifetime,2);
\r
36 gib.solid = SOLID_BBOX;
\r
38 gib.movetype = MOVETYPE_BOUNCE;
\r
39 gib.takedamage = DAMAGE_YES;
\r
40 gib.event_damage = turret_gib_damage;
\r
42 gib.effects = EF_LOWPRECISION;
\r
43 gib.flags = FL_NOTARGET;
\r
44 gib.colormod = v_colormod;
\r
45 gib.velocity = v_to;
\r
50 burn.effects = EF_LOWPRECISION|EF_FLAME;
\r
51 setattachment(burn,gib,"");
\r
52 setorigin(burn,(gib.mins + gib.maxs) * 0.5);
\r
53 SUB_SetFade(burn,time + (f_lifetime * 0.5) ,2);
\r
57 void turret_gib_boom()
\r
66 gib.classname = "turret_gib";
\r
68 s = strcat("models/turrets/head-gib",ftos(i));
\r
69 s = strcat(s,".md3");
\r
70 // bprint("s:",s,"\n");
\r
73 setorigin(gib,self.origin);
\r
75 SUB_SetFade(gib,time + 5,2);
\r
77 gib.solid = SOLID_BBOX;
\r
79 gib.movetype = MOVETYPE_BOUNCE;
\r
81 gib.damageforcescale = 2;
\r
82 gib.takedamage = DAMAGE_YES;
\r
83 gib.event_damage = turret_gib_damage;
\r
85 gib.effects = EF_LOWPRECISION;
\r
86 gib.flags = FL_NOTARGET;
\r
87 gib.velocity = self.velocity + (randomvec() * 700);
\r
88 gib.avelocity = randomvec() * 64;
\r
91 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
\r
92 WriteByte (MSG_BROADCAST, 78);
\r
93 WriteCoord (MSG_BROADCAST, self.origin_x);
\r
94 WriteCoord (MSG_BROADCAST, self.origin_y);
\r
95 WriteCoord (MSG_BROADCAST, self.origin_z);
\r
100 void turret_trowgib2(
\r
101 vector v_from, vector v_to, vector v_colormod,
\r
102 entity e_mimic, float boomtime)
\r
108 gib.classname = "turret_gib";
\r
109 setmodel(gib,e_mimic.model);
\r
110 setorigin(gib,v_from);
\r
112 gib.solid = SOLID_BBOX;
\r
114 gib.movetype = MOVETYPE_BOUNCE;
\r
115 gib.gravity = 0.75;
\r
116 gib.damageforcescale = 2;
\r
117 gib.takedamage = DAMAGE_YES;
\r
118 gib.event_damage = turret_gib_damage;
\r
120 gib.effects = EF_LOWPRECISION;
\r
121 gib.flags = FL_NOTARGET;
\r
122 gib.colormod = v_colormod;
\r
123 gib.velocity = v_to;
\r
124 gib.avelocity = randomvec() * 32;
\r
125 gib.think = turret_gib_boom;
\r
126 gib.nextthink = boomtime;
\r
127 gib.effects = EF_FLAME;
\r
132 * Spawn a boom, trow fake bits arround
\r
133 * and hide the real ones.
\r
135 void turret_stdproc_die()
\r
140 // self.tur_active = 0;
\r
142 self.deadflag = DEAD_DEAD;
\r
143 self.tur_head.deadflag = self.deadflag;
\r
145 sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", 1, ATTN_NORM);
\r
146 org2 = self.origin + '0 0 40';
\r
148 // Explotion grafix
\r
149 WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
\r
150 WriteByte (MSG_BROADCAST, 78);
\r
151 WriteCoord (MSG_BROADCAST, org2_x);
\r
152 WriteCoord (MSG_BROADCAST, org2_y);
\r
153 WriteCoord (MSG_BROADCAST, org2_z);
\r
155 // Unsolidify and hide real parts
\r
156 self.solid = SOLID_NOT;
\r
157 self.tur_head.solid = self.solid;
\r
160 self.tur_head.alpha = -1;
\r
162 self.takedamage = DAMAGE_NO;
\r
163 self.tur_head.takedamage = self.takedamage;
\r
166 self.tur_head.effects = self.effects;
\r
171 // Trow fake parts arround
\r
174 makevectors(self.angles);
\r
175 if (random() > 0.5)
\r
177 turret_trowgib(self.origin, '0 0 0','1 1 1',"models/turrets/base-gib2.md3",min(self.respawntime,20),1,1);
\r
178 t_dir = (v_up * 700) + (randomvec() * 300);
\r
179 turret_trowgib(self.origin, t_dir,'1 1 1',"models/turrets/base-gib3.md3",min(self.respawntime,10),1,1);
\r
180 t_dir = (v_up * 700) + (randomvec() * 300);
\r
181 turret_trowgib(self.origin, t_dir,'1 1 1',"models/turrets/base-gib4.md3",min(self.respawntime,10),1,1);
\r
185 turret_trowgib(self.origin, '0 0 0','1 1 1',"models/turrets/base-gib1.md3",min(self.respawntime,20),1,1);
\r
188 // Blow the top part up into the air
\r
189 turret_trowgib2( self.origin + (v_up * 50),
\r
190 v_up * 150 + randomvec() * 50,
\r
192 self.tur_head,time + 0.5 + (random() * 0.5));
\r
196 RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,0,world);
\r
199 self.nextthink = time + self.respawntime;
\r
200 //self.think = self.turret_spawnfunc;
\r
201 self.think = turret_stdproc_respawn;
\r
203 if (self.turret_diehook)
\r
204 self.turret_diehook();
\r
207 void turret_stdproc_respawn()
\r
209 // self.tur_active = 1;
\r
211 // Make sure all parts belong to the same team since
\r
212 // this function doubles as "teamchange" function.
\r
213 self.tur_head.team = self.team;
\r
214 if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
\r
215 if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
\r
217 self.deadflag = DEAD_NO;
\r
218 self.tur_head.deadflag = self.deadflag;
\r
219 self.effects = self.tur_head.effects = 0;
\r
221 self.solid = SOLID_BBOX;
\r
222 self.tur_head.solid = self.solid;
\r
225 self.tur_head.alpha = self.alpha;
\r
227 self.takedamage = DAMAGE_YES;
\r
228 self.tur_head.takedamage = self.takedamage;
\r
230 self.avelocity = '0 0 0';
\r
231 self.tur_head.avelocity = self.avelocity;
\r
232 self.tur_head.angles = self.idle_aim;
\r
234 self.health = self.tur_health;
\r
236 self.enemy = world;
\r
237 self.volly_counter = self.shot_volly;
\r
238 self.ammo = self.ammo_max;
\r
240 self.nextthink = time + self.ticrate;
\r
241 self.think = turret_think;
\r
243 if (self.turret_respawnhook)
\r
244 self.turret_respawnhook();
\r
249 * Standard damage proc.
\r
251 void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
\r
253 entity baseent,oldself;
\r
256 if (self.health <= 0) return;
\r
258 // Damage func is shared on all parts as standard, we need to know what the master entity of this turret is.
\r
259 // if ((self.classname == "turret_head")||(self.classname == "turret_gun")||(self.classname == "turret_badge"))
\r
261 baseent = self.owner;
\r
267 if (self.team == attacker.team)
\r
269 sprint(attacker,"Turret: Im on your team!\n");
\r
275 // This will get enoying fast...
\r
276 FOR_EACH_PLAYER(player)
\r
277 if(player.team == self.team)
\r
278 sprint(player, "The enemy is attacking your base!");
\r
285 baseent.health = baseent.health - damage;
\r
287 // thorw head slightly off aim when hit?
\r
288 if ((self.classname == "turret_head") || (self.classname == "turret_gun"))
\r
289 if (self.damage_flags & TFL_DMG_HEADSHAKE)
\r
291 // makevectors(baseent.tur_head.v_angle);
\r
292 baseent.tur_head.angles = baseent.tur_head.angles + randomvec() * damage;
\r
295 if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
\r
297 self.velocity = self.velocity + vforce;
\r
301 // Start burning when we have 10% or less health left
\r
302 if (self.health < (self.tur_health * 0.1))
\r
303 self.effects = EF_FLAME;
\r
305 if (self.health <= 0)
\r
309 turret_stdproc_die();
\r
312 //baseent.turret_diefunc();
\r