diff --git a/src/common/Collision/Management/IVMapMgr.h b/src/common/Collision/Management/IVMapMgr.h index 79a07bf44..b1b516ee5 100644 --- a/src/common/Collision/Management/IVMapMgr.h +++ b/src/common/Collision/Management/IVMapMgr.h @@ -37,6 +37,13 @@ namespace VMAP VMAP_LOAD_RESULT_IGNORED }; + enum class LoadResult : uint8 + { + Success, + FileNotFound, + VersionMismatch + }; + #define VMAP_INVALID_HEIGHT -100000.0f // for check #define VMAP_INVALID_HEIGHT_VALUE -200000.0f // real assigned value in unknown height case @@ -79,7 +86,7 @@ namespace VMAP virtual int loadMap(const char* pBasePath, unsigned int pMapId, int x, int y) = 0; - virtual bool existsMap(const char* pBasePath, unsigned int pMapId, int x, int y) = 0; + virtual LoadResult existsMap(const char* pBasePath, unsigned int pMapId, int x, int y) = 0; virtual void unloadMap(unsigned int pMapId, int x, int y) = 0; virtual void unloadMap(unsigned int pMapId) = 0; diff --git a/src/common/Collision/Management/VMapMgr2.cpp b/src/common/Collision/Management/VMapMgr2.cpp index 58301f707..3fdbe5cab 100644 --- a/src/common/Collision/Management/VMapMgr2.cpp +++ b/src/common/Collision/Management/VMapMgr2.cpp @@ -379,7 +379,7 @@ namespace VMAP } } - bool VMapMgr2::existsMap(const char* basePath, unsigned int mapId, int x, int y) + LoadResult VMapMgr2::existsMap(const char* basePath, unsigned int mapId, int x, int y) { return StaticMapTree::CanLoadMap(std::string(basePath), mapId, x, y); } diff --git a/src/common/Collision/Management/VMapMgr2.h b/src/common/Collision/Management/VMapMgr2.h index 0a3b5d6ce..39110c1a8 100644 --- a/src/common/Collision/Management/VMapMgr2.h +++ b/src/common/Collision/Management/VMapMgr2.h @@ -128,7 +128,7 @@ namespace VMAP { return getMapFileName(mapId); } - bool existsMap(const char* basePath, unsigned int mapId, int x, int y) override; + LoadResult existsMap(const char* basePath, unsigned int mapId, int x, int y) override; void GetInstanceMapTree(InstanceTreeMap& instanceMapTree); typedef uint32(*GetLiquidFlagsFn)(uint32 liquidType); diff --git a/src/common/Collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp index 7b6320a06..33ba1b0dc 100644 --- a/src/common/Collision/Maps/MapTree.cpp +++ b/src/common/Collision/Maps/MapTree.cpp @@ -249,7 +249,7 @@ namespace VMAP //========================================================= - bool StaticMapTree::CanLoadMap(const std::string& vmapPath, uint32 mapID, uint32 tileX, uint32 tileY) + LoadResult StaticMapTree::CanLoadMap(const std::string& vmapPath, uint32 mapID, uint32 tileX, uint32 tileY) { std::string basePath = vmapPath; if (basePath.length() > 0 && basePath[basePath.length() - 1] != '/' && basePath[basePath.length() - 1] != '\\') @@ -257,19 +257,21 @@ namespace VMAP basePath.push_back('/'); } std::string fullname = basePath + VMapMgr2::getMapFileName(mapID); - bool success = true; + + LoadResult result = LoadResult::Success; + FILE* rf = fopen(fullname.c_str(), "rb"); if (!rf) { - return false; + return LoadResult::FileNotFound; } - // TODO: check magic number when implemented... + char tiled; char chunk[8]; if (!readChunk(rf, chunk, VMAP_MAGIC, 8) || fread(&tiled, sizeof(char), 1, rf) != 1) { fclose(rf); - return false; + return LoadResult::VersionMismatch; } if (tiled) { @@ -277,19 +279,19 @@ namespace VMAP FILE* tf = fopen(tilefile.c_str(), "rb"); if (!tf) { - success = false; + result = LoadResult::FileNotFound; } else { if (!readChunk(tf, chunk, VMAP_MAGIC, 8)) { - success = false; + result = LoadResult::VersionMismatch; } fclose(tf); } } fclose(rf); - return success; + return result; } //========================================================= diff --git a/src/common/Collision/Maps/MapTree.h b/src/common/Collision/Maps/MapTree.h index a899533b5..8bfc454ae 100644 --- a/src/common/Collision/Maps/MapTree.h +++ b/src/common/Collision/Maps/MapTree.h @@ -27,6 +27,7 @@ namespace VMAP class ModelInstance; class GroupModel; class VMapMgr2; + enum class LoadResult : uint8; struct LocationInfo { @@ -63,7 +64,7 @@ namespace VMAP static std::string getTileFileName(uint32 mapID, uint32 tileX, uint32 tileY); static uint32 packTileID(uint32 tileX, uint32 tileY) { return tileX << 16 | tileY; } static void unpackTileID(uint32 ID, uint32& tileX, uint32& tileY) { tileX = ID >> 16; tileY = ID & 0xFF; } - static bool CanLoadMap(const std::string& basePath, uint32 mapID, uint32 tileX, uint32 tileY); + static LoadResult CanLoadMap(const std::string& basePath, uint32 mapID, uint32 tileX, uint32 tileY); StaticMapTree(uint32 mapID, const std::string& basePath); ~StaticMapTree(); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 84609a99d..bd511806e 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -121,12 +121,20 @@ bool Map::ExistVMap(uint32 mapid, int gx, int gy) { if (vmgr->isMapLoadingEnabled()) { - bool exists = vmgr->existsMap((sWorld->GetDataPath() + "vmaps").c_str(), mapid, gx, gy); - if (!exists) + VMAP::LoadResult result = vmgr->existsMap((sWorld->GetDataPath() + "vmaps").c_str(), mapid, gx, gy); + std::string name = vmgr->getDirFileName(mapid, gx, gy); + switch (result) { - std::string name = vmgr->getDirFileName(mapid, gx, gy); - LOG_ERROR("maps", "VMap file '{}' is missing or points to wrong version of vmap file. Redo vmaps with latest version of vmap_assembler.exe.", (sWorld->GetDataPath() + "vmaps/" + name)); - return false; + case VMAP::LoadResult::Success: + break; + case VMAP::LoadResult::FileNotFound: + LOG_ERROR("maps", "VMap file '{}' does not exist", (sWorld->GetDataPath() + "vmaps/" + name)); + LOG_ERROR("maps", "Please place VMAP files (*.vmtree and *.vmtile) in the vmap directory ({}), or correct the DataDir setting in your worldserver.conf file.", (sWorld->GetDataPath() + "vmaps/")); + return false; + case VMAP::LoadResult::VersionMismatch: + LOG_ERROR("maps", "VMap file '{}' couldn't be loaded", (sWorld->GetDataPath() + "vmaps/" + name)); + LOG_ERROR("maps", "This is because the version of the VMap file and the version of this module are different, please re-extract the maps with the tools compiled with this module."); + return false; } } }