mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-25 19:31:59 +01:00
Tools/vmapextractor: Update to new m2 and wmo structures
This commit is contained in:
@@ -25,8 +25,20 @@
|
||||
#include <algorithm>
|
||||
#include <stdio.h>
|
||||
|
||||
bool ExtractSingleModel(std::string& name)
|
||||
bool ExtractSingleModel(std::string& fname)
|
||||
{
|
||||
if (fname.substr(fname.length() - 4, 4) == ".mdx")
|
||||
{
|
||||
fname.erase(fname.length() - 2, 2);
|
||||
fname.append("2");
|
||||
}
|
||||
|
||||
std::string originalName = fname;
|
||||
|
||||
char* name = GetPlainName((char*)fname.c_str());
|
||||
FixNameCase(name, strlen(name));
|
||||
FixNameSpaces(name, strlen(name));
|
||||
|
||||
std::string output(szWorkDirWmo);
|
||||
output += "/";
|
||||
output += name;
|
||||
@@ -34,7 +46,7 @@ bool ExtractSingleModel(std::string& name)
|
||||
if (FileExists(output.c_str()))
|
||||
return true;
|
||||
|
||||
Model mdl(name);
|
||||
Model mdl(originalName);
|
||||
if (!mdl.open())
|
||||
return false;
|
||||
|
||||
@@ -64,22 +76,22 @@ enum ModelTypes : uint32
|
||||
{
|
||||
MODEL_MD20 = '02DM',
|
||||
MODEL_MD21 = '12DM',
|
||||
MODEL_WMO = 'REVM'
|
||||
MODEL_WMO = 'MVER'
|
||||
};
|
||||
|
||||
uint32 GetHeaderMagic(std::string const& fileName)
|
||||
bool GetHeaderMagic(std::string const& fileName, uint32* magic)
|
||||
{
|
||||
*magic = 0;
|
||||
HANDLE file;
|
||||
if (!CascOpenFile(CascStorage, fileName.c_str(), CASC_LOCALE_ALL, 0, &file))
|
||||
return 0;
|
||||
return false;
|
||||
|
||||
std::unique_ptr<HANDLE, CascFileHandleDeleter> modelFile(file);
|
||||
uint32 magic = 0;
|
||||
DWORD bytesRead = 0;
|
||||
if (!CascReadFile(file, &magic, 4, &bytesRead) || bytesRead != 4)
|
||||
return 0;
|
||||
if (!CascReadFile(file, magic, 4, &bytesRead) || bytesRead != 4)
|
||||
return false;
|
||||
|
||||
return magic;
|
||||
return true;
|
||||
}
|
||||
|
||||
void ExtractGameobjectModels()
|
||||
@@ -116,12 +128,18 @@ void ExtractGameobjectModels()
|
||||
if (!fileId)
|
||||
continue;
|
||||
|
||||
std::string fileName = Trinity::StringFormat("FILE%08X", fileId);
|
||||
std::string fileName = Trinity::StringFormat("FILE%08X.xxx", fileId);
|
||||
bool result = false;
|
||||
if (GetHeaderMagic(fileName) == MODEL_WMO)
|
||||
uint32 header;
|
||||
if (!GetHeaderMagic(fileName, &header))
|
||||
continue;
|
||||
|
||||
if (header == MODEL_WMO)
|
||||
result = ExtractSingleWmo(fileName);
|
||||
else
|
||||
else if (header == MODEL_MD20 || header == MODEL_MD21)
|
||||
result = ExtractSingleModel(fileName);
|
||||
else
|
||||
ASSERT(false, "%s header: %d - %c%c%c%c", fileName.c_str(), header, (header >> 24) & 0xFF, (header >> 16) & 0xFF, (header >> 8) & 0xFF, header & 0xFF);
|
||||
|
||||
if (result)
|
||||
{
|
||||
|
||||
@@ -45,15 +45,17 @@ bool Model::open()
|
||||
|
||||
_unload();
|
||||
|
||||
uint32 m2start = 0;
|
||||
int32 m2start = 0;
|
||||
char const* ptr = f.getBuffer();
|
||||
while (m2start + 4 < f.getSize() && *reinterpret_cast<uint32 const*>(ptr) != '02DM')
|
||||
{
|
||||
++m2start;
|
||||
++ptr;
|
||||
if (m2start + sizeof(ModelHeader) > f.getSize())
|
||||
return false;
|
||||
}
|
||||
|
||||
memcpy(&header, f.getBuffer(), sizeof(ModelHeader));
|
||||
memcpy(&header, f.getBuffer() + m2start, sizeof(ModelHeader));
|
||||
if (header.nBoundingTriangles > 0)
|
||||
{
|
||||
f.seek(m2start);
|
||||
@@ -185,21 +187,21 @@ ModelInstance::ModelInstance(MPQFile& f, char const* ModelInstName, uint32 mapID
|
||||
return;
|
||||
|
||||
uint16 adtId = 0;// not used for models
|
||||
uint32 flags = MOD_M2;
|
||||
uint32 tcflags = MOD_M2;
|
||||
if (tileX == 65 && tileY == 65)
|
||||
flags |= MOD_WORLDSPAWN;
|
||||
tcflags |= MOD_WORLDSPAWN;
|
||||
|
||||
//write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, name
|
||||
fwrite(&mapID, sizeof(uint32), 1, pDirfile);
|
||||
fwrite(&tileX, sizeof(uint32), 1, pDirfile);
|
||||
fwrite(&tileY, sizeof(uint32), 1, pDirfile);
|
||||
fwrite(&flags, sizeof(uint32), 1, pDirfile);
|
||||
fwrite(&tcflags, sizeof(uint32), 1, pDirfile);
|
||||
fwrite(&adtId, sizeof(uint16), 1, pDirfile);
|
||||
fwrite(&id, sizeof(uint32), 1, pDirfile);
|
||||
fwrite(&pos, sizeof(float), 3, pDirfile);
|
||||
fwrite(&rot, sizeof(float), 3, pDirfile);
|
||||
fwrite(&sc, sizeof(float), 1, pDirfile);
|
||||
uint32 nlen=strlen(ModelInstName);
|
||||
uint32 nlen = strlen(ModelInstName);
|
||||
fwrite(&nlen, sizeof(uint32), 1, pDirfile);
|
||||
fwrite(ModelInstName, sizeof(char), nlen, pDirfile);
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ extern std::vector<uint16> LiqType;
|
||||
|
||||
WMORoot::WMORoot(std::string &filename)
|
||||
: filename(filename), color(0), nTextures(0), nGroups(0), nPortals(0), nLights(0),
|
||||
nDoodadNames(0), nDoodadDefs(0), nDoodadSets(0), RootWMOID(0), flags(0)
|
||||
nDoodadNames(0), nDoodadDefs(0), nDoodadSets(0), RootWMOID(0), flags(0), numLod(0)
|
||||
{
|
||||
memset(bbcorn1, 0, sizeof(bbcorn1));
|
||||
memset(bbcorn2, 0, sizeof(bbcorn2));
|
||||
@@ -76,20 +76,34 @@ bool WMORoot::open()
|
||||
f.read(&RootWMOID, 4);
|
||||
f.read(bbcorn1, 12);
|
||||
f.read(bbcorn2, 12);
|
||||
f.read(&flags, 4);
|
||||
break;
|
||||
f.read(&flags, 2);
|
||||
f.read(&numLod, 2);
|
||||
}
|
||||
else if (!strcmp(fourcc, "GFID"))
|
||||
{
|
||||
for (uint32 gp = 0; gp < nGroups; ++gp)
|
||||
{
|
||||
uint32 fileDataId;
|
||||
f.read(&fileDataId, 4);
|
||||
groupFileDataIDs.push_back(fileDataId);
|
||||
// full LOD reading code for reference
|
||||
// commented out as we are not interested in any of them beyond first, most detailed
|
||||
|
||||
if (flags & 16) // LOD related
|
||||
f.seekRelative(8);
|
||||
}
|
||||
//uint16 lodCount = 1;
|
||||
//if (flags & 0x10)
|
||||
//{
|
||||
// if (numLod)
|
||||
// lodCount = numLod;
|
||||
// else
|
||||
// lodCount = 3;
|
||||
//}
|
||||
|
||||
//for (uint32 lod = 0; lod < lodCount; ++lod)
|
||||
//{
|
||||
for (uint32 gp = 0; gp < nGroups; ++gp)
|
||||
{
|
||||
uint32 fileDataId;
|
||||
f.read(&fileDataId, 4);
|
||||
if (fileDataId)
|
||||
groupFileDataIDs.push_back(fileDataId);
|
||||
}
|
||||
// break;
|
||||
//}
|
||||
}
|
||||
/*
|
||||
else if (!strcmp(fourcc,"MOTX"))
|
||||
|
||||
@@ -49,9 +49,10 @@ private:
|
||||
std::string filename;
|
||||
public:
|
||||
unsigned int color;
|
||||
uint32 nTextures, nGroups, nPortals, nLights, nDoodadNames, nDoodadDefs, nDoodadSets, RootWMOID, flags;
|
||||
uint32 nTextures, nGroups, nPortals, nLights, nDoodadNames, nDoodadDefs, nDoodadSets, RootWMOID;
|
||||
float bbcorn1[3];
|
||||
float bbcorn2[3];
|
||||
uint16 flags, numLod;
|
||||
|
||||
std::vector<uint32> groupFileDataIDs;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user