aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMachiavelli <none@none>2010-12-24 16:18:23 +0100
committerMachiavelli <none@none>2010-12-24 16:18:23 +0100
commitf690338de16d47dac4c1a5c464f0b6f13875b7a6 (patch)
tree6360a483bd13b911f86ede70db5456c6039a44e9 /src
parentfe1de5b1db38e6b36a3f77378d18a17cf8016091 (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-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