aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/MapManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Maps/MapManager.cpp')
-rw-r--r--src/server/game/Maps/MapManager.cpp37
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;
}