From e3a7613f56b098a997abe40c9ddc0b60fff4cb0d Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Mon, 20 Nov 2023 12:18:48 -0300 Subject: [PATCH] fix(Core/Creature): Move DespawnOnEvade() respawn handling to map level (#17806) --- src/server/game/Entities/Creature/Creature.cpp | 6 ++++-- src/server/game/Maps/Map.cpp | 13 +++++++++++++ src/server/game/Maps/Map.h | 5 +++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index ed0b8f2de..f3b89175e 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -2102,8 +2102,10 @@ void Creature::ForcedDespawn(uint32 timeMSToDespawn, Seconds forceRespawnTimer) if (forceRespawnTimer > Seconds::zero()) { - m_respawnTime = GameTime::GetGameTime().count() + forceRespawnTimer.count(); - m_respawnDelay = forceRespawnTimer.count(); + if (GetMap()) + { + GetMap()->ScheduleCreatureRespawn(GetGUID(), forceRespawnTimer); + } } } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 5f6a1418e..5f22376d5 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -754,6 +754,8 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) } } + _creatureRespawnScheduler.Update(t_diff); + if (!t_diff) { for (m_mapRefIter = m_mapRefMgr.begin(); m_mapRefIter != m_mapRefMgr.end(); ++m_mapRefIter) @@ -3695,6 +3697,17 @@ void Map::RemoveOldCorpses() } } +void Map::ScheduleCreatureRespawn(ObjectGuid creatureGuid, Milliseconds respawnTimer) +{ + _creatureRespawnScheduler.Schedule(respawnTimer, [this, creatureGuid](TaskContext) + { + if (Creature* creature = GetCreature(creatureGuid)) + { + creature->Respawn(); + } + }); +} + void Map::SendZoneDynamicInfo(Player* player) { uint32 zoneId = player->GetZoneId(); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index 0bf6b9c18..7cafb39ff 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -32,6 +32,7 @@ #include "PathGenerator.h" #include "Position.h" #include "SharedDefines.h" +#include "TaskScheduler.h" #include "Timer.h" #include #include @@ -594,6 +595,10 @@ public: void DeleteRespawnTimes(); [[nodiscard]] time_t GetInstanceResetPeriod() const { return _instanceResetPeriod; } + TaskScheduler _creatureRespawnScheduler; + + void ScheduleCreatureRespawn(ObjectGuid /*creatureGuid*/, Milliseconds /*respawnTimer*/); + void LoadCorpseData(); void DeleteCorpseData(); void AddCorpse(Corpse* corpse);