]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/func_breakable.qc
Merge branch 'master' into terencehill/arena_stuff
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / func_breakable.qc
index eb4c8b4de64f5b7dedf6a42a83c677c8a2575aa6..1e474c0d641a34764fb55578f77614927f280f33 100644 (file)
@@ -31,8 +31,6 @@
 //   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);
 
 //
@@ -87,15 +85,18 @@ void func_breakable_look_destroyed()
 {
        local 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;
 }
 
@@ -113,17 +116,21 @@ void func_breakable_behave_destroyed()
        self.takedamage = DAMAGE_NO;
        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.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 +152,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 +162,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 +170,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 +192,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 +249,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 +262,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();
+}