aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Maps/MapManager.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2018-02-27 23:57:54 +0100
committerShauren <shauren.trinity@gmail.com>2018-03-25 19:28:36 +0300
commitbe0f2c297c2209f2d12c1359a8f7933c1b89ec0d (patch)
tree13c4385012253cf017519b34daaa5fbce378ac90 /src/server/game/Maps/MapManager.cpp
parentbea7faa8f9d48894d836c7205b98e36126734d56 (diff)
Core/Maps: Implemented loading swapped maps
Diffstat (limited to 'src/server/game/Maps/MapManager.cpp')
-rw-r--r--src/server/game/Maps/MapManager.cpp56
1 files changed, 41 insertions, 15 deletions
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index d380e1be018..0b6bec91781 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -55,10 +55,15 @@ void MapManager::Initialize()
m_updater.activate(num_threads);
}
+void MapManager::InitializeParentMapData(std::unordered_map<uint32, std::vector<uint32>> const& mapData)
+{
+ _parentMapData = mapData;
+}
+
void MapManager::InitializeVisibilityDistanceInfo()
{
- for (MapMapType::iterator iter=i_maps.begin(); iter != i_maps.end(); ++iter)
- (*iter).second->InitVisibilityDistance();
+ for (auto iter = i_maps.begin(); iter != i_maps.end(); ++iter)
+ iter->second->InitVisibilityDistance();
}
MapManager* MapManager::instance()
@@ -71,29 +76,46 @@ Map* MapManager::CreateBaseMap(uint32 id)
{
Map* map = FindBaseMap(id);
- if (map == NULL)
+ if (!map)
{
- std::lock_guard<std::mutex> lock(_mapsLock);
-
- MapEntry const* entry = sMapStore.LookupEntry(id);
- ASSERT(entry);
-
- if (entry->Instanceable())
- map = new MapInstanced(id, i_gridCleanUpDelay);
- else
+ MapEntry const* entry = sMapStore.AssertEntry(id);
+ if (entry->ParentMapID != -1)
{
- map = new Map(id, i_gridCleanUpDelay, 0, DIFFICULTY_NONE);
- map->LoadRespawnTimes();
- map->LoadCorpseData();
+ CreateBaseMap(entry->ParentMapID);
+
+ // must have been created by parent map
+ map = FindBaseMap(id);
+ return ASSERT_NOTNULL(map);
}
- i_maps[id] = map;
+ std::lock_guard<std::mutex> lock(_mapsLock);
+ map = CreateBaseMap_i(entry);
}
ASSERT(map);
return map;
}
+Map* MapManager::CreateBaseMap_i(MapEntry const* mapEntry)
+{
+ Map* map;
+ if (mapEntry->Instanceable())
+ map = new MapInstanced(mapEntry->ID, i_gridCleanUpDelay);
+ else
+ {
+ map = new Map(mapEntry->ID, i_gridCleanUpDelay, 0, DIFFICULTY_NONE);
+ map->LoadRespawnTimes();
+ map->LoadCorpseData();
+ }
+
+ i_maps[mapEntry->ID] = map;
+
+ for (uint32 childMapId : _parentMapData[mapEntry->ID])
+ map->AddChildTerrainMap(CreateBaseMap_i(sMapStore.AssertEntry(childMapId)));
+
+ return map;
+}
+
Map* MapManager::FindBaseNonInstanceMap(uint32 mapId) const
{
Map* map = FindBaseMap(mapId);
@@ -257,6 +279,10 @@ bool MapManager::IsValidMAP(uint32 mapid, bool startUp)
void MapManager::UnloadAll()
{
+ // first unlink child 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();