aboutsummaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2023-08-08 00:08:10 +0200
committerShauren <shauren.trinity@gmail.com>2023-08-08 00:08:10 +0200
commit86725ed9267803506d8a5cab04c2c5641a234dd9 (patch)
treec54196bde8686914d3396059a3ea4de34b6ed346 /src/common
parentc489e2620759819b79a728ffaf62bc144b8e0438 (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.cpp41
-rw-r--r--src/common/Collision/Management/MMapManager.h9
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; }