diff options
| author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2020-04-11 12:07:57 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-04-11 14:07:57 +0200 |
| commit | 4f33fd3932d362466ee017111895bf14fcc79c88 (patch) | |
| tree | a446a043eaa8d5b6c84ce0389be85c9e09e85d88 /src/server/game/Pools | |
| parent | eb31ae9b1839ff26246d68584937825bd7ce7932 (diff) | |
Core/Pooling: Remove respawn times from the database when despawning a pool (#24422)
* Core/Pooling: Remove respawn times from the database when despawning a pool
Remove respawn times from the database when despawning a pool. This is needed when a Game Event ends but there are still some respawn times saved in the database.
* Remove respawn time of active pool objects even if they are not spawned
Diffstat (limited to 'src/server/game/Pools')
| -rw-r--r-- | src/server/game/Pools/PoolMgr.cpp | 55 | ||||
| -rw-r--r-- | src/server/game/Pools/PoolMgr.h | 5 |
2 files changed, 50 insertions, 10 deletions
diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp index 45407c4c5aa..d01977151d7 100644 --- a/src/server/game/Pools/PoolMgr.cpp +++ b/src/server/game/Pools/PoolMgr.cpp @@ -133,7 +133,7 @@ bool PoolGroup<T>::CheckPool() const // If no guid is passed, the pool is just removed (event end case) // If guid is filled, cache will be used and no removal will occur, it just fill the cache template<class T> -void PoolGroup<T>::DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType guid) +void PoolGroup<T>::DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType guid, bool alwaysDeleteRespawnTime) { for (size_t i=0; i < EqualChanced.size(); ++i) { @@ -142,10 +142,12 @@ void PoolGroup<T>::DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType gui { if (!guid || EqualChanced[i].guid == guid) { - Despawn1Object(EqualChanced[i].guid); + Despawn1Object(EqualChanced[i].guid, alwaysDeleteRespawnTime); spawns.RemoveObject<T>(EqualChanced[i].guid, poolId); } } + else if (alwaysDeleteRespawnTime) + RemoveRespawnTimeFromDB(EqualChanced[i].guid); } for (size_t i = 0; i < ExplicitlyChanced.size(); ++i) @@ -155,16 +157,18 @@ void PoolGroup<T>::DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType gui { if (!guid || ExplicitlyChanced[i].guid == guid) { - Despawn1Object(ExplicitlyChanced[i].guid); + Despawn1Object(ExplicitlyChanced[i].guid, alwaysDeleteRespawnTime); spawns.RemoveObject<T>(ExplicitlyChanced[i].guid, poolId); } } + else if (alwaysDeleteRespawnTime) + RemoveRespawnTimeFromDB(ExplicitlyChanced[i].guid); } } // Method that is actualy doing the removal job on one creature template<> -void PoolGroup<Creature>::Despawn1Object(ObjectGuid::LowType guid) +void PoolGroup<Creature>::Despawn1Object(ObjectGuid::LowType guid, bool alwaysDeleteRespawnTime) { if (CreatureData const* data = sObjectMgr->GetCreatureData(guid)) { @@ -183,13 +187,16 @@ void PoolGroup<Creature>::Despawn1Object(ObjectGuid::LowType guid) creature->SaveRespawnTime(); creature->AddObjectToRemoveList(); } + + if (alwaysDeleteRespawnTime) + map->RemoveRespawnTime(SpawnObjectType::SPAWN_TYPE_CREATURE, guid, nullptr, true); } } } // Same on one gameobject template<> -void PoolGroup<GameObject>::Despawn1Object(ObjectGuid::LowType guid) +void PoolGroup<GameObject>::Despawn1Object(ObjectGuid::LowType guid, bool alwaysDeleteRespawnTime) { if (GameObjectData const* data = sObjectMgr->GetGameObjectData(guid)) { @@ -209,13 +216,16 @@ void PoolGroup<GameObject>::Despawn1Object(ObjectGuid::LowType guid) go->SaveRespawnTime(); go->AddObjectToRemoveList(); } + + if (alwaysDeleteRespawnTime) + map->RemoveRespawnTime(SpawnObjectType::SPAWN_TYPE_GAMEOBJECT, guid, nullptr, true); } } } // Same on one pool template<> -void PoolGroup<Pool>::Despawn1Object(uint32 child_pool_id) +void PoolGroup<Pool>::Despawn1Object(uint32 child_pool_id, bool /*alwaysDeleteRespawnTime*/) { sPoolMgr->DespawnPool(child_pool_id); } @@ -385,6 +395,35 @@ void PoolGroup<GameObject>::ReSpawn1Object(PoolObject* /*obj*/) template <> void PoolGroup<Pool>::ReSpawn1Object(PoolObject* /*obj*/) { } +template <> +void PoolGroup<Creature>::RemoveRespawnTimeFromDB(ObjectGuid::LowType guid) +{ + if (CreatureData const* data = sObjectMgr->GetCreatureData(guid)) + { + Map* map = sMapMgr->CreateBaseMap(data->mapId); + if (!map->Instanceable()) + { + map->RemoveRespawnTime(SPAWN_TYPE_CREATURE, guid, nullptr, true); + } + } +} + +template <> +void PoolGroup<GameObject>::RemoveRespawnTimeFromDB(ObjectGuid::LowType guid) +{ + if (GameObjectData const* data = sObjectMgr->GetGameObjectData(guid)) + { + Map* map = sMapMgr->CreateBaseMap(data->mapId); + if (!map->Instanceable()) + { + map->RemoveRespawnTime(SPAWN_TYPE_GAMEOBJECT, guid, nullptr, true); + } + } +} + +template <> +void PoolGroup<Pool>::RemoveRespawnTimeFromDB(ObjectGuid::LowType /*guid*/) { } + //////////////////////////////////////////////////////////// // Methods of class PoolMgr @@ -741,12 +780,12 @@ void PoolMgr::DespawnPool(uint32 pool_id) { auto it = mPoolCreatureGroups.find(pool_id); if (it != mPoolCreatureGroups.end() && !it->second.isEmpty()) - it->second.DespawnObject(mSpawnedData); + it->second.DespawnObject(mSpawnedData, 0, true); } { auto it = mPoolGameobjectGroups.find(pool_id); if (it != mPoolGameobjectGroups.end() && !it->second.isEmpty()) - it->second.DespawnObject(mSpawnedData); + it->second.DespawnObject(mSpawnedData, 0, true); } { auto it = mPoolPoolGroups.find(pool_id); diff --git a/src/server/game/Pools/PoolMgr.h b/src/server/game/Pools/PoolMgr.h index 758725117e6..6e870e6eb03 100644 --- a/src/server/game/Pools/PoolMgr.h +++ b/src/server/game/Pools/PoolMgr.h @@ -72,9 +72,10 @@ class TC_GAME_API PoolGroup bool isEmpty() const { return ExplicitlyChanced.empty() && EqualChanced.empty(); } void AddEntry(PoolObject& poolitem, uint32 maxentries); bool CheckPool() const; - void DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType guid=0); - void Despawn1Object(ObjectGuid::LowType guid); + void DespawnObject(ActivePoolData& spawns, ObjectGuid::LowType guid=0, bool alwaysDeleteRespawnTime = false); + void Despawn1Object(ObjectGuid::LowType guid, bool alwaysDeleteRespawnTime = false); void SpawnObject(ActivePoolData& spawns, uint32 limit, uint32 triggerFrom); + void RemoveRespawnTimeFromDB(ObjectGuid::LowType guid); void Spawn1Object(PoolObject* obj); void ReSpawn1Object(PoolObject* obj); |
