diff options
-rw-r--r-- | src/server/game/Grids/ObjectGridLoader.cpp | 22 | ||||
-rw-r--r-- | src/server/game/Grids/ObjectGridLoader.h | 4 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 93 | ||||
-rw-r--r-- | src/server/game/Maps/Map.h | 6 |
4 files changed, 59 insertions, 66 deletions
diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp index a6e3d5e52ce..82195be53bb 100644 --- a/src/server/game/Grids/ObjectGridLoader.cpp +++ b/src/server/game/Grids/ObjectGridLoader.cpp @@ -82,32 +82,14 @@ class ObjectWorldLoader uint32& i_corpses; }; -template<class T> -void ObjectGridLoaderBase::SetObjectCell(T* /*obj*/, CellCoord const& /*cellCoord*/) { } - -template<> void ObjectGridLoaderBase::SetObjectCell(Creature* obj, CellCoord const& cellCoord) -{ - Cell cell(cellCoord); - obj->SetCurrentCell(cell); -} - -template<> void ObjectGridLoaderBase::SetObjectCell(GameObject* obj, CellCoord const& cellCoord) +void ObjectGridLoaderBase::SetObjectCell(MapObject* obj, CellCoord const& cellCoord) { Cell cell(cellCoord); obj->SetCurrentCell(cell); } template <class T> -void AddObjectHelper(CellCoord &cell, GridRefManager<T> &m, uint32 &count, Map* /*map*/, T *obj) -{ - obj->AddToGrid(m); - ObjectGridLoader::SetObjectCell(obj, cell); - obj->AddToWorld(); - ++count; -} - -template <> -void AddObjectHelper(CellCoord &cell, CreatureMapType &m, uint32 &count, Map* map, Creature *obj) +void AddObjectHelper(CellCoord &cell, GridRefManager<T> &m, uint32 &count, Map* map, T *obj) { obj->AddToGrid(m); ObjectGridLoader::SetObjectCell(obj, cell); diff --git a/src/server/game/Grids/ObjectGridLoader.h b/src/server/game/Grids/ObjectGridLoader.h index 472efbaac5f..68c90c31f0e 100644 --- a/src/server/game/Grids/ObjectGridLoader.h +++ b/src/server/game/Grids/ObjectGridLoader.h @@ -22,6 +22,7 @@ #include "GridDefines.h" #include "Cell.h" +class MapObject; class ObjectGuid; class ObjectWorldLoader; @@ -32,8 +33,7 @@ class TC_GAME_API ObjectGridLoaderBase : i_cell(cell), i_grid(grid), i_map(map), i_gameObjects(0), i_creatures(0), i_corpses(0), i_areaTriggers(0) { } - template<class T> - static void SetObjectCell(T* obj, CellCoord const& cellCoord); + static void SetObjectCell(MapObject* obj, CellCoord const& cellCoord); uint32 GetLoadedCreatures() const { return i_creatures; } uint32 GetLoadedGameObjects() const { return i_gameObjects; } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 0321c2a68bc..ac15beaefb6 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3837,71 +3837,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%s added to grid[%u, %u] but spawn grid[%u, %u] was not loaded.", - c->GetGUID().ToString().c_str(), 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 %s added to grid[%u, %u] but spawn grid[%u, %u] was not loaded.", + obj->GetGUID().ToString().c_str(), 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 %s removed from grid[%u, %u] but spawn grid[%u, %u] was not loaded.", - c->GetGUID().ToString().c_str(), 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 %s removed from to grid[%u, %u] but spawn grid[%u, %u] was not loaded.", + obj->GetGUID().ToString().c_str(), 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*); diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index f84966dc4a7..87dfda99b7a 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -448,12 +448,10 @@ class TC_GAME_API Map : public GridRefManager<NGridType> void ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* source, Object* target); // must called with AddToWorld - template<class T> - void AddToActive(T* obj); + void AddToActive(WorldObject* obj); // must called with RemoveFromWorld - template<class T> - void RemoveFromActive(T* obj); + void RemoveFromActive(WorldObject* obj); template<class T> void SwitchGridContainers(T* obj, bool on); std::unordered_map<ObjectGuid::LowType /*leaderSpawnId*/, CreatureGroup*> CreatureGroupHolder; |