// func_breakable
// - basically func_assault_destructible for general gameplay use
//
-void LaunchDebris (string debrisname, vector force) =
+void LaunchDebris (string debrisname, vector force)
{
local entity dbr;
if(dbr.damageforcescale)
dbr.takedamage = DAMAGE_YES;
SUB_SetFade(dbr, time + self.debristime + crandom() * self.debristimejitter, self.debrisfadetime);
-};
+}
void func_breakable_colormod()
{
void func_breakable_look_destroyed()
{
- local float floor_z;
+ float floor_z;
+
+ if(self.solid == SOLID_BSP) // in case a misc_follow moved me, save the current origin first
+ self.dropped_origin = self.origin;
if(self.mdl_dead == "")
self.model = "";
void func_breakable_look_restore()
{
setmodel(self, self.mdl);
+ if(self.mdl_dead != "") // only do this if we use mdl_dead, to behave better with misc_follow
+ setorigin(self, self.dropped_origin);
self.solid = SOLID_BSP;
}
{
self.health = self.max_health;
self.takedamage = DAMAGE_NO;
+ self.bot_attack = FALSE;
self.event_damage = SUB_Null;
self.state = 1;
func_breakable_colormod();
void func_breakable_behave_restore()
{
self.health = self.max_health;
+ if(self.sprite)
+ {
+ WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
+ WaypointSprite_UpdateHealth(self.sprite, self.health);
+ }
self.takedamage = DAMAGE_AIM;
+ self.bot_attack = TRUE;
self.event_damage = func_breakable_damage;
self.state = 0;
+ self.nextthink = 0; // cancel auto respawn
func_breakable_colormod();
}
string oldmsg;
activator = self.owner;
+ self.owner = world; // set by W_PrepareExplosionByDamage
// now throw around the debris
n = tokenize_console(self.debris);
func_breakable_destroyed();
if(self.noise)
- sound (self, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+ sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
if(self.dmg)
RadiusDamage(self, activator, self.dmg, self.dmg_edge, self.dmg_radius, self, self.dmg_force, DEATH_HURTTRIGGER, world);
if(self.cnt)
pointparticles(self.cnt, self.absmin * 0.5 + self.absmax * 0.5, '0 0 0', self.count);
+ if(self.respawntime)
+ {
+ self.think = func_breakable_restore;
+ self.nextthink = time + self.respawntime + crandom() * self.respawntimejitter;
+ }
+
oldmsg = self.message;
self.message = "";
SUB_UseTargets();
if(self.team)
if(attacker.team == self.team)
return;
+ self.health = self.health - damage;
if(self.sprite)
+ {
WaypointSprite_Ping(self.sprite);
- self.health = self.health - damage;
+ WaypointSprite_UpdateHealth(self.sprite, self.health);
+ }
func_breakable_colormod();
if(self.health <= 0)
precache_sound(self.noise);
self.team_saved = self.team;
+ self.dropped_origin = self.origin;
self.reset = func_breakable_reset;
func_breakable_reset();
}
+
+// for use in maps with a "model" key set
+void spawnfunc_misc_breakablemodel() {
+ spawnfunc_func_breakable();
+}