]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Clean up monster death counter checks
authorMario <mario.mario@y7mail.com>
Sat, 12 Oct 2013 06:55:57 +0000 (17:55 +1100)
committerMario <mario.mario@y7mail.com>
Sat, 12 Oct 2013 06:55:57 +0000 (17:55 +1100)
qcsrc/common/monsters/sv_monsters.qc
qcsrc/server/defs.qh
qcsrc/server/t_items.qc

index 514c0fb580a57be25c92fe043e9ccd82faa06758..12f9acb4f8524181764c39a5639807265ff11621 100644 (file)
@@ -9,9 +9,11 @@ void monster_item_spawn()
                self.monster_loot();
 
        self.gravity = 1;
+       self.reset = SUB_Remove;
+       self.noalign = TRUE;
        self.velocity = randomvec() * 175 + '0 0 325';
        self.classname = "droppedweapon"; // hax
-       self.wait = time + 0.7;
+       self.item_spawnshieldtime = time + 0.7;
 
        SUB_SetFade(self, time + autocvar_g_monsters_drop_time, 1);
 }
@@ -337,6 +339,7 @@ void Monster_CheckMinibossFlag ()
 float Monster_CanRespawn(entity ent)
 {
        other = ent;
+       if(ent.deadflag == DEAD_DEAD) // don't call when monster isn't dead
        if(MUTATOR_CALLHOOK(MonsterRespawn))
                return TRUE; // enabled by a mutator
 
@@ -371,13 +374,7 @@ void Monster_Fade ()
                setmodel(self, "null");
        }
        else
-       {
-               if(IS_CLIENT(self.realowner))
-               if not(self.monster_respawned)
-                       self.realowner.monstercount -= 1;
-               
                SUB_SetFade(self, time + 3, 1);
-       }
 }
 
 float Monster_CanJump (vector vel)
@@ -708,10 +705,9 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_
 
 void monster_dead_think()
 {
-       self.think = monster_dead_think;
        self.nextthink = time + self.ticrate;
-
-       self.deadflag = DEAD_DEAD;
+       
+       CSQCMODEL_AUTOUPDATE();
 
        if(self.ltime != 0)
        if(time >= self.ltime)
@@ -719,8 +715,6 @@ void monster_dead_think()
                Monster_Fade();
                return;
        }
-       
-       CSQCMODEL_AUTOUPDATE();
 }
 
 void monsters_setstatus()
@@ -783,15 +777,18 @@ void monsters_corpse_damage (entity inflictor, entity attacker, float damage, fl
        }
 }
 
-void monster_die(entity attacker)
+void monster_die(entity attacker, float gibbed)
 {
        self.think = monster_dead_think;
-       self.nextthink = self.ticrate;
+       self.nextthink = time;
        self.ltime = time + 5;
        
-       Unfreeze(self); // remove any icy remains
-       self.health = 0; // reset by Unfreeze
-
+       if ( self.frozen )
+       {
+               Unfreeze(self); // remove any icy remains
+               self.health = 0; // reset by Unfreeze
+       }
+       
        monster_dropitem();
 
        MonsterSound(monstersound_death, 0, FALSE, CH_VOICE);
@@ -804,6 +801,15 @@ void monster_die(entity attacker)
                        ( !(self.spawnflags & MONSTERFLAG_SPAWNED) && !self.monster_respawned) )
                PlayerScore_Add(attacker, SP_SCORE, +autocvar_g_monsters_score_kill);
 
+       if(!Monster_CanRespawn(self) || gibbed)
+       {
+               // number of monsters spawned with mobspawn command
+               totalspawned -= 1;
+               
+               if(IS_CLIENT(self.realowner))
+               if not(self.monster_respawned)
+                       self.realowner.monstercount -= 1;
+       }
 
        if(self.candrop && self.weapon)
                W_ThrowNewWeapon(self, self.weapon, 0, self.origin, randomvec() * 150 + '0 0 325');
@@ -811,6 +817,7 @@ void monster_die(entity attacker)
        self.event_damage       = monsters_corpse_damage;
        self.solid                      = SOLID_CORPSE;
        self.takedamage         = DAMAGE_AIM;
+       self.deadflag           = DEAD_DEAD;
        self.enemy                      = world;
        self.movetype           = MOVETYPE_TOSS;
        self.moveto                     = self.origin;
@@ -822,14 +829,12 @@ void monster_die(entity attacker)
        if not(self.flags & FL_FLY)
                self.velocity = '0 0 0';
 
-       // number of monsters spawned with mobspawn command
-       totalspawned -= 1;
-
        MON_ACTION(self.monsterid, MR_DEATH);
 }
 
 void monsters_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
+       
        if(self.frozen && deathtype != DEATH_KILL)
                return;
 
@@ -877,7 +882,7 @@ void monsters_damage (entity inflictor, entity attacker, float damage, float dea
                SUB_UseTargets();
                self.target2 = self.oldtarget2; // reset to original target on death, incase we respawn
 
-               monster_die(attacker);
+               monster_die(attacker, (self.health <= -100 || deathtype == DEATH_KILL));
                
                WaypointSprite_Kill(self.sprite);
                
@@ -888,10 +893,6 @@ void monsters_damage (entity inflictor, entity attacker, float damage, float dea
                if(self.health <= -100 || deathtype == DEATH_KILL) // check if we're already gibbed
                {
                        Violence_GibSplash(self, 1, 0.5, attacker);
-                       
-                       if(IS_CLIENT(self.realowner))
-                       if not(self.monster_respawned)
-                               self.realowner.monstercount -= 1;
 
                        self.think = SUB_Remove;
                        self.nextthink = time + 0.1;
index 6d720f1b4be9d1d22370761dd803044eb870efad..afe376be2efe57c017fe635bfd61c0ee8521cb74 100644 (file)
@@ -242,6 +242,7 @@ float game_completion_ratio; // 0 at start, 1 near end
 float nJoinAllowed(entity ignore);
 
 .float spawnshieldtime;
+.float item_spawnshieldtime;
 
 .entity flagcarried;
 
index 94734f1fe41c183987987bc88bbd91253b16a0eb..2020b38a34c08afe64c801152bf27331204406a5 100644 (file)
@@ -690,7 +690,7 @@ void Item_Touch (void)
                return;
        if (self.owner == other)
                return;
-       if (time < self.wait)
+       if (time < self.item_spawnshieldtime)
                return;
 
        switch(MUTATOR_CALLHOOK(ItemTouch))