diff options
author | treeston <treeston.mmoc@gmail.com> | 2016-08-25 23:04:21 +0200 |
---|---|---|
committer | joschiwald <joschiwald.trinity@gmail.com> | 2017-02-18 17:16:10 +0100 |
commit | 5c01d140566278e0b46c5cbe50ba25ab09c20ead (patch) | |
tree | 3806c6ef47d88c5b4286299c47cb70aa7f7c3536 /src | |
parent | 668abbf18bc2f3201d938089c0a0c1494cabef98 (diff) |
Entities/Creature: Add arg2 to DespawnOrUnsummon to allow overriding respawn time. This matches changes that will be merged as part of dynamic spawning, allowing scripts to transition early.
(cherry picked from commit 4bcc8078d734ccf166533e504db703ded6968339)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 26 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/Creature.h | 9 |
3 files changed, 26 insertions, 20 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index b749cb4aac4..56cd0ae6448 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -562,16 +562,7 @@ void BossAI::_DespawnAtEvade(uint32 delayToRespawn, Creature* who) return; } - uint32 corpseDelay = who->GetCorpseDelay(); - uint32 respawnDelay = who->GetRespawnDelay(); - - who->SetCorpseDelay(1); - who->SetRespawnDelay(delayToRespawn - 1); - - who->DespawnOrUnsummon(); - - who->SetCorpseDelay(corpseDelay); - who->SetRespawnDelay(respawnDelay); + me->DespawnOrUnsummon(0, Seconds(delayToRespawn)); if (instance && who == me) instance->SetBossState(_bossId, FAIL); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 8e16c9e0c17..dc3dfd4c939 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -175,7 +175,7 @@ CreatureBaseStats const* CreatureBaseStats::GetBaseStats(uint8 level, uint8 unit bool ForcedDespawnDelayEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/) { - m_owner.DespawnOrUnsummon(); // since we are here, we are not TempSummon as object type cannot change during runtime + m_owner.DespawnOrUnsummon(0, m_respawnTimer); // since we are here, we are not TempSummon as object type cannot change during runtime return true; } @@ -1800,28 +1800,42 @@ void Creature::Respawn(bool force) UpdateObjectVisibility(); } -void Creature::ForcedDespawn(uint32 timeMSToDespawn) +void Creature::ForcedDespawn(uint32 timeMSToDespawn, Seconds const& forceRespawnTimer) { if (timeMSToDespawn) { - ForcedDespawnDelayEvent* pEvent = new ForcedDespawnDelayEvent(*this); + ForcedDespawnDelayEvent* pEvent = new ForcedDespawnDelayEvent(*this, forceRespawnTimer); m_Events.AddEvent(pEvent, m_Events.CalculateTime(timeMSToDespawn)); return; } if (IsAlive()) - setDeathState(JUST_DIED); + { + if (forceRespawnTimer > Seconds::zero()) + { + uint32 respawnDelay = m_respawnDelay; + uint32 corpseDelay = m_corpseDelay; + m_respawnDelay = forceRespawnTimer.count(); + m_corpseDelay = 0; + setDeathState(JUST_DIED); + + m_respawnDelay = respawnDelay; + m_corpseDelay = corpseDelay; + } + else + setDeathState(JUST_DIED); + } RemoveCorpse(false); } -void Creature::DespawnOrUnsummon(uint32 msTimeToDespawn /*= 0*/) +void Creature::DespawnOrUnsummon(uint32 msTimeToDespawn /*= 0*/, Seconds const& forceRespawnTimer /*= 0*/) { if (TempSummon* summon = this->ToTempSummon()) summon->UnSummon(msTimeToDespawn); else - ForcedDespawn(msTimeToDespawn); + ForcedDespawn(msTimeToDespawn, forceRespawnTimer); } bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo) const diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 51a5b3b93e6..1d5293d2a4c 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -858,8 +858,8 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma void RemoveCorpse(bool setSpawnTime = true); - void DespawnOrUnsummon(uint32 msTimeToDespawn = 0); - void DespawnOrUnsummon(Milliseconds const& time) { DespawnOrUnsummon(uint32(time.count())); } + void DespawnOrUnsummon(uint32 msTimeToDespawn = 0, Seconds const& forceRespawnTime = Seconds(0)); + void DespawnOrUnsummon(Milliseconds const& time, Seconds const& forceRespawnTime = Seconds(0)) { DespawnOrUnsummon(uint32(time.count()), forceRespawnTime); } time_t const& GetRespawnTime() const { return m_respawnTime; } time_t GetRespawnTimeEx() const; @@ -1009,7 +1009,7 @@ class TC_GAME_API Creature : public Unit, public GridObject<Creature>, public Ma bool CanAlwaysSee(WorldObject const* obj) const override; private: - void ForcedDespawn(uint32 timeMSToDespawn = 0); + void ForcedDespawn(uint32 timeMSToDespawn = 0, Seconds const& forceRespawnTimer = Seconds(0)); bool CheckNoGrayAggroConfig(uint32 playerLevel, uint32 creatureLevel) const; // No aggro from gray creatures //WaypointMovementGenerator vars @@ -1048,11 +1048,12 @@ class TC_GAME_API AssistDelayEvent : public BasicEvent class TC_GAME_API ForcedDespawnDelayEvent : public BasicEvent { public: - ForcedDespawnDelayEvent(Creature& owner) : BasicEvent(), m_owner(owner) { } + ForcedDespawnDelayEvent(Creature& owner, Seconds const& respawnTimer) : BasicEvent(), m_owner(owner), m_respawnTimer(respawnTimer) { } bool Execute(uint64 e_time, uint32 p_time) override; private: Creature& m_owner; + Seconds const m_respawnTimer; }; #endif |