From 7ac5a527e15b4bce3c1c5bd87c10969767aa9086 Mon Sep 17 00:00:00 2001 From: Anton Popovichenko Date: Tue, 2 Dec 2025 23:08:17 +0100 Subject: [PATCH] fix(Core/Vmaps): Introduce skipping of antiportals and unreachable mogp (#23781) Co-authored-by: killerwife <7995382+killerwife@users.noreply.github.com> Co-authored-by: Ryan Turner <16946913+TheSCREWEDSoftware@users.noreply.github.com> Co-authored-by: Rocco Silipo <108557877+Rorschach91@users.noreply.github.com> --- src/common/Collision/Maps/MapDefines.h | 2 +- src/common/Collision/VMapDefinitions.h | 4 ++-- src/tools/vmap4_extractor/vmapexport.cpp | 7 +++++++ src/tools/vmap4_extractor/vmapexport.h | 4 ++-- src/tools/vmap4_extractor/wmo.cpp | 21 +++++++++++++++++++++ src/tools/vmap4_extractor/wmo.h | 2 ++ 6 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/common/Collision/Maps/MapDefines.h b/src/common/Collision/Maps/MapDefines.h index d928c5172..a3527f16c 100644 --- a/src/common/Collision/Maps/MapDefines.h +++ b/src/common/Collision/Maps/MapDefines.h @@ -26,7 +26,7 @@ #define SIZE_OF_GRIDS 533.3333f #define MMAP_MAGIC 0x4d4d4150 // 'MMAP' -#define MMAP_VERSION 18 +#define MMAP_VERSION 19 struct MmapTileRecastConfig { diff --git a/src/common/Collision/VMapDefinitions.h b/src/common/Collision/VMapDefinitions.h index 623dea502..b8026d949 100644 --- a/src/common/Collision/VMapDefinitions.h +++ b/src/common/Collision/VMapDefinitions.h @@ -22,8 +22,8 @@ namespace VMAP { - const char VMAP_MAGIC[] = "VMAP_4.7"; - const char RAW_VMAP_MAGIC[] = "VMAP047"; // used in extracted vmap files with raw data + const char VMAP_MAGIC[] = "VMAP_4.8"; + const char RAW_VMAP_MAGIC[] = "VMAP048"; // used in extracted vmap files with raw data const char GAMEOBJECT_MODELS[] = "GameObjectModels.dtree"; // defined in TileAssembler.cpp currently... diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index 3b6e5a5be..52f4983f8 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -144,6 +144,7 @@ bool ExtractSingleWmo(std::string& fname) WMODoodadData& doodads = WmoDoodads[plain_name]; std::swap(doodads, froot.DoodadData); int Wmo_nVertices = 0; + uint32 groupCount = 0; //printf("root has %d groups\n", froot->nGroups); if (froot.nGroups != 0) { @@ -170,7 +171,11 @@ bool ExtractSingleWmo(std::string& fname) break; } + if (fgroup.ShouldSkip(&froot)) + continue; + Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, preciseVectorData); + ++groupCount; for (uint16 groupReference : fgroup.DoodadReferences) { if (groupReference >= doodads.Spawns.size()) @@ -187,6 +192,8 @@ bool ExtractSingleWmo(std::string& fname) fseek(output, 8, SEEK_SET); // store the correct no of vertices fwrite(&Wmo_nVertices, sizeof(int), 1, output); + // store the correct no of groups + fwrite(&groupCount, sizeof(uint32), 1, output); fclose(output); // Delete the extracted file in the case of an error diff --git a/src/tools/vmap4_extractor/vmapexport.h b/src/tools/vmap4_extractor/vmapexport.h index bf0872bfa..fc8433996 100644 --- a/src/tools/vmap4_extractor/vmapexport.h +++ b/src/tools/vmap4_extractor/vmapexport.h @@ -24,8 +24,8 @@ namespace VMAP { - const char VMAP_MAGIC[] = "VMAP_4.7"; - const char RAW_VMAP_MAGIC[] = "VMAP047"; // used in extracted vmap files with raw data + const char VMAP_MAGIC[] = "VMAP_4.8"; + const char RAW_VMAP_MAGIC[] = "VMAP048"; // used in extracted vmap files with raw data } enum ModelFlags diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 0a2536794..ed20db119 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -103,6 +103,11 @@ bool WMORoot::open() DoodadData.Spawns.resize(size / sizeof(WMO::MODD)); f.read(DoodadData.Spawns.data(), size); } + else if (!strcmp(fourcc, "MOGN")) + { + GroupNames.resize(size); + f.read(GroupNames.data(), size); + } /* else if (!strcmp(fourcc,"MOTX")) { @@ -497,6 +502,22 @@ uint32 WMOGroup::GetLiquidTypeId(uint32 liquidTypeId) return liquidTypeId; } +bool WMOGroup::ShouldSkip(WMORoot const* root) const +{ + // skip unreachable + if (mogpFlags & 0x80) + return true; + + // skip antiportals + if (mogpFlags & 0x4000000) + return true; + + if (groupName < int32(root->GroupNames.size()) && !strcmp(&root->GroupNames[groupName], "antiportal")) + return true; + + return false; +} + WMOGroup::~WMOGroup() { delete [] MOPY; diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h index dc44331e3..4d00b11ce 100644 --- a/src/tools/vmap4_extractor/wmo.h +++ b/src/tools/vmap4_extractor/wmo.h @@ -85,6 +85,7 @@ public: float bbcorn1[3]; float bbcorn2[3]; + std::vector GroupNames; WMODoodadData DoodadData; std::unordered_set ValidDoodadNames; @@ -154,6 +155,7 @@ public: bool open(WMORoot* rootWMO); int ConvertToVMAPGroupWmo(FILE* output, bool preciseVectorData); uint32 GetLiquidTypeId(uint32 liquidTypeId); + bool ShouldSkip(WMORoot const* root) const; }; namespace MapObject