aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-11-01 14:26:48 +0100
committerShauren <shauren.trinity@gmail.com>2025-11-01 14:26:48 +0100
commit157a16d7908c6a6d46ce34a0d067ad56f22d6f4f (patch)
tree0701bf63ef50bd443c381867b9db02c0c5f90124 /src
parent0b4f02c00212add794467a6ef3579ecda8faa8eb (diff)
Tools/vmap_extractor: Preserve destructible models to use them in mmaps_generator
Diffstat (limited to 'src')
-rw-r--r--src/common/Collision/Management/VMapManager.cpp3
-rw-r--r--src/common/Collision/Management/VMapManager.h2
-rw-r--r--src/common/Collision/Maps/MapTree.cpp6
-rw-r--r--src/common/Collision/Models/ModelInstance.h3
-rw-r--r--src/tools/mmaps_generator/PathGenerator.cpp1
-rw-r--r--src/tools/vmap4_extractor/adtfile.cpp18
-rw-r--r--src/tools/vmap4_extractor/vmapexport.h3
-rw-r--r--src/tools/vmap4_extractor/wdtfile.cpp17
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp16
9 files changed, 43 insertions, 26 deletions
diff --git a/src/common/Collision/Management/VMapManager.cpp b/src/common/Collision/Management/VMapManager.cpp
index ddf8c70be71..b1d1765f54d 100644
--- a/src/common/Collision/Management/VMapManager.cpp
+++ b/src/common/Collision/Management/VMapManager.cpp
@@ -60,7 +60,8 @@ namespace VMAP
iEnableHeightCalc(true),
thread_safe_environment(true),
GetLiquidFlagsPtr([](uint32 /*liquidTypeId*/) { return 0u; }),
- IsVMAPDisabledForPtr([](uint32 /*mapId*/, uint8 /*disableFlags*/) { return false; })
+ IsVMAPDisabledForPtr([](uint32 /*mapId*/, uint8 /*disableFlags*/) { return false; }),
+ LoadPathOnlyModels(false)
{
}
diff --git a/src/common/Collision/Management/VMapManager.h b/src/common/Collision/Management/VMapManager.h
index ae91d3db50e..67e897ea986 100644
--- a/src/common/Collision/Management/VMapManager.h
+++ b/src/common/Collision/Management/VMapManager.h
@@ -182,6 +182,8 @@ namespace VMAP
typedef bool(*IsVMAPDisabledForFn)(uint32 entry, uint8 flags);
IsVMAPDisabledForFn IsVMAPDisabledForPtr;
+
+ bool LoadPathOnlyModels;
};
}
diff --git a/src/common/Collision/Maps/MapTree.cpp b/src/common/Collision/Maps/MapTree.cpp
index 086ef975f1f..982256f896f 100644
--- a/src/common/Collision/Maps/MapTree.cpp
+++ b/src/common/Collision/Maps/MapTree.cpp
@@ -318,6 +318,9 @@ namespace VMAP
ModelSpawn spawn;
if (ModelSpawn::readFromFile(fileResult.TileFile.get(), spawn))
{
+ if (spawn.flags & MOD_PATH_ONLY && !vm->LoadPathOnlyModels)
+ continue;
+
// acquire model instance
std::shared_ptr<WorldModel> model = vm->acquireModelInstance(iBasePath, spawn.name);
if (!model)
@@ -402,6 +405,9 @@ namespace VMAP
if (!ModelSpawn::readFromFile(fileResult.TileFile.get(), spawn))
break;
+ if (spawn.flags & MOD_PATH_ONLY && !vm->LoadPathOnlyModels)
+ continue;
+
// update tree
uint32 referencedNode = 0;
if (fread(&referencedNode, sizeof(uint32), 1, fileResult.SpawnIndicesFile.get()) != 1)
diff --git a/src/common/Collision/Models/ModelInstance.h b/src/common/Collision/Models/ModelInstance.h
index 1621e1d052e..6b5cb31c768 100644
--- a/src/common/Collision/Models/ModelInstance.h
+++ b/src/common/Collision/Models/ModelInstance.h
@@ -35,7 +35,8 @@ namespace VMAP
enum ModelInstanceFlags
{
MOD_HAS_BOUND = 1 << 0,
- MOD_PARENT_SPAWN = 1 << 1
+ MOD_PARENT_SPAWN = 1 << 1,
+ MOD_PATH_ONLY = 1 << 2
};
struct ModelMinimalData
diff --git a/src/tools/mmaps_generator/PathGenerator.cpp b/src/tools/mmaps_generator/PathGenerator.cpp
index b090678e83a..af4eb816626 100644
--- a/src/tools/mmaps_generator/PathGenerator.cpp
+++ b/src/tools/mmaps_generator/PathGenerator.cpp
@@ -68,6 +68,7 @@ namespace MMAP
auto itr = _liquidTypes.find(liquidId);
return itr != _liquidTypes.end() ? (1 << itr->second) : 0;
};
+ vmgr->LoadPathOnlyModels = true;
return vmgr;
}
}
diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp
index 2db74603093..01c1f3f5b53 100644
--- a/src/tools/vmap4_extractor/adtfile.cpp
+++ b/src/tools/vmap4_extractor/adtfile.cpp
@@ -207,18 +207,18 @@ bool ADTFile::init(uint32 map_num, uint32 originalMapId)
{
ADT::MODF mapObjDef;
_file.read(&mapObjDef, sizeof(ADT::MODF));
- if (!(mapObjDef.Flags & 0x8))
- {
- MapObject::Extract(mapObjDef, WmoInstanceNames[mapObjDef.Id].c_str(), false, map_num, originalMapId, dirfile.get(), dirfileCache);
- Doodad::ExtractSet(WmoDoodads[WmoInstanceNames[mapObjDef.Id]], mapObjDef, false, map_num, originalMapId, dirfile.get(), dirfileCache);
- }
- else
+
+ std::string fileName;
+ if (mapObjDef.Flags & 0x8)
{
- std::string fileName = Trinity::StringFormat("FILE{:08X}.xxx", mapObjDef.Id);
+ fileName = Trinity::StringFormat("FILE{:08X}.xxx", mapObjDef.Id);
ExtractSingleWmo(fileName);
- MapObject::Extract(mapObjDef, fileName.c_str(), false, map_num, originalMapId, dirfile.get(), dirfileCache);
- Doodad::ExtractSet(WmoDoodads[fileName], mapObjDef, false, map_num, originalMapId, dirfile.get(), dirfileCache);
}
+ else
+ fileName = WmoInstanceNames[mapObjDef.Id];
+
+ MapObject::Extract(mapObjDef, fileName.c_str(), false, map_num, originalMapId, dirfile.get(), dirfileCache);
+ Doodad::ExtractSet(WmoDoodads[fileName], mapObjDef, false, map_num, originalMapId, dirfile.get(), dirfileCache);
}
WmoInstanceNames.clear();
diff --git a/src/tools/vmap4_extractor/vmapexport.h b/src/tools/vmap4_extractor/vmapexport.h
index 1aba56a44c1..c6a88518083 100644
--- a/src/tools/vmap4_extractor/vmapexport.h
+++ b/src/tools/vmap4_extractor/vmapexport.h
@@ -26,7 +26,8 @@
enum ModelInstanceFlags
{
MOD_HAS_BOUND = 1 << 0,
- MOD_PARENT_SPAWN = 1 << 1
+ MOD_PARENT_SPAWN = 1 << 1,
+ MOD_PATH_ONLY = 1 << 2
};
// flags of each model
diff --git a/src/tools/vmap4_extractor/wdtfile.cpp b/src/tools/vmap4_extractor/wdtfile.cpp
index de806159ba0..f507d14b1a7 100644
--- a/src/tools/vmap4_extractor/wdtfile.cpp
+++ b/src/tools/vmap4_extractor/wdtfile.cpp
@@ -116,18 +116,17 @@ bool WDTFile::init(uint32 mapId)
{
ADT::MODF mapObjDef;
_file.read(&mapObjDef, sizeof(ADT::MODF));
- if (!(mapObjDef.Flags & 0x8))
+ std::string fileName;
+ if (mapObjDef.Flags & 0x8)
{
- MapObject::Extract(mapObjDef, _wmoNames[mapObjDef.Id].c_str(), true, mapId, mapId, dirfile.get(), nullptr);
- Doodad::ExtractSet(WmoDoodads[_wmoNames[mapObjDef.Id]], mapObjDef, true, mapId, mapId, dirfile.get(), nullptr);
- }
- else
- {
- std::string fileName = Trinity::StringFormat("FILE{:08X}.xxx", mapObjDef.Id);
+ fileName = Trinity::StringFormat("FILE{:08X}.xxx", mapObjDef.Id);
ExtractSingleWmo(fileName);
- MapObject::Extract(mapObjDef, fileName.c_str(), true, mapId, mapId, dirfile.get(), nullptr);
- Doodad::ExtractSet(WmoDoodads[fileName], mapObjDef, true, mapId, mapId, dirfile.get(), nullptr);
}
+ else
+ fileName = _wmoNames[mapObjDef.Id];
+
+ MapObject::Extract(mapObjDef, fileName.c_str(), true, mapId, mapId, dirfile.get(), nullptr);
+ Doodad::ExtractSet(WmoDoodads[fileName], mapObjDef, true, mapId, mapId, dirfile.get(), nullptr);
}
}
}
diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp
index 001abad4907..77985aefacf 100644
--- a/src/tools/vmap4_extractor/wmo.cpp
+++ b/src/tools/vmap4_extractor/wmo.cpp
@@ -587,11 +587,6 @@ WMOGroup::~WMOGroup()
void MapObject::Extract(ADT::MODF const& mapObjDef, char const* WmoInstName, bool isGlobalWmo, uint32 mapID, uint32 originalMapId, FILE* pDirfile, std::vector<ADTOutputCache>* dirfileCache)
{
- // destructible wmo, do not dump. we can handle the vmap for these
- // in dynamic tree (gameobject vmaps)
- if ((mapObjDef.Flags & 0x1) != 0)
- return;
-
//-----------add_in _dir_file----------------
std::string tempname = Trinity::StringFormat("{}/{}", szWorkDirWmo, WmoInstName);
@@ -630,6 +625,17 @@ void MapObject::Extract(ADT::MODF const& mapObjDef, char const* WmoInstName, boo
uint8 nameSet = mapObjDef.NameSet;
if (mapID != originalMapId)
flags |= MOD_PARENT_SPAWN;
+ if (mapObjDef.Flags & 0x1)
+ {
+ flags |= MOD_PATH_ONLY;
+ //if (FILE* destro = fopen("Buildings/destructible.log", "a"))
+ //{
+ // fprintf(destro, R"( { fileName: "%s", fileDataID: %u, mapId: %u, uniqueId: %u, pos: { x: %f, y: %f, z: %f }, rot: { x: %f, y: %f, z: %f } },)" "\n",
+ // WmoInstName, mapObjDef.Id, mapID, mapObjDef.UniqueId, 533.33333f * 32 - mapObjDef.Position.z, 533.33333f * 32 - mapObjDef.Position.x, mapObjDef.Position.y,
+ // mapObjDef.Rotation.x, mapObjDef.Rotation.y, mapObjDef.Rotation.z);
+ // fclose(destro);
+ //}
+ }
//write Flags, NameSet, UniqueId, Pos, Rot, Scale, Bound_lo, Bound_hi, name
fwrite(&flags, sizeof(uint8), 1, pDirfile);