From 382e76f02df5a41c2ba1d964ac6d9258e68265e6 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 6 Mar 2024 00:04:19 +0100 Subject: Tools/vmap_extractor: Preserve UniqueId from MODF adt chunks in final vmap output (used in db2 files and packets) --- src/tools/vmap4_extractor/model.cpp | 4 ++-- src/tools/vmap4_extractor/vmapexport.cpp | 7 +++++-- src/tools/vmap4_extractor/vmapexport.h | 2 +- src/tools/vmap4_extractor/wmo.cpp | 2 +- 4 files changed, 9 insertions(+), 6 deletions(-) (limited to 'src') 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::max() - 1; std::map, 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 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) -- cgit v1.2.3