aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/AI/CreatureAI.h3
-rwxr-xr-xsrc/server/game/Entities/Creature/Creature.cpp11
2 files changed, 11 insertions, 3 deletions
diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h
index 98e0e448195..9d2b986da66 100755
--- a/src/server/game/AI/CreatureAI.h
+++ b/src/server/game/AI/CreatureAI.h
@@ -88,6 +88,9 @@ class CreatureAI : public UnitAI
// Called if IsVisible(Unit *who) is true at each *who move, reaction at visibility zone enter
void MoveInLineOfSight_Safe(Unit *who);
+ // Called in Creature::Update when deathstate = DEAD. Inherited classes may maniuplate the ability to respawn based on scripted events.
+ virtual bool CanRespawn() { return true; }
+
// Called for reaction at stopping attack at no attackers or targets
virtual void EnterEvadeMode();
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index f2347e0882f..82498d6874c 100755
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -457,18 +457,23 @@ void Creature::Update(uint32 diff)
break;
case DEAD:
{
- if (m_respawnTime <= time(NULL))
+ time_t now = time(NULL);
+ if (m_respawnTime <= now)
{
+ bool allowed = IsAIEnabled ? AI()->CanRespawn() : true; // First check if there are any scripts that object to us respawning
+ if (!allowed) // Will be rechecked on next Update call
+ break;
+
if (!GetLinkedCreatureRespawnTime()) // Can respawn
Respawn();
- else // the master is dead
+ else // the master is dead
{
if (uint32 targetGuid = sObjectMgr->GetLinkedRespawnGuid(m_DBTableGuid))
{
if (targetGuid == m_DBTableGuid) // if linking self, never respawn (check delayed to next day)
SetRespawnTime(DAY);
else
- m_respawnTime = (time(NULL)>GetLinkedCreatureRespawnTime()? time(NULL):GetLinkedCreatureRespawnTime())+urand(5,MINUTE); // else copy time from master and add a little
+ m_respawnTime = (now > GetLinkedCreatureRespawnTime() ? now : GetLinkedCreatureRespawnTime())+urand(5,MINUTE); // else copy time from master and add a little
SaveRespawnTime(); // also save to DB immediately
}
else