aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/MapManager.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-05-24 22:34:25 +0200
committerShauren <shauren.trinity@gmail.com>2020-05-24 22:34:25 +0200
commiteba31dea27b7fdc4a49c024898ef3a01bcbc7295 (patch)
tree4be401cb2969769c92b571e1b8d04555f633693e /src/server/game/Maps/MapManager.cpp
parentebb6f12db811d78a538982cca9b8cc1887fc2527 (diff)
Core/Maps: Improvements to terrain swap handling
* Fixed memory leak when unloading grids * Handle child maps being entered * Allow chaining more child maps (Draenor -> Tanaan Jungle -> Tanaan Jungle - No Hubs Phase)
Diffstat (limited to 'src/server/game/Maps/MapManager.cpp')
-rw-r--r--src/server/game/Maps/MapManager.cpp19
1 files changed, 10 insertions, 9 deletions
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index e6ba2294f3d..e01d2dc05b6 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -78,9 +78,9 @@ Map* MapManager::CreateBaseMap(uint32 id)
if (!map)
{
MapEntry const* entry = sMapStore.AssertEntry(id);
- if (entry->ParentMapID != -1)
+ if (entry->ParentMapID != -1 || entry->CosmeticParentMapID != -1)
{
- CreateBaseMap(entry->ParentMapID);
+ CreateBaseMap(entry->ParentMapID != -1 ? entry->ParentMapID : entry->CosmeticParentMapID);
// must have been created by parent map
map = FindBaseMap(id);
@@ -103,6 +103,8 @@ Map* MapManager::CreateBaseMap_i(MapEntry const* mapEntry)
else
map = new Map(mapEntry->ID, i_gridCleanUpDelay, 0, DIFFICULTY_NONE);
+ map->DiscoverGridMapFiles();
+
i_maps[mapEntry->ID] = map;
for (uint32 childMapId : _parentMapData[mapEntry->ID])
@@ -280,16 +282,15 @@ bool MapManager::IsValidMAP(uint32 mapid, bool startUp)
void MapManager::UnloadAll()
{
- // first unlink child maps
+ // first unload maps
for (auto iter = i_maps.begin(); iter != i_maps.end(); ++iter)
- iter->second->UnlinkAllChildTerrainMaps();
-
- for (MapMapType::iterator iter = i_maps.begin(); iter != i_maps.end();)
- {
iter->second->UnloadAll();
+
+ // then delete them
+ for (auto iter = i_maps.begin(); iter != i_maps.end(); ++iter)
delete iter->second;
- i_maps.erase(iter++);
- }
+
+ i_maps.clear();
if (m_updater.activated())
m_updater.deactivate();