From fbe0b8efebca3bc2662b477bdf45627f9783d6c2 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 24 Jul 2022 18:56:40 +0200 Subject: Core/Maps: Removed MapInstanced - no longer neccessary for grid data reference counting (moved to TerrainInfo) --- src/server/game/Maps/MapManager.h | 106 ++++++++++++++++++-------------------- 1 file changed, 49 insertions(+), 57 deletions(-) (limited to 'src/server/game/Maps/MapManager.h') diff --git a/src/server/game/Maps/MapManager.h b/src/server/game/Maps/MapManager.h index f2c3bbb1e86..8fb598dd8c2 100644 --- a/src/server/game/Maps/MapManager.h +++ b/src/server/game/Maps/MapManager.h @@ -18,27 +18,42 @@ #ifndef TRINITY_MAPMANAGER_H #define TRINITY_MAPMANAGER_H -#include "Map.h" -#include "MapInstanced.h" -#include "GridStates.h" +#include "GridDefines.h" +#include "IteratorPair.h" #include "MapUpdater.h" +#include "Position.h" +#include "SharedDefines.h" #include - -class PhaseShift; -class Transport; +#include +#include + +class Battleground; +class BattlegroundMap; +class GarrisonMap; +class InstanceMap; +class InstanceSave; +class Map; +class Player; +enum Difficulty : uint8; class TC_GAME_API MapManager { + MapManager(); + ~MapManager(); + public: + MapManager(MapManager const&) = delete; + MapManager(MapManager&&) = delete; + MapManager& operator=(MapManager const&) = delete; + MapManager& operator=(MapManager&&) = delete; + static MapManager* instance(); - Map* CreateBaseMap(uint32 mapId); - Map* FindBaseNonInstanceMap(uint32 mapId) const; - Map* CreateMap(uint32 mapId, Player* player, uint32 loginInstanceId=0); + Map* CreateMap(uint32 mapId, Player* player, uint32 loginInstanceId = 0); Map* FindMap(uint32 mapId, uint32 instanceId) const; void Initialize(); - void Update(uint32); + void Update(uint32 diff); void SetGridCleanUpDelay(uint32 t) { @@ -57,7 +72,6 @@ class TC_GAME_API MapManager i_timer.Reset(); } - //void LoadGrid(int mapid, int instId, float x, float y, WorldObject const* obj, bool no_unload = false); void UnloadAll(); static bool IsValidMAP(uint32 mapId); @@ -87,14 +101,11 @@ class TC_GAME_API MapManager return IsValidMapCoord(loc.GetMapId(), loc); } - void DoDelayedMovesAndRemoves(); - - Map::EnterState PlayerCannotEnter(uint32 mapid, Player* player, bool loginCheck = false); void InitializeVisibilityDistanceInfo(); /* statistics */ - uint32 GetNumInstances(); - uint32 GetNumPlayersInInstances(); + uint32 GetNumInstances() const; + uint32 GetNumPlayersInInstances() const; // Instance ID management void InitInstanceIds(); @@ -116,24 +127,20 @@ class TC_GAME_API MapManager bool IsScriptScheduled() const { return _scheduledScripts > 0; } private: - typedef std::unordered_map MapMapType; + using MapKey = std::pair; + typedef std::map MapMapType; typedef boost::dynamic_bitset InstanceIds; - MapManager(); - ~MapManager(); + Map* FindMap_i(uint32 mapId, uint32 instanceId) const; - Map* FindBaseMap(uint32 mapId) const - { - MapMapType::const_iterator iter = i_maps.find(mapId); - return (iter == i_maps.end() ? nullptr : iter->second); - } + Map* CreateWorldMap(uint32 mapId, uint32 instanceId); + InstanceMap* CreateInstance(uint32 mapId, uint32 instanceId, InstanceSave* save, Difficulty difficulty, TeamId team); + BattlegroundMap* CreateBattleground(uint32 mapId, uint32 instanceId, Battleground* bg); + GarrisonMap* CreateGarrison(uint32 mapId, uint32 instanceId, Player* owner); - Map* CreateBaseMap_i(MapEntry const* mapEntry); + bool DestroyMap(Map* map); - MapManager(MapManager const&) = delete; - MapManager& operator=(MapManager const&) = delete; - - std::mutex _mapsLock; + mutable std::shared_mutex _mapsLock; uint32 i_gridCleanUpDelay; MapMapType i_maps; IntervalTimer i_timer; @@ -149,41 +156,26 @@ class TC_GAME_API MapManager template void MapManager::DoForAllMaps(Worker&& worker) { - std::lock_guard lock(_mapsLock); + std::shared_lock lock(_mapsLock); - for (auto& mapPair : i_maps) - { - Map* map = mapPair.second; - if (MapInstanced* mapInstanced = map->ToMapInstanced()) - { - MapInstanced::InstancedMaps& instances = mapInstanced->GetInstancedMaps(); - for (auto& instancePair : instances) - worker(instancePair.second); - } - else - worker(map); - } + for (auto const& [key, map] : i_maps) + worker(map); } template -inline void MapManager::DoForAllMapsWithMapId(uint32 mapId, Worker&& worker) +void MapManager::DoForAllMapsWithMapId(uint32 mapId, Worker&& worker) { - std::lock_guard lock(_mapsLock); + std::shared_lock lock(_mapsLock); - auto itr = i_maps.find(mapId); - if (itr != i_maps.end()) - { - Map* map = itr->second; - if (MapInstanced* mapInstanced = map->ToMapInstanced()) - { - MapInstanced::InstancedMaps& instances = mapInstanced->GetInstancedMaps(); - for (auto& p : instances) - worker(p.second); - } - else - worker(map); - } + auto range = Trinity::Containers::MakeIteratorPair( + i_maps.lower_bound({ mapId, 0 }), + i_maps.upper_bound({ mapId, std::numeric_limits::max() }) + ); + + for (auto const& [key, map] : range) + worker(map); } #define sMapMgr MapManager::instance() + #endif -- cgit v1.2.3