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
+18 -39
View File
@@ -182,40 +182,27 @@ bool PoolGroup<T>::CheckPool() const
} }
// Main method to despawn a creature or gameobject in a pool // 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> template<class T>
void PoolGroup<T>::DespawnObject(SpawnedPoolData& spawns, uint64 guid, bool alwaysDeleteRespawnTime) 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>(guid))
{ {
// if spawned Despawn1Object(spawns, guid, alwaysDeleteRespawnTime);
if (spawns.IsSpawnedObject<T>(EqualChanced[i].guid)) spawns.RemoveSpawn<T>(guid, poolId);
{
if (!guid || EqualChanced[i].guid == guid)
{
Despawn1Object(spawns, EqualChanced[i].guid, alwaysDeleteRespawnTime);
spawns.RemoveSpawn<T>(EqualChanced[i].guid, poolId);
}
}
else if (alwaysDeleteRespawnTime)
RemoveRespawnTimeFromDB(spawns, EqualChanced[i].guid);
} }
else if (alwaysDeleteRespawnTime)
RemoveRespawnTimeFromDB(spawns, guid);
}
for (size_t i = 0; i < ExplicitlyChanced.size(); ++i) template <class T>
{ void PoolGroup<T>::DespawnAllObjects(SpawnedPoolData& spawns, bool alwaysDeleteRespawnTime)
// spawned {
if (spawns.IsSpawnedObject<T>(ExplicitlyChanced[i].guid)) for (PoolObject& pooledObject : EqualChanced)
{ DespawnObject(spawns, pooledObject.guid, alwaysDeleteRespawnTime);
if (!guid || ExplicitlyChanced[i].guid == guid)
{ for (PoolObject& pooledObject : ExplicitlyChanced)
Despawn1Object(spawns, ExplicitlyChanced[i].guid, alwaysDeleteRespawnTime); DespawnObject(spawns, pooledObject.guid, alwaysDeleteRespawnTime);
spawns.RemoveSpawn<T>(ExplicitlyChanced[i].guid, poolId);
}
}
else if (alwaysDeleteRespawnTime)
RemoveRespawnTimeFromDB(spawns, ExplicitlyChanced[i].guid);
}
} }
// Method that is actualy doing the removal job on one creature // 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); 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 <> template <>
void PoolGroup<Creature>::RemoveRespawnTimeFromDB(SpawnedPoolData& spawns, uint64 guid) 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); auto it = mPoolCreatureGroups.find(pool_id);
if (it != mPoolCreatureGroups.end() && !it->second.isEmpty()) if (it != mPoolCreatureGroups.end() && !it->second.isEmpty())
it->second.DespawnObject(spawnedPoolData, 0, alwaysDeleteRespawnTime); it->second.DespawnAllObjects(spawnedPoolData, alwaysDeleteRespawnTime);
} }
{ {
auto it = mPoolGameobjectGroups.find(pool_id); auto it = mPoolGameobjectGroups.find(pool_id);
if (it != mPoolGameobjectGroups.end() && !it->second.isEmpty()) if (it != mPoolGameobjectGroups.end() && !it->second.isEmpty())
it->second.DespawnObject(spawnedPoolData, 0, alwaysDeleteRespawnTime); it->second.DespawnAllObjects(spawnedPoolData, alwaysDeleteRespawnTime);
} }
{ {
auto it = mPoolPoolGroups.find(pool_id); auto it = mPoolPoolGroups.find(pool_id);
if (it != mPoolPoolGroups.end() && !it->second.isEmpty()) 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; bool isEmptyDeepCheck() const;
void AddEntry(PoolObject& poolitem, uint32 maxentries); void AddEntry(PoolObject& poolitem, uint32 maxentries);
bool CheckPool() const; 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 Despawn1Object(SpawnedPoolData& spawns, uint64 guid, bool alwaysDeleteRespawnTime = false, bool saveRespawnTime = true);
void SpawnObject(SpawnedPoolData& spawns, uint32 limit, uint64 triggerFrom); void SpawnObject(SpawnedPoolData& spawns, uint32 limit, uint64 triggerFrom);
void RemoveRespawnTimeFromDB(SpawnedPoolData& spawns, uint64 guid); void RemoveRespawnTimeFromDB(SpawnedPoolData& spawns, uint64 guid);
void Spawn1Object(SpawnedPoolData& spawns, PoolObject* obj); void Spawn1Object(SpawnedPoolData& spawns, PoolObject* obj);
void ReSpawn1Object(SpawnedPoolData& spawns, PoolObject* obj);
void RemoveOneRelation(uint32 child_pool_id); void RemoveOneRelation(uint32 child_pool_id);
uint32 GetPoolId() const { return poolId; } uint32 GetPoolId() const { return poolId; }
private: private: