diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-05-25 22:07:47 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-05-25 22:07:47 +0200 |
commit | 3031fbb63bfb2df2aa041bd9c04c5c42b0c07c05 (patch) | |
tree | 0c54d226b247db2719233f178b74a50da0993481 /src/server/game/Maps/Map.cpp | |
parent | aa592e431b945800928f2e43b3812cfa240fada1 (diff) |
Core/Objects: Remove restriction on what object types can be set as active
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 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*); |