aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-05-25 22:07:47 +0200
committerShauren <shauren.trinity@gmail.com>2023-10-13 23:03:06 +0200
commit163c674adb6413089134e081180c10e6871f3a04 (patch)
tree5332ef397be847d68d3ad95761528df83a6cfff2 /src
parentff0d198ef5b2c74aea2e346bfda3b52a957a1876 (diff)
Core/Objects: Remove restriction on what object types can be set as active
(cherry picked from commit 3031fbb63bfb2df2aa041bd9c04c5c42b0c07c05)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Grids/ObjectGridLoader.cpp21
-rw-r--r--src/server/game/Grids/ObjectGridLoader.h3
-rw-r--r--src/server/game/Maps/Map.cpp93
-rw-r--r--src/server/game/Maps/Map.h6
4 files changed, 59 insertions, 64 deletions
diff --git a/src/server/game/Grids/ObjectGridLoader.cpp b/src/server/game/Grids/ObjectGridLoader.cpp
index e34c353edb0..bcb6e6b41af 100644
--- a/src/server/game/Grids/ObjectGridLoader.cpp
+++ b/src/server/game/Grids/ObjectGridLoader.cpp
@@ -79,31 +79,14 @@ class ObjectWorldLoader
uint32& i_corpses;
};
-template<class T> void ObjectGridLoader::SetObjectCell(T* /*obj*/, CellCoord const& /*cellCoord*/) { }
-
-template<> void ObjectGridLoader::SetObjectCell(Creature* obj, CellCoord const& cellCoord)
-{
- Cell cell(cellCoord);
- obj->SetCurrentCell(cell);
-}
-
-template<> void ObjectGridLoader::SetObjectCell(GameObject* obj, CellCoord const& cellCoord)
+void ObjectGridLoader::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 e07d8345783..4621420c529 100644
--- a/src/server/game/Grids/ObjectGridLoader.h
+++ b/src/server/game/Grids/ObjectGridLoader.h
@@ -24,6 +24,7 @@
#include "GridDefines.h"
#include "Cell.h"
+class MapObject;
class ObjectWorldLoader;
class TC_GAME_API ObjectGridLoader
@@ -42,7 +43,7 @@ class TC_GAME_API ObjectGridLoader
void LoadN(void);
- template<class T> static void SetObjectCell(T* obj, CellCoord const& cellCoord);
+ static void SetObjectCell(MapObject* obj, CellCoord const& cellCoord);
private:
Cell i_cell;
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*);
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index f6814efbdcc..dadd8cc14de 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -489,12 +489,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;