aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-06 00:04:19 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-06 00:04:19 +0100
commit382e76f02df5a41c2ba1d964ac6d9258e68265e6 (patch)
treecd035dd536b5c9502c0d7dbbb0a5b2edfaab2759 /src
parent1aa04cabe1e4ceb093b3dfed780adb5ed827cbf9 (diff)
Tools/vmap_extractor: Preserve UniqueId from MODF adt chunks in final vmap output (used in db2 files and packets)
Diffstat (limited to 'src')
-rw-r--r--src/tools/vmap4_extractor/model.cpp4
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp7
-rw-r--r--src/tools/vmap4_extractor/vmapexport.h2
-rw-r--r--src/tools/vmap4_extractor/wmo.cpp2
4 files changed, 9 insertions, 6 deletions
diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp
index 9c8d3f5ac6b..f49df2ea119 100644
--- a/src/tools/vmap4_extractor/model.cpp
+++ b/src/tools/vmap4_extractor/model.cpp
@@ -176,7 +176,7 @@ void Doodad::Extract(ADT::MDDF const& doodadDef, char const* ModelInstName, uint
Vec3D position = fixCoords(doodadDef.Position);
uint8 nameSet = 0;// not used for models
- uint32 uniqueId = GenerateUniqueObjectId(doodadDef.UniqueId, 0);
+ uint32 uniqueId = GenerateUniqueObjectId(doodadDef.UniqueId, 0, false);
uint8 tcflags = MOD_M2;
if (mapID != originalMapId)
tcflags |= MOD_PARENT_SPAWN;
@@ -284,7 +284,7 @@ void Doodad::ExtractSet(WMODoodadData const& doodadData, ADT::MODF const& wmo, b
rotation.y = G3D::toDegrees(rotation.y);
uint8 nameSet = 0; // not used for models
- uint32 uniqueId = GenerateUniqueObjectId(wmo.UniqueId, doodadId);
+ uint32 uniqueId = GenerateUniqueObjectId(wmo.UniqueId, doodadId, false);
uint8 tcflags = MOD_M2;
if (mapID != originalMapId)
tcflags |= MOD_PARENT_SPAWN;
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
index 759750bcfd0..d8444bc6b84 100644
--- a/src/tools/vmap4_extractor/vmapexport.cpp
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -164,11 +164,14 @@ uint32 GetInstalledLocalesMask()
return 0;
}
+uint32 uniqueObjectIdGenerator = std::numeric_limits<uint32>::max() - 1;
std::map<std::pair<uint32, uint16>, uint32> uniqueObjectIds;
-uint32 GenerateUniqueObjectId(uint32 clientId, uint16 clientDoodadId)
+uint32 GenerateUniqueObjectId(uint32 clientId, uint16 clientDoodadId, bool isWmo)
{
- return uniqueObjectIds.emplace(std::make_pair(clientId, clientDoodadId), uniqueObjectIds.size() + 1).first->second;
+ // WMO client ids must be preserved, they are used in DB2 files
+ uint32 newId = isWmo ? clientId : uniqueObjectIdGenerator--;
+ return uniqueObjectIds.emplace(std::make_pair(clientId, clientDoodadId), newId).first->second;
}
// Local testing functions
diff --git a/src/tools/vmap4_extractor/vmapexport.h b/src/tools/vmap4_extractor/vmapexport.h
index fe977cb639a..611e9711604 100644
--- a/src/tools/vmap4_extractor/vmapexport.h
+++ b/src/tools/vmap4_extractor/vmapexport.h
@@ -34,7 +34,7 @@ struct WMODoodadData;
extern const char * szWorkDirWmo;
extern std::unordered_map<std::string, WMODoodadData> WmoDoodads;
-uint32 GenerateUniqueObjectId(uint32 clientId, uint16 clientDoodadId);
+uint32 GenerateUniqueObjectId(uint32 clientId, uint16 clientDoodadId, bool isWmo);
bool FileExists(const char * file);
diff --git a/src/tools/vmap4_extractor/wmo.cpp b/src/tools/vmap4_extractor/wmo.cpp
index 555559cfb95..de53598c3d5 100644
--- a/src/tools/vmap4_extractor/wmo.cpp
+++ b/src/tools/vmap4_extractor/wmo.cpp
@@ -617,7 +617,7 @@ void MapObject::Extract(ADT::MODF const& mapObjDef, char const* WmoInstName, boo
float scale = 1.0f;
if (mapObjDef.Flags & 0x4)
scale = mapObjDef.Scale / 1024.0f;
- uint32 uniqueId = GenerateUniqueObjectId(mapObjDef.UniqueId, 0);
+ uint32 uniqueId = GenerateUniqueObjectId(mapObjDef.UniqueId, 0, true);
uint8 flags = MOD_HAS_BOUND;
uint8 nameSet = mapObjDef.NameSet;
if (mapID != originalMapId)