diff options
Diffstat (limited to 'src/server/game/Maps/MapManager.cpp')
-rw-r--r-- | src/server/game/Maps/MapManager.cpp | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp index 1d17f6caa98..d340a85e4df 100644 --- a/src/server/game/Maps/MapManager.cpp +++ b/src/server/game/Maps/MapManager.cpp @@ -33,6 +33,7 @@ #include "Player.h" #include "WorldSession.h" #include "Opcodes.h" +#include <numeric> MapManager::MapManager() : _nextInstanceId(0), _scheduledScripts(0) @@ -85,7 +86,9 @@ Map* MapManager::CreateBaseMap(uint32 id) map->LoadCorpseData(); } - i_maps[id] = map; + Trinity::unique_trackable_ptr<Map>& ptr = i_maps[id]; + ptr.reset(map); + map->SetWeakPtr(ptr); } ASSERT(map); @@ -255,12 +258,12 @@ bool MapManager::IsValidMAP(uint32 mapid, bool startUp) void MapManager::UnloadAll() { - for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();) - { + // first unload maps + for (auto iter = i_maps.begin(); iter != i_maps.end(); ++iter) iter->second->UnloadAll(); - delete iter->second; - i_maps.erase(iter++); - } + + // then delete them + i_maps.clear(); if (m_updater.activated()) m_updater.deactivate(); @@ -273,14 +276,12 @@ uint32 MapManager::GetNumInstances() std::lock_guard<std::mutex> lock(_mapsLock); uint32 ret = 0; - for (MapMapType::iterator itr = i_maps.begin(); itr != i_maps.end(); ++itr) + for (auto const& [_, map] : i_maps) { - Map* map = itr->second; - if (!map->Instanceable()) + MapInstanced* mapInstanced = map->ToMapInstanced(); + if (!mapInstanced) continue; - MapInstanced::InstancedMaps &maps = ((MapInstanced*)map)->GetInstancedMaps(); - for (MapInstanced::InstancedMaps::iterator mitr = maps.begin(); mitr != maps.end(); ++mitr) - if (mitr->second->IsDungeon()) ret++; + ret += mapInstanced->GetInstancedMaps().size(); } return ret; } @@ -290,15 +291,13 @@ uint32 MapManager::GetNumPlayersInInstances() std::lock_guard<std::mutex> lock(_mapsLock); uint32 ret = 0; - for (MapMapType::iterator itr = i_maps.begin(); itr != i_maps.end(); ++itr) + for (auto& [_, map] : i_maps) { - Map* map = itr->second; - if (!map->Instanceable()) + MapInstanced* mapInstanced = map->ToMapInstanced(); + if (!mapInstanced) continue; - MapInstanced::InstancedMaps &maps = ((MapInstanced*)map)->GetInstancedMaps(); - for (MapInstanced::InstancedMaps::iterator mitr = maps.begin(); mitr != maps.end(); ++mitr) - if (mitr->second->IsDungeon()) - ret += ((InstanceMap*)mitr->second)->GetPlayers().getSize(); + MapInstanced::InstancedMaps& maps = mapInstanced->GetInstancedMaps(); + ret += std::accumulate(maps.begin(), maps.end(), 0u, [](uint32 total, MapInstanced::InstancedMaps::value_type const& value) { return total + value.second->GetPlayers().getSize(); }); } return ret; } |