diff options
Diffstat (limited to 'src/common/Collision/Management/MMapManager.cpp')
| -rw-r--r-- | src/common/Collision/Management/MMapManager.cpp | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/src/common/Collision/Management/MMapManager.cpp b/src/common/Collision/Management/MMapManager.cpp index 7ca5650a0b5..d0862a49156 100644 --- a/src/common/Collision/Management/MMapManager.cpp +++ b/src/common/Collision/Management/MMapManager.cpp @@ -97,6 +97,28 @@ namespace MMAP } // load and init dtNavMesh - read parameters from file + dtNavMeshParams params; + if (LoadResult paramsResult = parseNavMeshParamsFile(basePath, mapId, ¶ms); paramsResult != LoadResult::Success) + return paramsResult; + + NavMeshPtr mesh(dtAllocNavMesh()); + ASSERT(mesh); + if (dtStatusFailed(mesh->init(¶ms))) + { + TC_LOG_ERROR("maps", "MMAP:loadMapData: Failed to initialize dtNavMesh for mmap {:04}", mapId); + return LoadResult::LibraryError; + } + + TC_LOG_DEBUG("maps", "MMAP:loadMapData: Loaded {:04}.mmap", mapId); + + // store inside our map list + itr->second.reset(new MMapData(std::move(mesh))); + return LoadResult::Success; + } + + LoadResult MMapManager::parseNavMeshParamsFile(std::string_view basePath, uint32 mapId, dtNavMeshParams* params, + std::vector<OffMeshData>* offmeshConnections /*= nullptr*/) + { std::string fileName = Trinity::StringFormat(MAP_FILE_NAME_FORMAT, basePath, mapId); auto file = Trinity::make_unique_ptr_with_deleter<&::fclose>(fopen(fileName.c_str(), "rb")); if (!file) @@ -105,26 +127,39 @@ namespace MMAP return LoadResult::FileNotFound; } - dtNavMeshParams params; - uint32 count = uint32(fread(¶ms, sizeof(dtNavMeshParams), 1, file.get())); - if (count != 1) + MmapNavMeshHeader fileHeader; + if (fread(&fileHeader, sizeof(MmapNavMeshHeader), 1, file.get()) != 1) { TC_LOG_DEBUG("maps", "MMAP:loadMapData: Error: Could not read params from file '{}'", fileName); return LoadResult::ReadFromFileFailed; } - NavMeshPtr mesh(dtAllocNavMesh()); - ASSERT(mesh); - if (dtStatusFailed(mesh->init(¶ms))) + if (fileHeader.mmapMagic != MMAP_MAGIC) { - TC_LOG_ERROR("maps", "MMAP:loadMapData: Failed to initialize dtNavMesh for mmap {:04} from file {}", mapId, fileName); - return LoadResult::LibraryError; + TC_LOG_ERROR("maps", "MMAP:loadMap: Bad header in mmap {:04}.mmap", mapId); + return LoadResult::VersionMismatch; } - TC_LOG_DEBUG("maps", "MMAP:loadMapData: Loaded {:04}.mmap", mapId); + if (fileHeader.mmapVersion != MMAP_VERSION) + { + TC_LOG_ERROR("maps", "MMAP:loadMap: {:04}.mmap was built with generator v{}, expected v{}", + mapId, fileHeader.mmapVersion, MMAP_VERSION); + return LoadResult::VersionMismatch; + } + + memcpy(params, &fileHeader.params, sizeof(dtNavMeshParams)); + + if (offmeshConnections) + { + offmeshConnections->resize(fileHeader.offmeshConnectionCount); + if (fread(offmeshConnections->data(), sizeof(OffMeshData), offmeshConnections->size(), file.get()) != offmeshConnections->size()) + { + offmeshConnections->clear(); + TC_LOG_DEBUG("maps", "MMAP:loadMapData: Error: Could not read offmesh connections from file '{}'", fileName); + return LoadResult::ReadFromFileFailed; + } + } - // store inside our map list - itr->second.reset(new MMapData(std::move(mesh))); return LoadResult::Success; } |
