From 8d45d1dd4824fb001b46aeb8ed79bc20b86f2265 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 23 Mar 2024 16:28:11 +0100 Subject: Tools/vmap_extractor: Support new 9.2 wmo group splits (child groups should inherit their parent wmo group id) --- src/tools/vmap4_extractor/vmapexport.cpp | 12 +++++++++++- src/tools/vmap4_extractor/wmo.cpp | 5 ++++- src/tools/vmap4_extractor/wmo.h | 5 +++++ 3 files changed, 20 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index d8444bc6b84..00edf74987b 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -227,20 +227,30 @@ bool ExtractSingleWmo(std::string& fname) int Wmo_nVertices = 0; uint32 groupCount = 0; //printf("root has %d groups\n", froot->nGroups); + std::vector groups; + groups.reserve(froot.groupFileDataIDs.size()); for (std::size_t i = 0; i < froot.groupFileDataIDs.size(); ++i) { std::string s = Trinity::StringFormat("FILE{:08X}.xxx", froot.groupFileDataIDs[i]); - WMOGroup fgroup(s); + WMOGroup& fgroup = groups.emplace_back(s); if (!fgroup.open(&froot)) { printf("Could not open all Group file for: %s\n", plain_name); file_ok = false; break; } + } + for (WMOGroup& fgroup : groups) + { if (fgroup.ShouldSkip(&froot)) continue; + if (fgroup.mogpFlags2 & 0x80 + && fgroup.parentOrFirstChildSplitGroupIndex >= 0 + && fgroup.parentOrFirstChildSplitGroupIndex < groups.size()) + fgroup.groupWMOID = groups[fgroup.parentOrFirstChildSplitGroupIndex].groupWMOID; + Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, preciseVectorData); ++groupCount; for (uint16 groupReference : fgroup.DoodadReferences) diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp index 4301e758cb5..d883ab3597e 100644 --- a/src/tools/vmap4_extractor/wmo.cpp +++ b/src/tools/vmap4_extractor/wmo.cpp @@ -249,7 +249,10 @@ bool WMOGroup::open(WMORoot* rootWMO) f.read(&nBatchC, 4); f.read(&fogIdx, 4); f.read(&groupLiquid, 4); - f.read(&groupWMOID,4); + f.read(&groupWMOID, 4); + f.read(&mogpFlags2, 4); + f.read(&parentOrFirstChildSplitGroupIndex, 2); + f.read(&nextSplitChildGroupIndex, 2); // according to WoW.Dev Wiki: if (rootWMO->flags & 4) diff --git a/src/tools/vmap4_extractor/wmo.h b/src/tools/vmap4_extractor/wmo.h index 4e149c02422..4215b228b4e 100644 --- a/src/tools/vmap4_extractor/wmo.h +++ b/src/tools/vmap4_extractor/wmo.h @@ -141,6 +141,9 @@ public: uint16 nBatchA; uint16 nBatchB; uint32 nBatchC, fogIdx, groupLiquid, groupWMOID; + uint32 mogpFlags2; + int16 parentOrFirstChildSplitGroupIndex; + int16 nextSplitChildGroupIndex; int moba_size; int LiquEx_size; @@ -151,6 +154,8 @@ public: std::vector DoodadReferences; WMOGroup(std::string const& filename); + WMOGroup(WMOGroup&&) = default; + WMOGroup& operator=(WMOGroup&&) = default; ~WMOGroup(); bool open(WMORoot* rootWMO); -- cgit v1.2.3