8 .string mdl_dead; // or "" to hide when broken
9 .string debris; // space separated list of debris models
11 // mdl = particle effect name
12 // count = particle effect multiplier
13 // targetname = target to trigger to unbreak the model
14 // target = targets to trigger when broken
15 // health = amount of damage it can take
17 // 1 = start disabled (needs to be triggered to activate)
18 // 2 = indicate damage
20 // for mdl_dead to work, origin must be set (using a common/origin brush).
21 // Otherwise mdl_dead will be displayed at the map origin, and nobody would
24 .vector mins_save, maxs_save;
26 void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
30 // - basically func_assault_destructible for general gameplay use
32 void LaunchDebris (string debrisname) =
37 setorigin(dbr, self.absmin
38 + '1 0 0' * random() * (self.absmax_x - self.absmin_x)
39 + '0 1 0' * random() * (self.absmax_y - self.absmin_y)
40 + '0 0 1' * random() * (self.absmax_z - self.absmin_z));
41 setmodel (dbr, debrisname );
42 dbr.movetype = MOVETYPE_BOUNCE;
43 dbr.solid = SOLID_NOT;
44 // TODO parametrize this
45 dbr.velocity_x = 70 * crandom();
46 dbr.velocity_y = 70 * crandom();
47 dbr.velocity_z = 140 + 70 * random();
48 dbr.avelocity_x = random()*600;
49 dbr.avelocity_y = random()*600;
50 dbr.avelocity_z = random()*600;
51 SUB_SetFade(dbr, time + 1 + random() * 5, 1);
54 void func_breakable_colormod()
57 if not(self.spawnflags & 2)
59 h = self.health / self.max_health;
61 self.colormod = '1 0 0';
63 self.colormod = '1 0 0' + '0 1 0' * (2 * h - 0.5);
65 self.colormod = '1 1 1';
68 void func_breakable_look_destroyed()
72 if(self.mdl_dead == "")
75 setmodel(self, self.mdl_dead);
76 if (self.origin == '0 0 0') { // probably no origin brush, so don't spawn in the middle of the map..
77 floor_z = self.absmin_z;
78 self.origin = ((self.absmax+self.absmin)*.5);
79 self.origin_z = floor_z;
83 self.solid = SOLID_NOT;
86 void func_breakable_look_restore()
88 setmodel(self, self.mdl);
89 self.solid = SOLID_BSP;
92 void func_breakable_behave_destroyed()
94 self.health = self.max_health;
95 self.takedamage = DAMAGE_NO;
96 self.event_damage = SUB_Null;
98 setsize(self, '0 0 0', '0 0 0');
99 func_breakable_colormod();
102 void func_breakable_behave_restore()
104 self.health = self.max_health;
105 self.takedamage = DAMAGE_AIM;
106 self.event_damage = func_breakable_damage;
108 setsize(self, self.mins_save, self.maxs_save);
109 func_breakable_colormod();
112 void func_breakable_destroyed()
114 func_breakable_look_destroyed();
115 func_breakable_behave_destroyed();
118 void func_breakable_restore()
120 func_breakable_look_restore();
121 func_breakable_behave_restore();
124 void func_breakable_destroy() {
127 activator = self.owner;
129 // now throw around the debris
130 n = tokenize_console(self.debris);
131 for(i = 0; i < n; ++i)
132 LaunchDebris(argv(i));
134 func_breakable_destroyed();
137 sound (self, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
140 RadiusDamage(self, activator, self.dmg, self.dmg_edge, self.dmg_radius, self, self.dmg_force, DEATH_HURTTRIGGER, world);
143 pointparticles(self.cnt, self.absmin * 0.5 + self.absmax * 0.5, '0 0 0', self.count);
148 void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
153 if(attacker.team == self.team)
156 WaypointSprite_Ping(self.sprite);
157 self.health = self.health - damage;
158 func_breakable_colormod();
161 W_PrepareExplosionByDamage(attacker, func_breakable_destroy);
164 void func_breakable_reset()
166 self.team = self.team_saved;
167 func_breakable_look_restore();
168 if(self.spawnflags & 1)
169 func_breakable_behave_destroyed();
171 func_breakable_behave_restore();
174 // destructible walls that can be used to trigger target_objective_decrease
175 void spawnfunc_func_breakable() {
179 self.max_health = self.health;
182 self.cnt = particleeffectnum(self.mdl);
187 self.message = "got too close to an explosion";
189 self.message2 = "was pushed into an explosion by";
191 self.dmg_radius = 150;
193 self.dmg_force = 200;
195 self.mdl = self.model;
196 SetBrushEntityModel();
197 self.mins_save = self.mins;
198 self.maxs_save = self.maxs;
200 self.use = func_breakable_restore;
202 // precache all the models
204 precache_model(self.mdl_dead);
205 n = tokenize_console(self.debris);
206 for(i = 0; i < n; ++i)
207 precache_model(argv(i));
209 precache_sound(self.noise);
211 self.team_saved = self.team;
213 self.reset = func_breakable_reset;
214 func_breakable_reset();