aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-01-05 20:22:34 +0100
committerShauren <shauren.trinity@gmail.com>2025-01-05 20:22:34 +0100
commit401502ea3c5ceca0c6253910035b2949e13746cc (patch)
tree08171ad987c9afe14719f5cb4c384546389878f8 /src/server/game/Maps
parent04433910424540e42a2270156e7c9a8722c09913 (diff)
Core/Grids: Modernize TypeContainer with variadic template
Diffstat (limited to 'src/server/game/Maps')
-rw-r--r--src/server/game/Maps/Map.cpp66
-rw-r--r--src/server/game/Maps/Map.h36
2 files changed, 52 insertions, 50 deletions
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 5fc011482ea..49f41bf7856 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -180,52 +180,21 @@ template<class T>
void Map::AddToGrid(T* obj, Cell const& cell)
{
NGridType* grid = getNGrid(cell.GridX(), cell.GridY());
- if (obj->IsStoredInWorldObjectGridContainer())
- grid->GetGridType(cell.CellX(), cell.CellY()).template AddWorldObject<T>(obj);
- else
- grid->GetGridType(cell.CellX(), cell.CellY()).template AddGridObject<T>(obj);
-}
-
-template<>
-void Map::AddToGrid(Creature* obj, Cell const& cell)
-{
- NGridType* grid = getNGrid(cell.GridX(), cell.GridY());
- if (obj->IsStoredInWorldObjectGridContainer())
- grid->GetGridType(cell.CellX(), cell.CellY()).AddWorldObject(obj);
- else
- grid->GetGridType(cell.CellX(), cell.CellY()).AddGridObject(obj);
-
- obj->SetCurrentCell(cell);
-}
-
-template<>
-void Map::AddToGrid(GameObject* obj, Cell const& cell)
-{
- NGridType* grid = getNGrid(cell.GridX(), cell.GridY());
- grid->GetGridType(cell.CellX(), cell.CellY()).AddGridObject(obj);
-
- obj->SetCurrentCell(cell);
-}
-
-template<>
-void Map::AddToGrid(DynamicObject* obj, Cell const& cell)
-{
- NGridType* grid = getNGrid(cell.GridX(), cell.GridY());
- if (obj->IsStoredInWorldObjectGridContainer())
- grid->GetGridType(cell.CellX(), cell.CellY()).AddWorldObject(obj);
- else
- grid->GetGridType(cell.CellX(), cell.CellY()).AddGridObject(obj);
-
- obj->SetCurrentCell(cell);
-}
-
-template<>
-void Map::AddToGrid(AreaTrigger* obj, Cell const& cell)
-{
- NGridType* grid = getNGrid(cell.GridX(), cell.GridY());
- grid->GetGridType(cell.CellX(), cell.CellY()).AddGridObject(obj);
+ if constexpr (WorldTypeMapContainer::TypeExists<T> && GridTypeMapContainer::TypeExists<T>)
+ {
+ NGridType::GridType& cellType = grid->GetGridType(cell.CellX(), cell.CellY());
+ if (obj->IsStoredInWorldObjectGridContainer())
+ cellType.AddWorldObject<T>(obj);
+ else
+ cellType.AddGridObject<T>(obj);
+ }
+ else if constexpr (WorldTypeMapContainer::TypeExists<T>)
+ grid->GetGridType(cell.CellX(), cell.CellY()).AddWorldObject<T>(obj);
+ else if constexpr (GridTypeMapContainer::TypeExists<T>)
+ grid->GetGridType(cell.CellX(), cell.CellY()).AddGridObject<T>(obj);
- obj->SetCurrentCell(cell);
+ if constexpr (std::is_base_of_v<MapObject, T>)
+ obj->SetCurrentCell(cell);
}
template<>
@@ -240,10 +209,11 @@ void Map::AddToGrid(Corpse* obj, Cell const& cell)
// to avoid failing an assertion in GridObject::AddToGrid
if (grid->isGridObjectDataLoaded())
{
+ NGridType::GridType& cellType = grid->GetGridType(cell.CellX(), cell.CellY());
if (obj->IsStoredInWorldObjectGridContainer())
- grid->GetGridType(cell.CellX(), cell.CellY()).AddWorldObject(obj);
+ cellType.AddWorldObject(obj);
else
- grid->GetGridType(cell.CellX(), cell.CellY()).AddGridObject(obj);
+ cellType.AddGridObject(obj);
}
}
@@ -4094,4 +4064,4 @@ std::string InstanceMap::GetDebugInfo() const
return sstr.str();
}
-template class TC_GAME_API TypeUnorderedMapContainer<AllMapStoredObjectTypes, ObjectGuid>;
+template struct TC_GAME_API TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation>;
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 50ab8cf9120..b48ca28146e 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -183,8 +183,40 @@ inline bool CompareRespawnInfo::operator()(RespawnInfo const* a, RespawnInfo con
return a->type < b->type;
}
-extern template class TypeUnorderedMapContainer<AllMapStoredObjectTypes, ObjectGuid>;
-typedef TypeUnorderedMapContainer<AllMapStoredObjectTypes, ObjectGuid> MapStoredObjectTypesContainer;
+template <typename ObjectType>
+struct MapStoredObjectsUnorderedMap
+{
+ using Container = std::unordered_map<ObjectGuid, ObjectType*>;
+ using KeyType = ObjectGuid;
+ using ValueType = ObjectType*;
+
+ static bool Insert(Container& container, ValueType object)
+ {
+ auto [itr, isNew] = container.try_emplace(object->GetGUID(), object);
+ ASSERT(isNew || itr->second == object, "Object with certain key already in but objects are different!");
+ return true;
+ }
+
+ static bool Remove(Container& container, ValueType object)
+ {
+ container.erase(object->GetGUID());
+ return true;
+ }
+
+ static std::size_t Size(Container const& container)
+ {
+ return container.size();
+ }
+
+ static ValueType Find(Container const& container, KeyType const& key)
+ {
+ auto itr = container.find(key);
+ return itr != container.end() ? itr->second : nullptr;
+ }
+};
+
+extern template struct TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation>;
+typedef TypeListContainer<MapStoredObjectsUnorderedMap, Creature, GameObject, DynamicObject, Pet, Corpse, AreaTrigger, SceneObject, Conversation> MapStoredObjectTypesContainer;
class TC_GAME_API Map : public GridRefManager<NGridType>
{