diff options
Diffstat (limited to 'src/server/game/Maps/Map.cpp')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 93 |
1 files changed, 53 insertions, 40 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 3f50c404f54..bd597e9ad88 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3719,71 +3719,84 @@ bool Map::ActiveObjectsNearGrid(NGridType const& ngrid) const return false; } -template<class T> -void Map::AddToActive(T* obj) +void Map::AddToActive(WorldObject* obj) { AddToActiveHelper(obj); -} -template <> -void Map::AddToActive(Creature* c) -{ - AddToActiveHelper(c); + Optional<Position> respawnLocation; + switch (obj->GetTypeId()) + { + case TYPEID_UNIT: + if (Creature* creature = obj->ToCreature(); !creature->IsPet() && creature->GetSpawnId()) + { + respawnLocation.emplace(); + creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ); + } + break; + case TYPEID_GAMEOBJECT: + if (GameObject* gameObject = obj->ToGameObject(); gameObject->GetSpawnId()) + { + respawnLocation.emplace(); + gameObject->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ); + } + break; + default: + break; + } - // also not allow unloading spawn grid to prevent creating creature clone at load - if (!c->IsPet() && c->GetSpawnId()) + if (respawnLocation) { - float x, y, z; - c->GetRespawnPosition(x, y, z); - GridCoord p = Trinity::ComputeGridCoord(x, y); + GridCoord p = Trinity::ComputeGridCoord(respawnLocation->GetPositionX(), respawnLocation->GetPositionY()); if (getNGrid(p.x_coord, p.y_coord)) getNGrid(p.x_coord, p.y_coord)->incUnloadActiveLock(); else { - GridCoord p2 = Trinity::ComputeGridCoord(c->GetPositionX(), c->GetPositionY()); - TC_LOG_ERROR("maps", "Active creature{} added to grid[{}, {}] but spawn grid[{}, {}] was not loaded.", - c->GetGUID().ToString(), p.x_coord, p.y_coord, p2.x_coord, p2.y_coord); + GridCoord p2 = Trinity::ComputeGridCoord(obj->GetPositionX(), obj->GetPositionY()); + TC_LOG_ERROR("maps", "Active object {} added to grid[{}, {}] but spawn grid[{}, {}] was not loaded.", + obj->GetGUID().ToString(), p.x_coord, p.y_coord, p2.x_coord, p2.y_coord); } } } -template<> -void Map::AddToActive(DynamicObject* d) +void Map::RemoveFromActive(WorldObject* obj) { - AddToActiveHelper(d); -} - -template<class T> -void Map::RemoveFromActive(T* /*obj*/) { } + RemoveFromActiveHelper(obj); -template <> -void Map::RemoveFromActive(Creature* c) -{ - RemoveFromActiveHelper(c); + Optional<Position> respawnLocation; + switch (obj->GetTypeId()) + { + case TYPEID_UNIT: + if (Creature* creature = obj->ToCreature(); !creature->IsPet() && creature->GetSpawnId()) + { + respawnLocation.emplace(); + creature->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ); + } + break; + case TYPEID_GAMEOBJECT: + if (GameObject* gameObject = obj->ToGameObject(); gameObject->GetSpawnId()) + { + respawnLocation.emplace(); + gameObject->GetRespawnPosition(respawnLocation->m_positionX, respawnLocation->m_positionY, respawnLocation->m_positionZ); + } + break; + default: + break; + } - // also allow unloading spawn grid - if (!c->IsPet() && c->GetSpawnId()) + if (respawnLocation) { - float x, y, z; - c->GetRespawnPosition(x, y, z); - GridCoord p = Trinity::ComputeGridCoord(x, y); + GridCoord p = Trinity::ComputeGridCoord(respawnLocation->GetPositionX(), respawnLocation->GetPositionY()); if (getNGrid(p.x_coord, p.y_coord)) getNGrid(p.x_coord, p.y_coord)->decUnloadActiveLock(); else { - GridCoord p2 = Trinity::ComputeGridCoord(c->GetPositionX(), c->GetPositionY()); - TC_LOG_ERROR("maps", "Active creature {} removed from grid[{}, {}] but spawn grid[{}, {}] was not loaded.", - c->GetGUID().ToString(), p.x_coord, p.y_coord, p2.x_coord, p2.y_coord); + GridCoord p2 = Trinity::ComputeGridCoord(obj->GetPositionX(), obj->GetPositionY()); + TC_LOG_ERROR("maps", "Active object {} removed from grid[{}, {}] but spawn grid[{}, {}] was not loaded.", + obj->GetGUID().ToString(), p.x_coord, p.y_coord, p2.x_coord, p2.y_coord); } } } -template<> -void Map::RemoveFromActive(DynamicObject* obj) -{ - RemoveFromActiveHelper(obj); -} - template TC_GAME_API bool Map::AddToMap(Corpse*); template TC_GAME_API bool Map::AddToMap(Creature*); template TC_GAME_API bool Map::AddToMap(GameObject*); |