Tools: merged Master tools updates
This commit is contained in:
1 parent
9ade5b77ff
commit
fbcb423f60
27 files changed
+723
-571
No files matched your search
@@ -18,13 +18,10 @@
|
||||
|
||||
#include "vmapexport.h"
|
||||
#include "adtfile.h"
|
||||
|
||||
#include "StringFormat.h"
|
||||
#include <algorithm>
|
||||
#include <cstdio>
|
||||
|
||||
#ifdef WIN32
|
||||
#define snprintf _snprintf
|
||||
#endif
|
||||
#include "Errors.h"
|
||||
|
||||
char const* GetPlainName(char const* FileName)
|
||||
{
|
||||
@@ -63,11 +60,12 @@ void FixNameCase(char* name, size_t len)
|
||||
|
||||
void FixNameSpaces(char* name, size_t len)
|
||||
{
|
||||
for (size_t i=0; i<len-3; i++)
|
||||
{
|
||||
if (len < 3)
|
||||
return;
|
||||
|
||||
for (size_t i = 0; i < len - 3; i++)
|
||||
if (name[i] == ' ')
|
||||
name[i] = '_';
|
||||
}
|
||||
}
|
||||
|
||||
char* GetExtension(char* FileName)
|
||||
@@ -79,7 +77,7 @@ char* GetExtension(char* FileName)
|
||||
|
||||
extern HANDLE WorldMpq;
|
||||
|
||||
ADTFile::ADTFile(char* filename, bool cache) : ADT(WorldMpq, filename, false)
|
||||
ADTFile::ADTFile(char* filename, bool cache) : _file(WorldMpq, filename, false)
|
||||
{
|
||||
Adtfilename.append(filename);
|
||||
cacheable = cache;
|
||||
@@ -91,7 +89,7 @@ bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY, uint32 originalMa
|
||||
if (dirfileCache)
|
||||
return initFromCache(map_num, tileX, tileY, originalMapId);
|
||||
|
||||
if (ADT.isEof ())
|
||||
if (_file.isEof ())
|
||||
return false;
|
||||
|
||||
uint32 size;
|
||||
@@ -122,15 +120,15 @@ bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY, uint32 originalMa
|
||||
if (cacheable)
|
||||
dirfileCache = new std::vector<ADTOutputCache>();
|
||||
|
||||
while (!ADT.isEof())
|
||||
while (!_file.isEof())
|
||||
{
|
||||
char fourcc[5];
|
||||
ADT.read(&fourcc,4);
|
||||
ADT.read(&size, 4);
|
||||
_file.read(&fourcc,4);
|
||||
_file.read(&size, 4);
|
||||
flipcc(fourcc);
|
||||
fourcc[4] = 0;
|
||||
|
||||
size_t nextpos = ADT.getPos() + size;
|
||||
size_t nextpos = _file.getPos() + size;
|
||||
|
||||
if (!strcmp(fourcc,"MCIN"))
|
||||
{
|
||||
@@ -143,7 +141,7 @@ bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY, uint32 originalMa
|
||||
if (size)
|
||||
{
|
||||
char* buf = new char[size];
|
||||
ADT.read(buf, size);
|
||||
_file.read(buf, size);
|
||||
char* p = buf;
|
||||
int t = 0;
|
||||
ModelInstanceNames = new std::string[size];
|
||||
@@ -169,7 +167,7 @@ bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY, uint32 originalMa
|
||||
if (size)
|
||||
{
|
||||
char* buf = new char[size];
|
||||
ADT.read(buf, size);
|
||||
_file.read(buf, size);
|
||||
char* p = buf;
|
||||
int q = 0;
|
||||
WmoInstanceNames = new std::string[size];
|
||||
@@ -187,17 +185,27 @@ bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY, uint32 originalMa
|
||||
}
|
||||
}
|
||||
//======================
|
||||
else if (!strcmp(fourcc,"MDDF"))
|
||||
else if (!strcmp(fourcc, "MDDF"))
|
||||
{
|
||||
if (size)
|
||||
{
|
||||
nMDX = (int)size / 36;
|
||||
for (int i=0; i<nMDX; ++i)
|
||||
uint32 doodadCount = size / sizeof(ADT::MDDF);
|
||||
for (uint32 i = 0; i < doodadCount; ++i)
|
||||
{
|
||||
uint32 id;
|
||||
ADT.read(&id, 4);
|
||||
ModelInstance inst(ADT, ModelInstanceNames[id].c_str(), map_num, tileX, tileY, originalMapId, dirfile, dirfileCache);
|
||||
ADT::MDDF doodadDef;
|
||||
_file.read(&doodadDef, sizeof(ADT::MDDF));
|
||||
if (!(doodadDef.Flags & 0x40))
|
||||
{
|
||||
Doodad::Extract(doodadDef, ModelInstanceNames[doodadDef.Id].c_str(), map_num, tileX, tileY, originalMapId, dirfile, dirfileCache);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string fileName = Trinity::StringFormat("FILE%08X.xxx", doodadDef.Id);
|
||||
ExtractSingleModel(fileName);
|
||||
Doodad::Extract(doodadDef, fileName.c_str(), map_num, tileX, tileY, originalMapId, dirfile, dirfileCache);
|
||||
}
|
||||
}
|
||||
|
||||
delete[] ModelInstanceNames;
|
||||
ModelInstanceNames = nullptr;
|
||||
}
|
||||
@@ -206,12 +214,23 @@ bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY, uint32 originalMa
|
||||
{
|
||||
if (size)
|
||||
{
|
||||
nWMO = (int)size / 64;
|
||||
for (int i=0; i<nWMO; ++i)
|
||||
uint32 mapObjectCount = size / sizeof(ADT::MODF);
|
||||
for (uint32 i = 0; i < mapObjectCount; ++i)
|
||||
{
|
||||
uint32 id;
|
||||
ADT.read(&id, 4);
|
||||
WMOInstance inst(ADT, WmoInstanceNames[id].c_str(), map_num, tileX, tileY, originalMapId, dirfile, dirfileCache);
|
||||
ADT::MODF mapObjDef;
|
||||
_file.read(&mapObjDef, sizeof(ADT::MODF));
|
||||
if (!(mapObjDef.Flags & 0x8))
|
||||
{
|
||||
MapObject::Extract(mapObjDef, WmoInstanceNames[mapObjDef.Id].c_str(), map_num, tileX, tileY, originalMapId, dirfile, dirfileCache);
|
||||
Doodad::ExtractSet(WmoDoodads[WmoInstanceNames[mapObjDef.Id]], mapObjDef, map_num, tileX, tileY, originalMapId, dirfile, dirfileCache);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::string fileName = Trinity::StringFormat("FILE%08X.xxx", mapObjDef.Id);
|
||||
ExtractSingleWmo(fileName);
|
||||
MapObject::Extract(mapObjDef, fileName.c_str(), map_num, tileX, tileY, originalMapId, dirfile, dirfileCache);
|
||||
Doodad::ExtractSet(WmoDoodads[fileName], mapObjDef, map_num, tileX, tileY, originalMapId, dirfile, dirfileCache);
|
||||
}
|
||||
}
|
||||
|
||||
delete[] WmoInstanceNames;
|
||||
@@ -220,10 +239,10 @@ bool ADTFile::init(uint32 map_num, uint32 tileX, uint32 tileY, uint32 originalMa
|
||||
}
|
||||
|
||||
//======================
|
||||
ADT.seek(nextpos);
|
||||
_file.seek(nextpos);
|
||||
}
|
||||
|
||||
ADT.close();
|
||||
_file.close();
|
||||
fclose(dirfile);
|
||||
return true;
|
||||
}
|
||||
@@ -259,6 +278,6 @@ bool ADTFile::initFromCache(uint32 map_num, uint32 tileX, uint32 tileY, uint32 o
|
||||
|
||||
ADTFile::~ADTFile()
|
||||
{
|
||||
ADT.close();
|
||||
_file.close();
|
||||
delete dirfileCache;
|
||||
}
|
||||
Reference in new issue
Block a user