diff options
author | Shauren <shauren.trinity@gmail.com> | 2018-02-27 23:57:54 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2018-03-25 19:28:36 +0300 |
commit | be0f2c297c2209f2d12c1359a8f7933c1b89ec0d (patch) | |
tree | 13c4385012253cf017519b34daaa5fbce378ac90 /src/server/game/Maps/MapManager.cpp | |
parent | bea7faa8f9d48894d836c7205b98e36126734d56 (diff) |
Core/Maps: Implemented loading swapped maps
Diffstat (limited to 'src/server/game/Maps/MapManager.cpp')
-rw-r--r-- | src/server/game/Maps/MapManager.cpp | 56 |
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(); |