Tools/vmap_extractor: Preserve UniqueId from MODF adt chunks in final vmap output (used in db2 files and packets)

This commit is contained in:
Shauren
2024-03-06 00:04:19 +01:00
parent 1aa04cabe1
commit 382e76f02d
4 changed files with 9 additions and 6 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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);

View File

@@ -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)