X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Ffunc_breakable.qc;h=4d29b014faff68c9528bb954d3d51512e88b6d3e;hb=5119ca4560e0c9864b4a88c91297a43e41947cc2;hp=eb4c8b4de64f5b7dedf6a42a83c677c8a2575aa6;hpb=0e7ed909bffb4ff21f0c68d163edfc17487e380a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/func_breakable.qc b/qcsrc/server/func_breakable.qc index eb4c8b4de..4d29b014f 100644 --- a/qcsrc/server/func_breakable.qc +++ b/qcsrc/server/func_breakable.qc @@ -31,15 +31,13 @@ // Otherwise mdl_dead will be displayed at the map origin, and nobody would // want that! -.vector mins_save, maxs_save; - void func_breakable_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force); // // 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; @@ -67,7 +65,7 @@ void LaunchDebris (string debrisname, vector force) = if(dbr.damageforcescale) dbr.takedamage = DAMAGE_YES; SUB_SetFade(dbr, time + self.debristime + crandom() * self.debristimejitter, self.debrisfadetime); -}; +} void func_breakable_colormod() { @@ -85,17 +83,20 @@ 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 = ""; else { - setmodel(self, self.mdl_dead); if (self.origin == '0 0 0') { // probably no origin brush, so don't spawn in the middle of the map.. floor_z = self.absmin_z; setorigin(self,((self.absmax+self.absmin)*.5)); self.origin_z = floor_z; } + setmodel(self, self.mdl_dead); } self.solid = SOLID_NOT; @@ -104,6 +105,8 @@ void func_breakable_look_destroyed() 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; } @@ -111,19 +114,25 @@ void func_breakable_behave_destroyed() { self.health = self.max_health; self.takedamage = DAMAGE_NO; + self.bot_attack = FALSE; self.event_damage = SUB_Null; self.state = 1; - setsize(self, '0 0 0', '0 0 0'); 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; - setsize(self, self.mins_save, self.maxs_save); + self.nextthink = 0; // cancel auto respawn func_breakable_colormod(); } @@ -145,6 +154,7 @@ void func_breakable_destroy() { string oldmsg; activator = self.owner; + self.owner = world; // set by W_PrepareExplosionByDamage // now throw around the debris n = tokenize_console(self.debris); @@ -154,7 +164,7 @@ void func_breakable_destroy() { 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); @@ -162,6 +172,12 @@ void func_breakable_destroy() { 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(); @@ -178,9 +194,12 @@ void func_breakable_damage(entity inflictor, entity attacker, float damage, floa 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) @@ -232,8 +251,6 @@ void spawnfunc_func_breakable() { self.mdl = self.model; SetBrushEntityModel(); - self.mins_save = self.mins; - self.maxs_save = self.maxs; self.use = func_breakable_restore; @@ -247,7 +264,13 @@ void spawnfunc_func_breakable() { 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(); +}