diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-01-05 20:22:34 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-01-05 20:22:34 +0100 |
commit | 401502ea3c5ceca0c6253910035b2949e13746cc (patch) | |
tree | 08171ad987c9afe14719f5cb4c384546389878f8 /src/server/game/Maps | |
parent | 04433910424540e42a2270156e7c9a8722c09913 (diff) |
Core/Grids: Modernize TypeContainer with variadic template
Diffstat (limited to 'src/server/game/Maps')
-rw-r--r-- | src/server/game/Maps/Map.cpp | 66 | ||||
-rw-r--r-- | src/server/game/Maps/Map.h | 36 |
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> { |