aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Maps/Map.cpp15
-rw-r--r--src/server/game/Maps/Map.h6
-rw-r--r--src/server/game/Pools/PoolMgr.cpp55
-rw-r--r--src/server/game/Pools/PoolMgr.h5
4 files changed, 65 insertions, 16 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index ee428f70244..091c7c4f88e 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -3330,15 +3330,20 @@ void Map::DeleteRespawnInfo(RespawnInfo* info, CharacterDatabaseTransaction dbTr
_respawnTimes.erase(info->handle);
// database
+ DeleteRespawnInfoFromDB(info->type, info->spawnId, dbTrans);
+
+ // then cleanup the object
+ delete info;
+}
+
+void Map::DeleteRespawnInfoFromDB(SpawnObjectType type, ObjectGuid::LowType spawnId, CharacterDatabaseTransaction dbTrans)
+{
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_RESPAWN);
- stmt->setUInt16(0, info->type);
- stmt->setUInt64(1, info->spawnId);
+ stmt->setUInt16(0, type);
+ stmt->setUInt64(1, spawnId);
stmt->setUInt16(2, GetId());
stmt->setUInt32(3, GetInstanceId());
CharacterDatabase.ExecuteOrAppend(dbTrans, stmt);
-
- // then cleanup the object
- delete info;
}
void Map::DoRespawn(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 gridId)
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index e5319376181..a1ab26b7ee8 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -753,6 +753,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
bool AddRespawnInfo(RespawnInfo const& info);
void UnloadAllRespawnInfos();
void DeleteRespawnInfo(RespawnInfo* info, CharacterDatabaseTransaction dbTrans = nullptr);
+ void DeleteRespawnInfoFromDB(SpawnObjectType type, ObjectGuid::LowType spawnId, CharacterDatabaseTransaction dbTrans = nullptr);
public:
void GetRespawnInfo(std::vector<RespawnInfo*>& respawnData, SpawnObjectTypeMask types) const;
@@ -763,10 +764,13 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
Respawn(info, dbTrans);
}
void Respawn(RespawnInfo* info, CharacterDatabaseTransaction dbTrans = nullptr);
- void RemoveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, CharacterDatabaseTransaction dbTrans = nullptr)
+ void RemoveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, CharacterDatabaseTransaction dbTrans = nullptr, bool alwaysDeleteFromDB = false)
{
if (RespawnInfo* info = GetRespawnInfo(type, spawnId))
DeleteRespawnInfo(info, dbTrans);
+ // Some callers might need to make sure the database doesn't contain any respawn time
+ else if (alwaysDeleteFromDB)
+ DeleteRespawnInfoFromDB(type, spawnId, dbTrans);
}
size_t DespawnAll(SpawnObjectType type, ObjectGuid::LowType spawnId);
diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp
index 070323fc99d..c8f410e90e7 100644
--- a/src/server/game/Pools/PoolMgr.cpp
+++ b/src/server/game/Pools/PoolMgr.cpp
@@ -140,7 +140,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, uint64 guid)
+void PoolGroup<T>::DespawnObject(ActivePoolData& spawns, uint64 guid, bool alwaysDeleteRespawnTime)
{
for (size_t i=0; i < EqualChanced.size(); ++i)
{
@@ -149,10 +149,12 @@ void PoolGroup<T>::DespawnObject(ActivePoolData& spawns, uint64 guid)
{
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)
@@ -162,16 +164,18 @@ void PoolGroup<T>::DespawnObject(ActivePoolData& spawns, uint64 guid)
{
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(uint64 guid)
+void PoolGroup<Creature>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime)
{
if (CreatureData const* data = sObjectMgr->GetCreatureData(guid))
{
@@ -190,13 +194,16 @@ void PoolGroup<Creature>::Despawn1Object(uint64 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(uint64 guid)
+void PoolGroup<GameObject>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime)
{
if (GameObjectData const* data = sObjectMgr->GetGameObjectData(guid))
{
@@ -216,13 +223,16 @@ void PoolGroup<GameObject>::Despawn1Object(uint64 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(uint64 child_pool_id)
+void PoolGroup<Pool>::Despawn1Object(uint64 child_pool_id, bool /*alwaysDeleteRespawnTime*/)
{
sPoolMgr->DespawnPool(child_pool_id);
}
@@ -380,6 +390,35 @@ void PoolGroup<GameObject>::ReSpawn1Object(PoolObject* /*obj*/)
template <>
void PoolGroup<Pool>::ReSpawn1Object(PoolObject* /*obj*/) { }
+template <>
+void PoolGroup<Creature>::RemoveRespawnTimeFromDB(uint64 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(uint64 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(uint64 /*guid*/) { }
+
////////////////////////////////////////////////////////////
// Methods of class PoolMgr
@@ -737,12 +776,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 215cbdb0f8b..5ee3b295640 100644
--- a/src/server/game/Pools/PoolMgr.h
+++ b/src/server/game/Pools/PoolMgr.h
@@ -78,9 +78,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, uint64 guid=0);
- void Despawn1Object(uint64 guid);
+ void DespawnObject(ActivePoolData& spawns, uint64 guid=0, bool alwaysDeleteRespawnTime = false);
+ void Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime = false);
void SpawnObject(ActivePoolData& spawns, uint32 limit, uint64 triggerFrom);
+ void RemoveRespawnTimeFromDB(uint64 guid);
void Spawn1Object(PoolObject* obj);
void ReSpawn1Object(PoolObject* obj);