diff options
-rw-r--r-- | src/server/collision/Management/MMapManager.cpp | 87 | ||||
-rw-r--r-- | src/server/collision/Management/MMapManager.h | 16 | ||||
-rw-r--r-- | src/server/collision/Management/VMapManager2.cpp | 6 | ||||
-rw-r--r-- | src/server/collision/Management/VMapManager2.h | 2 | ||||
-rw-r--r-- | src/server/game/World/World.cpp | 15 |
5 files changed, 74 insertions, 52 deletions
diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index 0b9c1b325b7..4feab413706 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -19,7 +19,6 @@ #include "MMapManager.h" #include "Log.h" #include "World.h" -#include "DBCStores.h" #include "MMapFactory.h" namespace MMAP @@ -37,11 +36,19 @@ namespace MMAP // if we had, tiles in MMapData->mmapLoadedTiles, their actual data is lost! } - void MMapManager::InitializeThreadUnsafe(const std::vector<uint32>& mapIds) + void MMapManager::InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData) { - // the caller must pass the list of all mapIds that will be used in the VMapManager2 lifetime - for (const uint32& mapId : mapIds) - loadedMMaps.insert(MMapDataSet::value_type(mapId, nullptr)); + // the caller must pass the list of all mapIds that will be used in the MMapManager lifetime + for (auto const& p : mapData) + { + loadedMMaps.insert(MMapDataSet::value_type(p.first, nullptr)); + if (!p.second.empty()) + { + phaseMapData[p.first] = p.second; + for (uint32 phasedMapId : p.second) + _phaseTiles.insert(PhaseTileMap::value_type(phasedMapId, PhaseTileContainer())); + } + } thread_safe_environment = false; } @@ -178,7 +185,9 @@ namespace MMAP ++loadedTiles; TC_LOG_DEBUG("maps", "MMAP:loadMap: Loaded mmtile %04i[%02i, %02i] into %04i[%02i, %02i]", mapId, x, y, mapId, header->x, header->y); - LoadPhaseTiles(mapId, x, y); + PhaseChildMapContainer::const_iterator phasedMaps = phaseMapData.find(mapId); + if (phasedMaps != phaseMapData.end()) + LoadPhaseTiles(phasedMaps, x, y); return true; } @@ -237,45 +246,43 @@ namespace MMAP return pTile; } - void MMapManager::LoadPhaseTiles(uint32 mapId, int32 x, int32 y) + void MMapManager::LoadPhaseTiles(PhaseChildMapContainer::const_iterator phasedMapData, int32 x, int32 y) { - TC_LOG_DEBUG("phase", "MMAP:LoadPhaseTiles: Loading phased mmtiles for map %u, x: %i, y: %i", mapId, x, y); + TC_LOG_DEBUG("phase", "MMAP:LoadPhaseTiles: Loading phased mmtiles for map %u, x: %i, y: %i", phasedMapData->first, x, y); uint32 packedGridPos = packTileID(x, y); - for (uint32 i = 0; i < sMapStore.GetNumRows(); ++i) + for (uint32 phaseMapId : phasedMapData->second) { - if (MapEntry const* map = sMapStore.LookupEntry(i)) + // only a few tiles have terrain swaps, do not write error for them + if (PhasedTile* data = LoadTile(phaseMapId, x, y)) { - if (map->ParentMapID == int32(mapId)) - { - PhasedTile* data = LoadTile(map->ID, x, y); - // only a few tiles have terrain swaps, do not write error for them - if (data) - { - TC_LOG_DEBUG("phase", "MMAP:LoadPhaseTiles: Loaded phased %04u%02i%02i.mmtile for root phase map %u", map->ID, x, y, mapId); - _phaseTiles[map->ID][packedGridPos] = data; - } - } + TC_LOG_DEBUG("phase", "MMAP:LoadPhaseTiles: Loaded phased %04u%02i%02i.mmtile for root phase map %u", phaseMapId, x, y, phasedMapData->first); + _phaseTiles[phaseMapId][packedGridPos] = data; } } } - void MMapManager::UnloadPhaseTile(uint32 mapId, int32 x, int32 y) + void MMapManager::UnloadPhaseTile(PhaseChildMapContainer::const_iterator phasedMapData, int32 x, int32 y) { - TC_LOG_DEBUG("phase", "MMAP:UnloadPhaseTile: Unloading phased mmtile for map %u, x: %i, y: %i", mapId, x, y); + TC_LOG_DEBUG("phase", "MMAP:UnloadPhaseTile: Unloading phased mmtile for map %u, x: %i, y: %i", phasedMapData->first, x, y); uint32 packedGridPos = packTileID(x, y); - const MapEntry* const map = sMapStore.LookupEntry(mapId); // map existence already checked when loading - uint32 rootMapId = map->ParentMapID; - - if (_phaseTiles[mapId][packedGridPos]) + for (uint32 phaseMapId : phasedMapData->second) { - TC_LOG_DEBUG("phase", "MMAP:UnloadPhaseTile: Unloaded phased %04u%02i%02i.mmtile for root phase map %u", mapId, x, y, rootMapId); - delete _phaseTiles[mapId][packedGridPos]->data; - delete _phaseTiles[mapId][packedGridPos]; - _phaseTiles[mapId].erase(packedGridPos); + auto phasedTileItr = _phaseTiles.find(phaseMapId); + if (phasedTileItr == _phaseTiles.end()) + continue; + + auto dataItr = phasedTileItr->second.find(packedGridPos); + if (dataItr != phasedTileItr->second.end()) + { + TC_LOG_DEBUG("phase", "MMAP:UnloadPhaseTile: Unloaded phased %04u%02i%02i.mmtile for root phase map %u", phaseMapId, x, y, phasedMapData->first); + delete dataItr->second->data; + delete dataItr->second; + phasedTileItr->second.erase(dataItr); + } } } @@ -318,7 +325,9 @@ namespace MMAP --loadedTiles; TC_LOG_DEBUG("maps", "MMAP:unloadMap: Unloaded mmtile %03i[%02i, %02i] from %04i", mapId, x, y, mapId); - UnloadPhaseTile(mapId, x, y); + PhaseChildMapContainer::const_iterator phasedMaps = phaseMapData.find(mapId); + if (phasedMaps != phaseMapData.end()) + UnloadPhaseTile(phasedMaps, x, y); return true; } @@ -345,7 +354,9 @@ namespace MMAP TC_LOG_ERROR("maps", "MMAP:unloadMap: Could not unload %04u%02i%02i.mmtile from navmesh", mapId, x, y); else { - UnloadPhaseTile(mapId, x, y); + PhaseChildMapContainer::const_iterator phasedMaps = phaseMapData.find(mapId); + if (phasedMaps != phaseMapData.end()) + UnloadPhaseTile(phasedMaps, x, y); --loadedTiles; TC_LOG_DEBUG("maps", "MMAP:unloadMap: Unloaded mmtile %04i[%02i, %02i] from %04i", mapId, x, y, mapId); } @@ -545,9 +556,9 @@ namespace MMAP { if (!swaps.count(swap)) // swap not active { - PhaseTileContainer ptc = MMAP::MMapFactory::createOrGetMMapManager()->GetPhaseTileContainer(swap); - for (PhaseTileContainer::const_iterator itr = ptc.begin(); itr != ptc.end(); ++itr) - RemoveSwap(itr->second, swap, itr->first); // remove swap + if (PhaseTileContainer const* ptc = MMAP::MMapFactory::createOrGetMMapManager()->GetPhaseTileContainer(swap)) + for (PhaseTileContainer::const_iterator itr = ptc->begin(); itr != ptc->end(); ++itr) + RemoveSwap(itr->second, swap, itr->first); // remove swap } } @@ -557,9 +568,9 @@ namespace MMAP if (!_activeSwaps.count(swap)) // swap not active { // for each of the terrain swap's xy tiles - PhaseTileContainer ptc = MMAP::MMapFactory::createOrGetMMapManager()->GetPhaseTileContainer(swap); - for (PhaseTileContainer::const_iterator itr = ptc.begin(); itr != ptc.end(); ++itr) - AddSwap(itr->second, swap, itr->first); // add swap + if (PhaseTileContainer const* ptc = MMAP::MMapFactory::createOrGetMMapManager()->GetPhaseTileContainer(swap)) + for (PhaseTileContainer::const_iterator itr = ptc->begin(); itr != ptc->end(); ++itr) + AddSwap(itr->second, swap, itr->first); // add swap } } diff --git a/src/server/collision/Management/MMapManager.h b/src/server/collision/Management/MMapManager.h index 2b3818601af..14f579a1c80 100644 --- a/src/server/collision/Management/MMapManager.h +++ b/src/server/collision/Management/MMapManager.h @@ -95,7 +95,7 @@ namespace MMAP MMapManager() : loadedTiles(0), thread_safe_environment(true) {} ~MMapManager(); - void InitializeThreadUnsafe(const std::vector<uint32>& mapIds); + void InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData); bool loadMap(const std::string& basePath, uint32 mapId, int32 x, int32 y); bool unloadMap(uint32 mapId, int32 x, int32 y); bool unloadMap(uint32 mapId); @@ -108,9 +108,16 @@ namespace MMAP uint32 getLoadedTilesCount() const { return loadedTiles; } uint32 getLoadedMapsCount() const { return loadedMMaps.size(); } - void LoadPhaseTiles(uint32 mapId, int32 x, int32 y); - void UnloadPhaseTile(uint32 mapId, int32 x, int32 y); - PhaseTileContainer GetPhaseTileContainer(uint32 mapId) { return _phaseTiles[mapId]; } + typedef std::unordered_map<uint32, std::vector<uint32>> PhaseChildMapContainer; + void LoadPhaseTiles(PhaseChildMapContainer::const_iterator phasedMapData, int32 x, int32 y); + void UnloadPhaseTile(PhaseChildMapContainer::const_iterator phasedMapData, int32 x, int32 y); + PhaseTileContainer const* GetPhaseTileContainer(uint32 mapId) const + { + auto itr = _phaseTiles.find(mapId); + if (itr != _phaseTiles.end()) + return &itr->second; + return nullptr; + } private: bool loadMapData(uint32 mapId); @@ -118,6 +125,7 @@ namespace MMAP MMapDataSet::const_iterator GetMMapData(uint32 mapId) const; MMapDataSet loadedMMaps; + PhaseChildMapContainer phaseMapData; uint32 loadedTiles; bool thread_safe_environment; diff --git a/src/server/collision/Management/VMapManager2.cpp b/src/server/collision/Management/VMapManager2.cpp index b2085382725..9a31692593d 100644 --- a/src/server/collision/Management/VMapManager2.cpp +++ b/src/server/collision/Management/VMapManager2.cpp @@ -52,11 +52,11 @@ namespace VMAP } } - void VMapManager2::InitializeThreadUnsafe(const std::vector<uint32>& mapIds) + void VMapManager2::InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData) { // the caller must pass the list of all mapIds that will be used in the VMapManager2 lifetime - for (const uint32& mapId : mapIds) - iInstanceMapTrees.insert(InstanceTreeMap::value_type(mapId, nullptr)); + for (auto const& p : mapData) + iInstanceMapTrees.insert(InstanceTreeMap::value_type(p.first, nullptr)); thread_safe_environment = false; } diff --git a/src/server/collision/Management/VMapManager2.h b/src/server/collision/Management/VMapManager2.h index a5891e9642b..553145cda4b 100644 --- a/src/server/collision/Management/VMapManager2.h +++ b/src/server/collision/Management/VMapManager2.h @@ -101,7 +101,7 @@ namespace VMAP VMapManager2(); ~VMapManager2(void); - void InitializeThreadUnsafe(const std::vector<uint32>& mapIds); + void InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData); int loadMap(const char* pBasePath, unsigned int mapId, int x, int y) override; void unloadMap(unsigned int mapId, int x, int y) override; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index cbb21f05891..677c732b4e9 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -1471,16 +1471,19 @@ void World::SetInitialWorldSettings() sSpellMgr->LoadPetFamilySpellsStore(); - std::vector<uint32> mapIds; - for (uint32 mapId = 0; mapId < sMapStore.GetNumRows(); mapId++) - if (sMapStore.LookupEntry(mapId)) - mapIds.push_back(mapId); + std::unordered_map<uint32, std::vector<uint32>> mapData; + for (MapEntry const* mapEntry : sMapStore) + { + mapData.insert(std::unordered_map<uint32, std::vector<uint32>>::value_type(mapEntry->ID, std::vector<uint32>())); + if (mapEntry->ParentMapID != -1) + mapData[mapEntry->ParentMapID].push_back(mapEntry->ID); + } if (VMAP::VMapManager2* vmmgr2 = dynamic_cast<VMAP::VMapManager2*>(VMAP::VMapFactory::createOrGetVMapManager())) - vmmgr2->InitializeThreadUnsafe(mapIds); + vmmgr2->InitializeThreadUnsafe(mapData); MMAP::MMapManager* mmmgr = MMAP::MMapFactory::createOrGetMMapManager(); - mmmgr->InitializeThreadUnsafe(mapIds); + mmmgr->InitializeThreadUnsafe(mapData); TC_LOG_INFO("server.loading", "Loading SpellInfo store..."); sSpellMgr->LoadSpellInfoStore(); |