diff options
author | Machiavelli <none@none> | 2010-12-24 16:18:23 +0100 |
---|---|---|
committer | Machiavelli <none@none> | 2010-12-24 16:18:23 +0100 |
commit | f690338de16d47dac4c1a5c464f0b6f13875b7a6 (patch) | |
tree | 6360a483bd13b911f86ede70db5456c6039a44e9 /src | |
parent | fe1de5b1db38e6b36a3f77378d18a17cf8016091 (diff) |
Core/CreatureAI: Add virtual bool CanRespawn().
This method will be checked on Creature::Update with deathstate ¨DEAD¨, and allows inherited scripts to manipulate respawn behaviour based on scripted events.
--HG--
branch : trunk
Diffstat (limited to 'src')
-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 |