diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/Collision/Management/MMapManager.cpp | 41 | ||||
| -rw-r--r-- | src/common/Collision/Management/MMapManager.h | 9 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Maps/TerrainMgr.cpp | 26 | ||||
| -rw-r--r-- | src/server/game/Maps/TerrainMgr.h | 4 | ||||
| -rw-r--r-- | src/server/game/Movement/PathGenerator.cpp | 4 | ||||
| -rw-r--r-- | src/server/scripts/Commands/cs_mmaps.cpp | 4 |
7 files changed, 62 insertions, 32 deletions
diff --git a/src/common/Collision/Management/MMapManager.cpp b/src/common/Collision/Management/MMapManager.cpp index dc1bd1fe060..b07642edbda 100644 --- a/src/common/Collision/Management/MMapManager.cpp +++ b/src/common/Collision/Management/MMapManager.cpp @@ -210,13 +210,14 @@ namespace MMAP } } - bool MMapManager::loadMapInstance(std::string const& basePath, uint32 mapId, uint32 instanceId) + bool MMapManager::loadMapInstance(std::string const& basePath, uint32 meshMapId, uint32 instanceMapId, uint32 instanceId) { - if (!loadMapData(basePath, mapId)) + if (!loadMapData(basePath, meshMapId)) return false; - MMapData* mmap = loadedMMaps[mapId]; - if (mmap->navMeshQueries.find(instanceId) != mmap->navMeshQueries.end()) + MMapData* mmap = loadedMMaps[meshMapId]; + auto [queryItr, inserted] = mmap->navMeshQueries.try_emplace({ instanceMapId, instanceId }, nullptr); + if (!inserted) return true; // allocate mesh query @@ -225,12 +226,13 @@ namespace MMAP if (dtStatusFailed(query->init(mmap->navMesh, 1024))) { dtFreeNavMeshQuery(query); - TC_LOG_ERROR("maps", "MMAP:GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId {:04} instanceId {}", mapId, instanceId); + mmap->navMeshQueries.erase(queryItr); + TC_LOG_ERROR("maps", "MMAP:GetNavMeshQuery: Failed to initialize dtNavMeshQuery for mapId {:04} instanceId {}", instanceMapId, instanceId); return false; } - TC_LOG_DEBUG("maps", "MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId {:04} instanceId {}", mapId, instanceId); - mmap->navMeshQueries.insert(std::pair<uint32, dtNavMeshQuery*>(instanceId, query)); + TC_LOG_DEBUG("maps", "MMAP:GetNavMeshQuery: created dtNavMeshQuery for mapId {:04} instanceId {}", instanceMapId, instanceId); + queryItr->second = query; return true; } @@ -309,29 +311,28 @@ namespace MMAP return true; } - bool MMapManager::unloadMapInstance(uint32 mapId, uint32 instanceId) + bool MMapManager::unloadMapInstance(uint32 meshMapId, uint32 instanceMapId, uint32 instanceId) { // check if we have this map loaded - MMapDataSet::const_iterator itr = GetMMapData(mapId); + MMapDataSet::const_iterator itr = GetMMapData(meshMapId); if (itr == loadedMMaps.end()) { // file may not exist, therefore not loaded - TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Asked to unload not loaded navmesh map {:04}", mapId); + TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Asked to unload not loaded navmesh map {:04}", meshMapId); return false; } MMapData* mmap = itr->second; - if (mmap->navMeshQueries.find(instanceId) == mmap->navMeshQueries.end()) + auto queryItr = mmap->navMeshQueries.find({ instanceMapId, instanceId }); + if (queryItr == mmap->navMeshQueries.end()) { - TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Asked to unload not loaded dtNavMeshQuery mapId {:04} instanceId {}", mapId, instanceId); + TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Asked to unload not loaded dtNavMeshQuery mapId {:04} instanceId {}", instanceMapId, instanceId); return false; } - dtNavMeshQuery* query = mmap->navMeshQueries[instanceId]; - - dtFreeNavMeshQuery(query); - mmap->navMeshQueries.erase(instanceId); - TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Unloaded mapId {:04} instanceId {}", mapId, instanceId); + dtFreeNavMeshQuery(queryItr->second); + mmap->navMeshQueries.erase(queryItr); + TC_LOG_DEBUG("maps", "MMAP:unloadMapInstance: Unloaded mapId {:04} instanceId {}", instanceMapId, instanceId); return true; } @@ -345,13 +346,13 @@ namespace MMAP return itr->second->navMesh; } - dtNavMeshQuery const* MMapManager::GetNavMeshQuery(uint32 mapId, uint32 instanceId) + dtNavMeshQuery const* MMapManager::GetNavMeshQuery(uint32 meshMapId, uint32 instanceMapId, uint32 instanceId) { - auto itr = GetMMapData(mapId); + auto itr = GetMMapData(meshMapId); if (itr == loadedMMaps.end()) return nullptr; - auto queryItr = itr->second->navMeshQueries.find(instanceId); + auto queryItr = itr->second->navMeshQueries.find({ instanceMapId, instanceId }); if (queryItr == itr->second->navMeshQueries.end()) return nullptr; diff --git a/src/common/Collision/Management/MMapManager.h b/src/common/Collision/Management/MMapManager.h index 1627036cd00..fe32152e138 100644 --- a/src/common/Collision/Management/MMapManager.h +++ b/src/common/Collision/Management/MMapManager.h @@ -21,6 +21,7 @@ #include "Define.h" #include "DetourNavMesh.h" #include "DetourNavMeshQuery.h" +#include "Hash.h" #include <string> #include <unordered_map> #include <vector> @@ -29,7 +30,7 @@ namespace MMAP { typedef std::unordered_map<uint32, dtTileRef> MMapTileSet; - typedef std::unordered_map<uint32, dtNavMeshQuery*> NavMeshQuerySet; + typedef std::unordered_map<std::pair<uint32, uint32>, dtNavMeshQuery*> NavMeshQuerySet; // dummy struct to hold map's mmap data struct TC_COMMON_API MMapData @@ -63,13 +64,13 @@ namespace MMAP void InitializeThreadUnsafe(std::unordered_map<uint32, std::vector<uint32>> const& mapData); bool loadMap(std::string const& basePath, uint32 mapId, int32 x, int32 y); - bool loadMapInstance(std::string const& basePath, uint32 mapId, uint32 instanceId); + bool loadMapInstance(std::string const& basePath, uint32 meshMapId, uint32 instanceMapId, uint32 instanceId); bool unloadMap(uint32 mapId, int32 x, int32 y); bool unloadMap(uint32 mapId); - bool unloadMapInstance(uint32 mapId, uint32 instanceId); + bool unloadMapInstance(uint32 meshMapId, uint32 instanceMapId, uint32 instanceId); // the returned [dtNavMeshQuery const*] is NOT threadsafe - dtNavMeshQuery const* GetNavMeshQuery(uint32 mapId, uint32 instanceId); + dtNavMeshQuery const* GetNavMeshQuery(uint32 meshMapId, uint32 instanceMapId, uint32 instanceId); dtNavMesh const* GetNavMesh(uint32 mapId); uint32 getLoadedTilesCount() const { return loadedTiles; } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index a64460e9bf9..c10b85085de 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -24,7 +24,6 @@ #include "Conversation.h" #include "DatabaseEnv.h" #include "DB2Stores.h" -#include "DisableMgr.h" #include "DynamicTree.h" #include "GameObjectModel.h" #include "GameTime.h" @@ -40,7 +39,6 @@ #include "MapManager.h" #include "Metric.h" #include "MiscPackets.h" -#include "MMapFactory.h" #include "MotionMaster.h" #include "ObjectAccessor.h" #include "ObjectGridLoader.h" @@ -115,7 +113,7 @@ Map::~Map() sOutdoorPvPMgr->DestroyOutdoorPvPForMap(this); sBattlefieldMgr->DestroyBattlefieldsForMap(this); - MMAP::MMapFactory::createOrGetMMapManager()->unloadMapInstance(GetId(), i_InstanceId); + m_terrain->UnloadMMapInstance(GetId(), GetInstanceId()); } void Map::LoadAllCells() @@ -172,7 +170,7 @@ i_scriptLock(false), _respawnTimes(std::make_unique<RespawnListContainer>()), _r sTransportMgr->CreateTransportsForMap(this); - MMAP::MMapFactory::createOrGetMMapManager()->loadMapInstance(sWorld->GetDataPath(), GetId(), i_InstanceId); + m_terrain->LoadMMapInstance(GetId(), GetInstanceId()); _worldStateValues = sWorldStateMgr->GetInitialWorldStatesForMap(this); diff --git a/src/server/game/Maps/TerrainMgr.cpp b/src/server/game/Maps/TerrainMgr.cpp index b5c2eeea8f8..10151fa4127 100644 --- a/src/server/game/Maps/TerrainMgr.cpp +++ b/src/server/game/Maps/TerrainMgr.cpp @@ -163,6 +163,14 @@ void TerrainInfo::LoadMapAndVMap(int32 gx, int32 gy) LoadMapAndVMapImpl(gx, gy); } +void TerrainInfo::LoadMMapInstance(uint32 mapId, uint32 instanceId) +{ + LoadMMapInstanceImpl(mapId, instanceId); + + for (std::shared_ptr<TerrainInfo> const& childTerrain : _childTerrain) + childTerrain->LoadMMapInstanceImpl(mapId, instanceId); +} + void TerrainInfo::LoadMapAndVMapImpl(int32 gx, int32 gy) { LoadMap(gx, gy); @@ -175,6 +183,11 @@ void TerrainInfo::LoadMapAndVMapImpl(int32 gx, int32 gy) _loadedGrids[GetBitsetIndex(gx, gy)] = true; } +void TerrainInfo::LoadMMapInstanceImpl(uint32 mapId, uint32 instanceId) +{ + MMAP::MMapFactory::createOrGetMMapManager()->loadMapInstance(sWorld->GetDataPath(), _mapId, mapId, instanceId); +} + void TerrainInfo::LoadMap(int32 gx, int32 gy) { if (_gridMap[gx][gy]) @@ -240,6 +253,14 @@ void TerrainInfo::UnloadMap(int32 gx, int32 gy) // unload later } +void TerrainInfo::UnloadMMapInstance(uint32 mapId, uint32 instanceId) +{ + UnloadMMapInstanceImpl(mapId, instanceId); + + for (std::shared_ptr<TerrainInfo> const& childTerrain : _childTerrain) + childTerrain->UnloadMMapInstanceImpl(mapId, instanceId); +} + void TerrainInfo::UnloadMapImpl(int32 gx, int32 gy) { _gridMap[gx][gy] = nullptr; @@ -252,6 +273,11 @@ void TerrainInfo::UnloadMapImpl(int32 gx, int32 gy) _loadedGrids[GetBitsetIndex(gx, gy)] = false; } +void TerrainInfo::UnloadMMapInstanceImpl(uint32 mapId, uint32 instanceId) +{ + MMAP::MMapFactory::createOrGetMMapManager()->unloadMapInstance(_mapId, mapId, instanceId); +} + GridMap* TerrainInfo::GetGrid(uint32 mapId, float x, float y, bool loadIfMissing /*= true*/) { // half opt method diff --git a/src/server/game/Maps/TerrainMgr.h b/src/server/game/Maps/TerrainMgr.h index 638319d7f1d..eb8512f6403 100644 --- a/src/server/game/Maps/TerrainMgr.h +++ b/src/server/game/Maps/TerrainMgr.h @@ -56,18 +56,22 @@ public: void AddChildTerrain(std::shared_ptr<TerrainInfo> childTerrain); void LoadMapAndVMap(int32 gx, int32 gy); + void LoadMMapInstance(uint32 mapId, uint32 instanceId); private: void LoadMapAndVMapImpl(int32 gx, int32 gy); + void LoadMMapInstanceImpl(uint32 mapId, uint32 instanceId); void LoadMap(int32 gx, int32 gy); void LoadVMap(int32 gx, int32 gy); void LoadMMap(int32 gx, int32 gy); public: void UnloadMap(int32 gx, int32 gy); + void UnloadMMapInstance(uint32 mapId, uint32 instanceId); private: void UnloadMapImpl(int32 gx, int32 gy); + void UnloadMMapInstanceImpl(uint32 mapId, uint32 instanceId); GridMap* GetGrid(uint32 mapId, float x, float y, bool loadIfMissing = true); diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index ec046c78289..c17d54ab7e9 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -42,8 +42,8 @@ PathGenerator::PathGenerator(WorldObject const* owner) : if (DisableMgr::IsPathfindingEnabled(_source->GetMapId())) { MMAP::MMapManager* mmap = MMAP::MMapFactory::createOrGetMMapManager(); - _navMesh = mmap->GetNavMesh(mapId); - _navMeshQuery = mmap->GetNavMeshQuery(mapId, _source->GetInstanceId()); + _navMeshQuery = mmap->GetNavMeshQuery(mapId, _source->GetMapId(), _source->GetInstanceId()); + _navMesh = _navMeshQuery ? _navMeshQuery->getAttachedNavMesh() : mmap->GetNavMesh(mapId); } CreateFilter(); diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp index 0477a2d1e54..94004eb8125 100644 --- a/src/server/scripts/Commands/cs_mmaps.cpp +++ b/src/server/scripts/Commands/cs_mmaps.cpp @@ -144,7 +144,7 @@ public: // calculate navmesh tile location uint32 terrainMapId = PhasingHandler::GetTerrainMapId(player->GetPhaseShift(), player->GetMapId(), player->GetMap()->GetTerrain(), x, y); dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(terrainMapId); - dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(terrainMapId, player->GetInstanceId()); + dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(terrainMapId, player->GetMapId(), player->GetInstanceId()); if (!navmesh || !navmeshquery) { handler->PSendSysMessage("NavMesh not loaded for current map."); @@ -195,7 +195,7 @@ public: Player* player = handler->GetSession()->GetPlayer(); uint32 terrainMapId = PhasingHandler::GetTerrainMapId(player->GetPhaseShift(), player->GetMapId(), player->GetMap()->GetTerrain(), player->GetPositionX(), player->GetPositionY()); dtNavMesh const* navmesh = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMesh(terrainMapId); - dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(terrainMapId, player->GetInstanceId()); + dtNavMeshQuery const* navmeshquery = MMAP::MMapFactory::createOrGetMMapManager()->GetNavMeshQuery(terrainMapId, player->GetMapId(), player->GetInstanceId()); if (!navmesh || !navmeshquery) { handler->PSendSysMessage("NavMesh not loaded for current map."); |
