Core/Pools: Remove ReSpawn1Object and optimize single object despawn case in DespawnObject

(cherry picked from commit 4be538f521a9ebbbb1d054d05bd87bc4df4e5ee0)
This commit is contained in:
Shauren
2026-06-25 23:54:26 +02:00
parent 873906ba11
commit d956ceba27
2 changed files with 20 additions and 41 deletions
+16 -37
View File
@@ -182,40 +182,27 @@ bool PoolGroup<T>::CheckPool() const
}
// Main method to despawn a creature or gameobject in a pool
// 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(SpawnedPoolData& spawns, uint64 guid, bool alwaysDeleteRespawnTime)
{
for (size_t i=0; i < EqualChanced.size(); ++i)
{
// if spawned
if (spawns.IsSpawnedObject<T>(EqualChanced[i].guid))
if (spawns.IsSpawnedObject<T>(guid))
{
if (!guid || EqualChanced[i].guid == guid)
{
Despawn1Object(spawns, EqualChanced[i].guid, alwaysDeleteRespawnTime);
spawns.RemoveSpawn<T>(EqualChanced[i].guid, poolId);
}
Despawn1Object(spawns, guid, alwaysDeleteRespawnTime);
spawns.RemoveSpawn<T>(guid, poolId);
}
else if (alwaysDeleteRespawnTime)
RemoveRespawnTimeFromDB(spawns, EqualChanced[i].guid);
}
RemoveRespawnTimeFromDB(spawns, guid);
}
for (size_t i = 0; i < ExplicitlyChanced.size(); ++i)
{
// spawned
if (spawns.IsSpawnedObject<T>(ExplicitlyChanced[i].guid))
{
if (!guid || ExplicitlyChanced[i].guid == guid)
{
Despawn1Object(spawns, ExplicitlyChanced[i].guid, alwaysDeleteRespawnTime);
spawns.RemoveSpawn<T>(ExplicitlyChanced[i].guid, poolId);
}
}
else if (alwaysDeleteRespawnTime)
RemoveRespawnTimeFromDB(spawns, ExplicitlyChanced[i].guid);
}
template <class T>
void PoolGroup<T>::DespawnAllObjects(SpawnedPoolData& spawns, bool alwaysDeleteRespawnTime)
{
for (PoolObject& pooledObject : EqualChanced)
DespawnObject(spawns, pooledObject.guid, alwaysDeleteRespawnTime);
for (PoolObject& pooledObject : ExplicitlyChanced)
DespawnObject(spawns, pooledObject.guid, alwaysDeleteRespawnTime);
}
// Method that is actualy doing the removal job on one creature
@@ -390,14 +377,6 @@ void PoolGroup<Pool>::Spawn1Object(SpawnedPoolData& spawns, PoolObject* obj)
sPoolMgr->SpawnPool(spawns, obj->guid);
}
// Method that does the respawn job on the specified object
template <typename T>
void PoolGroup<T>::ReSpawn1Object(SpawnedPoolData& spawns, PoolObject* obj)
{
Despawn1Object(spawns, obj->guid, false, false);
Spawn1Object(spawns, obj);
}
template <>
void PoolGroup<Creature>::RemoveRespawnTimeFromDB(SpawnedPoolData& spawns, uint64 guid)
{
@@ -803,17 +782,17 @@ void PoolMgr::DespawnPool(SpawnedPoolData& spawnedPoolData, uint32 pool_id, bool
{
auto it = mPoolCreatureGroups.find(pool_id);
if (it != mPoolCreatureGroups.end() && !it->second.isEmpty())
it->second.DespawnObject(spawnedPoolData, 0, alwaysDeleteRespawnTime);
it->second.DespawnAllObjects(spawnedPoolData, alwaysDeleteRespawnTime);
}
{
auto it = mPoolGameobjectGroups.find(pool_id);
if (it != mPoolGameobjectGroups.end() && !it->second.isEmpty())
it->second.DespawnObject(spawnedPoolData, 0, alwaysDeleteRespawnTime);
it->second.DespawnAllObjects(spawnedPoolData, alwaysDeleteRespawnTime);
}
{
auto it = mPoolPoolGroups.find(pool_id);
if (it != mPoolPoolGroups.end() && !it->second.isEmpty())
it->second.DespawnObject(spawnedPoolData, 0, alwaysDeleteRespawnTime);
it->second.DespawnAllObjects(spawnedPoolData, alwaysDeleteRespawnTime);
}
}
+2 -2
View File
@@ -101,13 +101,13 @@ class TC_GAME_API PoolGroup
bool isEmptyDeepCheck() const;
void AddEntry(PoolObject& poolitem, uint32 maxentries);
bool CheckPool() const;
void DespawnObject(SpawnedPoolData& spawns, uint64 guid=0, bool alwaysDeleteRespawnTime = false);
void DespawnObject(SpawnedPoolData& spawns, uint64 guid, bool alwaysDeleteRespawnTime = false);
void DespawnAllObjects(SpawnedPoolData& spawns, bool alwaysDeleteRespawnTime = false);
void Despawn1Object(SpawnedPoolData& spawns, uint64 guid, bool alwaysDeleteRespawnTime = false, bool saveRespawnTime = true);
void SpawnObject(SpawnedPoolData& spawns, uint32 limit, uint64 triggerFrom);
void RemoveRespawnTimeFromDB(SpawnedPoolData& spawns, uint64 guid);
void Spawn1Object(SpawnedPoolData& spawns, PoolObject* obj);
void ReSpawn1Object(SpawnedPoolData& spawns, PoolObject* obj);
void RemoveOneRelation(uint32 child_pool_id);
uint32 GetPoolId() const { return poolId; }
private: