From: Mario Date: Sat, 12 Oct 2013 06:55:57 +0000 (+1100) Subject: Clean up monster death counter checks X-Git-Tag: xonotic-v0.8.0~241^2^2~57 X-Git-Url: http://de.git.xonotic.org/?a=commitdiff_plain;h=2d297757fa597d275a9e64e5db36095d018a9518;p=xonotic%2Fxonotic-data.pk3dir.git Clean up monster death counter checks --- diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index 514c0fb58..12f9acb4f 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -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; diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 6d720f1b4..afe376be2 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -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; diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 94734f1fe..2020b38a3 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -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))