diff options
-rwxr-xr-x | src/server/game/AI/CreatureAI.h | 3 | ||||
-rwxr-xr-x | src/server/game/Entities/Creature/Creature.cpp | 11 |
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 |