Tools: merged Master tools updates

This commit is contained in:
Ovahlord committed 2018-04-24 18:45:23 +02:00
1 parent 9ade5b77ff
commit fbcb423f60
27 files changed
+723 -571

No files matched your search

+49 -30
View File
@@ -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;
}