aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp7
-rw-r--r--src/server/game/Maps/Map.cpp3
-rw-r--r--src/server/game/Pools/PoolMgr.cpp26
-rw-r--r--src/server/game/Pools/PoolMgr.h2
4 files changed, 23 insertions, 15 deletions
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 5a02af396fc..62b77a930c2 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1805,9 +1805,12 @@ bool Creature::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap,
return false;
}
}
+ else
+ {
+ // compatibility mode creatures will be respawned in ::Update()
+ m_deathState = DEAD;
+ }
- // compatibility mode creatures will be respawned in ::Update()
- m_deathState = DEAD;
if (CanFly())
{
float tz = map->GetHeight(GetPhaseShift(), data->spawnPoint, true, MAX_FALL_DISTANCE);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index a0bc1b4cb33..de95c08b4ac 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -3399,6 +3399,7 @@ void Map::ProcessRespawns()
sPoolMgr->UpdatePool(poolId, next->type, next->spawnId);
// step 3: get rid of the actual entry
+ RemoveRespawnTime(next->type, next->spawnId, nullptr, true);
delete next;
}
else if (CheckRespawn(next)) // see if we're allowed to respawn
@@ -3411,12 +3412,14 @@ void Map::ProcessRespawns()
DoRespawn(next->type, next->spawnId, next->gridId);
// step 3: get rid of the actual entry
+ RemoveRespawnTime(next->type, next->spawnId, nullptr, true);
delete next;
}
else if (!next->respawnTime)
{ // just remove this respawn entry without rescheduling
_respawnTimes.pop();
ASSERT_NOTNULL(GetRespawnMapForType(next->type))->erase(next->spawnId);
+ RemoveRespawnTime(next->type, next->spawnId, nullptr, true);
delete next;
}
else
diff --git a/src/server/game/Pools/PoolMgr.cpp b/src/server/game/Pools/PoolMgr.cpp
index d86421812b3..4bfc918b2af 100644
--- a/src/server/game/Pools/PoolMgr.cpp
+++ b/src/server/game/Pools/PoolMgr.cpp
@@ -186,7 +186,7 @@ void PoolGroup<T>::DespawnObject(ActivePoolData& spawns, uint64 guid, bool alway
// Method that is actualy doing the removal job on one creature
template<>
-void PoolGroup<Creature>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime)
+void PoolGroup<Creature>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime, bool saveRespawnTime)
{
if (CreatureData const* data = sObjectMgr->GetCreatureData(guid))
{
@@ -201,7 +201,7 @@ void PoolGroup<Creature>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTi
Creature* creature = itr->second;
++itr;
// For dynamic spawns, save respawn time here
- if (!creature->GetRespawnCompatibilityMode())
+ if (saveRespawnTime && !creature->GetRespawnCompatibilityMode())
creature->SaveRespawnTime();
creature->AddObjectToRemoveList();
}
@@ -214,7 +214,7 @@ void PoolGroup<Creature>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTi
// Same on one gameobject
template<>
-void PoolGroup<GameObject>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime)
+void PoolGroup<GameObject>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime, bool saveRespawnTime)
{
if (GameObjectData const* data = sObjectMgr->GetGameObjectData(guid))
{
@@ -230,7 +230,7 @@ void PoolGroup<GameObject>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawn
++itr;
// For dynamic spawns, save respawn time here
- if (!go->GetRespawnCompatibilityMode())
+ if (saveRespawnTime && !go->GetRespawnCompatibilityMode())
go->SaveRespawnTime();
go->AddObjectToRemoveList();
}
@@ -243,7 +243,7 @@ void PoolGroup<GameObject>::Despawn1Object(uint64 guid, bool alwaysDeleteRespawn
// Same on one pool
template<>
-void PoolGroup<Pool>::Despawn1Object(uint64 child_pool_id, bool alwaysDeleteRespawnTime)
+void PoolGroup<Pool>::Despawn1Object(uint64 child_pool_id, bool alwaysDeleteRespawnTime, bool /*saveRespawnTime*/)
{
sPoolMgr->DespawnPool(child_pool_id, alwaysDeleteRespawnTime);
}
@@ -296,7 +296,7 @@ void PoolGroup<T>::SpawnObject(ActivePoolData& spawns, uint32 limit, uint64 trig
roll -= obj.chance;
// Triggering object is marked as spawned at this time and can be also rolled (respawn case)
// so this need explicit check for this case
- if (roll < 0 && (/*obj.guid == triggerFrom ||*/ !spawns.IsActiveObject<T>(obj.guid)))
+ if (roll < 0 && (obj.guid == triggerFrom || !spawns.IsActiveObject<T>(obj.guid)))
{
rolledObjects.push_back(obj);
break;
@@ -306,9 +306,9 @@ void PoolGroup<T>::SpawnObject(ActivePoolData& spawns, uint32 limit, uint64 trig
if (!EqualChanced.empty() && rolledObjects.empty())
{
- std::copy_if(EqualChanced.begin(), EqualChanced.end(), std::back_inserter(rolledObjects), [/*triggerFrom, */&spawns](PoolObject const& object)
+ std::copy_if(EqualChanced.begin(), EqualChanced.end(), std::back_inserter(rolledObjects), [triggerFrom, &spawns](PoolObject const& object)
{
- return /*object.guid == triggerFrom ||*/ !spawns.IsActiveObject<T>(object.guid);
+ return object.guid == triggerFrom || !spawns.IsActiveObject<T>(object.guid);
});
Trinity::Containers::RandomResize(rolledObjects, count);
@@ -385,16 +385,18 @@ void PoolGroup<Pool>::Spawn1Object(PoolObject* obj)
// Method that does the respawn job on the specified creature
template <>
-void PoolGroup<Creature>::ReSpawn1Object(PoolObject* /*obj*/)
+void PoolGroup<Creature>::ReSpawn1Object(PoolObject* obj)
{
- // Creature is still on map, nothing to do
+ Despawn1Object(obj->guid, false, false);
+ Spawn1Object(obj);
}
// Method that does the respawn job on the specified gameobject
template <>
-void PoolGroup<GameObject>::ReSpawn1Object(PoolObject* /*obj*/)
+void PoolGroup<GameObject>::ReSpawn1Object(PoolObject* obj)
{
- // GameObject is still on map, nothing to do
+ Despawn1Object(obj->guid, false, false);
+ Spawn1Object(obj);
}
// Nothing to do for a child Pool
diff --git a/src/server/game/Pools/PoolMgr.h b/src/server/game/Pools/PoolMgr.h
index d8c9452caa2..5fb47f3deec 100644
--- a/src/server/game/Pools/PoolMgr.h
+++ b/src/server/game/Pools/PoolMgr.h
@@ -93,7 +93,7 @@ class TC_GAME_API PoolGroup
void AddEntry(PoolObject& poolitem, uint32 maxentries);
bool CheckPool() const;
void DespawnObject(ActivePoolData& spawns, uint64 guid=0, bool alwaysDeleteRespawnTime = false);
- void Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime = false);
+ void Despawn1Object(uint64 guid, bool alwaysDeleteRespawnTime = false, bool saveRespawnTime = true);
void SpawnObject(ActivePoolData& spawns, uint32 limit, uint64 triggerFrom);
void RemoveRespawnTimeFromDB(uint64 guid);