diff options
| author | Shauren <shauren.trinity@gmail.com> | 2023-08-08 00:08:10 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2023-08-08 00:08:10 +0200 |
| commit | 86725ed9267803506d8a5cab04c2c5641a234dd9 (patch) | |
| tree | c54196bde8686914d3396059a3ea4de34b6ed346 /src/common | |
| parent | c489e2620759819b79a728ffaf62bc144b8e0438 (diff) | |
Core/MMaps: Fixed pathing for objects that have terrain swaps active
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/Collision/Management/MMapManager.cpp | 41 | ||||
| -rw-r--r-- | src/common/Collision/Management/MMapManager.h | 9 |
2 files changed, 26 insertions, 24 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; } |
