3 // TODO add the fields this uses to the entities.def when done
5 .string mdl_dead; // or "" to hide when broken
6 .string debris; // space separated list of debris models
8 // mdl = particle effect name
9 // count = particle effect multiplier
10 // targetname = target to trigger to unbreak the model
11 // target = targets to trigger when broken
12 // health = amount of damage it can take
14 // 1 = start disabled (needs to be triggered to activate)
15 // 2 = indicate damage
17 // for mdl_dead to work, origin must be set (using a common/origin brush).
18 // Otherwise mdl_dead will be displayed at the map origin, and nobody would
21 .vector mins_save, maxs_save;
23 void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
27 // - basically func_assault_destructible for general gameplay use
29 void LaunchDebris (string debrisname) =
34 dbr.origin = self.origin + self.absmin
35 + '1 0 0' * random() * (self.absmax_x - self.absmin_x)
36 + '0 1 0' * random() * (self.absmax_y - self.absmin_y)
37 + '0 0 1' * random() * (self.absmax_z - self.absmin_z);
38 setmodel (dbr, debrisname );
39 dbr.movetype = MOVETYPE_BOUNCE;
40 dbr.solid = SOLID_NOT;
41 // TODO parametrize this
42 dbr.velocity_x = 70 * crandom();
43 dbr.velocity_y = 70 * crandom();
44 dbr.velocity_z = 140 + 70 * random();
45 dbr.avelocity_x = random()*600;
46 dbr.avelocity_y = random()*600;
47 dbr.avelocity_z = random()*600;
48 SUB_SetFade(dbr, time + 1 + random() * 5, 1);
51 void func_breakable_colormod()
54 if not(self.spawnflags & 2)
56 h = self.health / self.max_health;
58 self.colormod = '1 0 0';
60 self.colormod = '1 0 0' + '0 1 0' * (2 * h - 0.5);
62 self.colormod = '1 1 1';
65 void func_breakable_look_destroyed()
67 if(self.mdl_dead == "")
70 self.solid = SOLID_NOT;
74 setmodel(self, self.mdl_dead);
75 self.solid = SOLID_BSP;
79 void func_breakable_look_restore()
81 setmodel(self, self.mdl);
82 self.solid = SOLID_BSP;
85 void func_breakable_behave_destroyed()
87 self.health = self.max_health;
88 self.takedamage = DAMAGE_NO;
89 self.event_damage = SUB_Null;
91 setsize(self, '0 0 0', '0 0 0');
92 func_breakable_colormod();
95 void func_breakable_behave_restore()
97 self.health = self.max_health;
98 self.takedamage = DAMAGE_AIM;
99 self.event_damage = func_breakable_damage;
101 setsize(self, self.mins_save, self.maxs_save);
102 func_breakable_colormod();
105 void func_breakable_destroyed()
107 func_breakable_look_destroyed();
108 func_breakable_behave_destroyed();
111 void func_breakable_restore()
113 func_breakable_look_restore();
114 func_breakable_behave_restore();
117 void func_breakable_destroy() {
120 func_breakable_destroyed();
122 // now throw around the debris
123 n = tokenize_sane(self.debris);
124 for(i = 0; i < n; ++i)
125 LaunchDebris(argv(i));
128 pointparticles(self.cnt, self.absmin * 0.5 + self.absmax * 0.5, '0 0 0', self.count);
133 void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
138 if(attacker.team == self.team)
141 WaypointSprite_Ping(self.sprite);
142 self.health = self.health - damage;
145 activator = attacker;
146 func_breakable_destroy();
148 func_breakable_colormod();
151 void func_breakable_reset()
153 func_breakable_look_restore();
154 if(self.spawnflags & 1)
155 func_breakable_behave_destroyed();
157 func_breakable_behave_restore();
160 // destructible walls that can be used to trigger target_objective_decrease
161 void spawnfunc_func_breakable() {
165 self.max_health = self.health;
168 self.cnt = particleeffectnum(self.mdl);
172 self.mdl = self.model;
173 SetBrushEntityModel();
174 self.mins_save = self.mins;
175 self.maxs_save = self.maxs;
177 self.use = func_breakable_restore;
179 // precache all the models
181 precache_model(self.mdl_dead);
182 n = tokenize_sane(self.debris);
183 for(i = 0; i < n; ++i)
184 precache_model(argv(i));
186 func_breakable_reset();