From 06f8899fae2b8498320403130a45f29df4e1dfcd Mon Sep 17 00:00:00 2001 From: click Date: Sun, 6 Jun 2010 23:06:06 +0200 Subject: Move vmapextractor down one notch to it's parent directory --HG-- branch : trunk rename : src/tools/vmap3_extractor/vmapextract/CMakeLists.txt => src/tools/vmap3_extractor/CMakeLists.txt rename : src/tools/vmap3_extractor/vmapextract/adtfile.cpp => src/tools/vmap3_extractor/adtfile.cpp rename : src/tools/vmap3_extractor/vmapextract/adtfile.h => src/tools/vmap3_extractor/adtfile.h rename : src/tools/vmap3_extractor/vmapextract/dbcfile.cpp => src/tools/vmap3_extractor/dbcfile.cpp rename : src/tools/vmap3_extractor/vmapextract/dbcfile.h => src/tools/vmap3_extractor/dbcfile.h rename : src/tools/vmap3_extractor/vmapextract/loadlib/loadlib.h => src/tools/vmap3_extractor/loadlib/loadlib.h rename : src/tools/vmap3_extractor/vmapextract/model.cpp => src/tools/vmap3_extractor/model.cpp rename : src/tools/vmap3_extractor/vmapextract/model.h => src/tools/vmap3_extractor/model.h rename : src/tools/vmap3_extractor/vmapextract/modelheaders.h => src/tools/vmap3_extractor/modelheaders.h rename : src/tools/vmap3_extractor/vmapextract/mpq_libmpq.cpp => src/tools/vmap3_extractor/mpq_libmpq.cpp rename : src/tools/vmap3_extractor/vmapextract/mpq_libmpq04.h => src/tools/vmap3_extractor/mpq_libmpq04.h rename : src/tools/vmap3_extractor/vmapextract/vec3d.h => src/tools/vmap3_extractor/vec3d.h rename : src/tools/vmap3_extractor/vmapextract/vmapexport.cpp => src/tools/vmap3_extractor/vmapexport.cpp rename : src/tools/vmap3_extractor/vmapextract/vmapexport.h => src/tools/vmap3_extractor/vmapexport.h rename : src/tools/vmap3_extractor/vmapextract/wdtfile.cpp => src/tools/vmap3_extractor/wdtfile.cpp rename : src/tools/vmap3_extractor/vmapextract/wdtfile.h => src/tools/vmap3_extractor/wdtfile.h rename : src/tools/vmap3_extractor/vmapextract/wmo.cpp => src/tools/vmap3_extractor/wmo.cpp rename : src/tools/vmap3_extractor/vmapextract/wmo.h => src/tools/vmap3_extractor/wmo.h --- src/tools/vmap3_extractor/CMakeLists.txt | 18 +- src/tools/vmap3_extractor/adtfile.cpp | 203 ++++++++ src/tools/vmap3_extractor/adtfile.h | 121 +++++ src/tools/vmap3_extractor/dbcfile.cpp | 77 +++ src/tools/vmap3_extractor/dbcfile.h | 141 ++++++ src/tools/vmap3_extractor/loadlib/loadlib.h | 59 +++ src/tools/vmap3_extractor/model.cpp | 187 ++++++++ src/tools/vmap3_extractor/model.h | 53 +++ src/tools/vmap3_extractor/modelheaders.h | 81 ++++ src/tools/vmap3_extractor/mpq_libmpq.cpp | 111 +++++ src/tools/vmap3_extractor/mpq_libmpq04.h | 91 ++++ src/tools/vmap3_extractor/vec3d.h | 230 +++++++++ src/tools/vmap3_extractor/vmapexport.cpp | 522 +++++++++++++++++++++ src/tools/vmap3_extractor/vmapexport.h | 11 + .../vmap3_extractor/vmapextract/CMakeLists.txt | 16 - src/tools/vmap3_extractor/vmapextract/adtfile.cpp | 203 -------- src/tools/vmap3_extractor/vmapextract/adtfile.h | 121 ----- src/tools/vmap3_extractor/vmapextract/dbcfile.cpp | 77 --- src/tools/vmap3_extractor/vmapextract/dbcfile.h | 141 ------ .../vmap3_extractor/vmapextract/loadlib/loadlib.h | 59 --- src/tools/vmap3_extractor/vmapextract/model.cpp | 187 -------- src/tools/vmap3_extractor/vmapextract/model.h | 53 --- .../vmap3_extractor/vmapextract/modelheaders.h | 81 ---- .../vmap3_extractor/vmapextract/mpq_libmpq.cpp | 111 ----- .../vmap3_extractor/vmapextract/mpq_libmpq04.h | 91 ---- src/tools/vmap3_extractor/vmapextract/vec3d.h | 230 --------- .../vmap3_extractor/vmapextract/vmapexport.cpp | 522 --------------------- src/tools/vmap3_extractor/vmapextract/vmapexport.h | 11 - src/tools/vmap3_extractor/vmapextract/wdtfile.cpp | 117 ----- src/tools/vmap3_extractor/vmapextract/wdtfile.h | 29 -- src/tools/vmap3_extractor/vmapextract/wmo.cpp | 506 -------------------- src/tools/vmap3_extractor/vmapextract/wmo.h | 118 ----- src/tools/vmap3_extractor/wdtfile.cpp | 117 +++++ src/tools/vmap3_extractor/wdtfile.h | 29 ++ src/tools/vmap3_extractor/wmo.cpp | 506 ++++++++++++++++++++ src/tools/vmap3_extractor/wmo.h | 118 +++++ 36 files changed, 2661 insertions(+), 2687 deletions(-) create mode 100644 src/tools/vmap3_extractor/adtfile.cpp create mode 100644 src/tools/vmap3_extractor/adtfile.h create mode 100644 src/tools/vmap3_extractor/dbcfile.cpp create mode 100644 src/tools/vmap3_extractor/dbcfile.h create mode 100644 src/tools/vmap3_extractor/loadlib/loadlib.h create mode 100644 src/tools/vmap3_extractor/model.cpp create mode 100644 src/tools/vmap3_extractor/model.h create mode 100644 src/tools/vmap3_extractor/modelheaders.h create mode 100644 src/tools/vmap3_extractor/mpq_libmpq.cpp create mode 100644 src/tools/vmap3_extractor/mpq_libmpq04.h create mode 100644 src/tools/vmap3_extractor/vec3d.h create mode 100644 src/tools/vmap3_extractor/vmapexport.cpp create mode 100644 src/tools/vmap3_extractor/vmapexport.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/CMakeLists.txt delete mode 100644 src/tools/vmap3_extractor/vmapextract/adtfile.cpp delete mode 100644 src/tools/vmap3_extractor/vmapextract/adtfile.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/dbcfile.cpp delete mode 100644 src/tools/vmap3_extractor/vmapextract/dbcfile.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/loadlib/loadlib.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/model.cpp delete mode 100644 src/tools/vmap3_extractor/vmapextract/model.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/modelheaders.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/mpq_libmpq.cpp delete mode 100644 src/tools/vmap3_extractor/vmapextract/mpq_libmpq04.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/vec3d.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/vmapexport.cpp delete mode 100644 src/tools/vmap3_extractor/vmapextract/vmapexport.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/wdtfile.cpp delete mode 100644 src/tools/vmap3_extractor/vmapextract/wdtfile.h delete mode 100644 src/tools/vmap3_extractor/vmapextract/wmo.cpp delete mode 100644 src/tools/vmap3_extractor/vmapextract/wmo.h create mode 100644 src/tools/vmap3_extractor/wdtfile.cpp create mode 100644 src/tools/vmap3_extractor/wdtfile.h create mode 100644 src/tools/vmap3_extractor/wmo.cpp create mode 100644 src/tools/vmap3_extractor/wmo.h (limited to 'src') diff --git a/src/tools/vmap3_extractor/CMakeLists.txt b/src/tools/vmap3_extractor/CMakeLists.txt index 20e4f7c64ce..51e867ec07e 100644 --- a/src/tools/vmap3_extractor/CMakeLists.txt +++ b/src/tools/vmap3_extractor/CMakeLists.txt @@ -9,18 +9,8 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. cmake_minimum_required (VERSION 2.6) -project (MANGOS_VMAP_EXTRACT_IO) +project (MANGOS_IOMAP_EXTRACTOR) - -# uncomment next line to disable debug mode -ADD_DEFINITIONS("-DIOMAP_DEBUG") -# build setup currently only supports libmpq 0.4.x -ADD_DEFINITIONS("-DUSE_LIBMPQ04") -ADD_DEFINITIONS("-Wall") -ADD_DEFINITIONS("-ggdb") -ADD_DEFINITIONS("-O3") - -include_directories(../libmpq) -#add_subdirectory(stormlib) - -add_subdirectory(vmapextract) +LINK_DIRECTORIES( ${LINK_DIRECTORIES} ../../libmpq/libmpq/.libs/ ) +add_executable(vmapextractor adtfile.cpp dbcfile.cpp model.cpp mpq_libmpq.cpp vmapexport.cpp wdtfile.cpp wmo.cpp) +target_link_libraries(vmapextractor mpq) diff --git a/src/tools/vmap3_extractor/adtfile.cpp b/src/tools/vmap3_extractor/adtfile.cpp new file mode 100644 index 00000000000..055408edca6 --- /dev/null +++ b/src/tools/vmap3_extractor/adtfile.cpp @@ -0,0 +1,203 @@ +#include "adtfile.h" + +#include +#include + +#ifdef WIN32 +#define snprintf _snprintf +#endif + +char * GetPlainName(char * FileName) +{ + char * szTemp; + + if((szTemp = strrchr(FileName, '\\')) != NULL) + FileName = szTemp + 1; + return FileName; +} + +void fixnamen(char *name, size_t len) +{ + for (size_t i=0; i0 && name[i]>='A' && name[i]<='Z' && isalpha(name[i-1])) + { + name[i] |= 0x20; + } else if ((i==0 || !isalpha(name[i-1])) && name[i]>='a' && name[i]<='z') + { + name[i] &= ~0x20; + } + } + //extension in lowercase + for(size_t i=len-3; i= 4 ? path.substr(path.size()-4,4) : ""; + std::transform( ext3.begin(), ext3.end(), ext3.begin(), ::tolower ); + if(ext3 == ".mdx") + { + // replace .mdx -> .m2 + path.erase(path.length()-2,2); + path.append("2"); + } + // >= 3.1.0 ADT MMDX section store filename.m2 filenames for corresponded .m2 file + // nothing do + + char szLocalFile[1024]; + snprintf(szLocalFile, 1024, "./Buildings/%s", s); + FILE * output = fopen(szLocalFile,"rb"); + if(!output) + { + Model m2(path); + if(m2.open()) + m2.ConvertToVMAPModel(szLocalFile); + } + else + fclose(output); + } + delete[] buf; + } + } + else if (!strcmp(fourcc,"MWMO")) + { + if (size) + { + char *buf = new char[size]; + ADT.read(buf, size); + char *p=buf; + int q = 0; + WmoInstansName = new string[size]; + while (p + +DBCFile::DBCFile(const std::string &filename) : filename(filename) +{ + data = NULL; +} + +bool DBCFile::open() +{ + MPQFile f(filename.c_str()); + + // Need some error checking, otherwise an unhandled exception error occurs + // if people screw with the data path. + if (f.isEof() == true) + return false; + + unsigned char header[4]; + unsigned int na,nb,es,ss; + + f.read(header,4); // File Header + + if (header[0]!='W' || header[1]!='D' || header[2]!='B' || header[3] != 'C') + { + f.close(); + data = NULL; + printf("Critical Error: An error occured while trying to read the DBCFile %s.", filename.c_str()); + return false; + } + + //assert(header[0]=='W' && header[1]=='D' && header[2]=='B' && header[3] == 'C'); + + f.read(&na,4); // Number of records + f.read(&nb,4); // Number of fields + f.read(&es,4); // Size of a record + f.read(&ss,4); // String size + + recordSize = es; + recordCount = na; + fieldCount = nb; + stringSize = ss; + //assert(fieldCount*4 == recordSize); + assert(fieldCount*4 >= recordSize); + + data = new unsigned char[recordSize*recordCount+stringSize]; + stringTable = data + recordSize*recordCount; + f.read(data,recordSize*recordCount+stringSize); + f.close(); + return true; +} + +DBCFile::~DBCFile() +{ + delete [] data; +} + +DBCFile::Record DBCFile::getRecord(size_t id) +{ + assert(data); + return Record(*this, data + id*recordSize); +} + +DBCFile::Iterator DBCFile::begin() +{ + assert(data); + return Iterator(*this, data); +} + +DBCFile::Iterator DBCFile::end() +{ + assert(data); + return Iterator(*this, stringTable); +} diff --git a/src/tools/vmap3_extractor/dbcfile.h b/src/tools/vmap3_extractor/dbcfile.h new file mode 100644 index 00000000000..7381ab9f668 --- /dev/null +++ b/src/tools/vmap3_extractor/dbcfile.h @@ -0,0 +1,141 @@ +#ifndef DBCFILE_H +#define DBCFILE_H +#define __STORMLIB_SELF__ + +#include +#include +//#include "StormLib.h" + +#undef min +#undef max +class DBCFile +{ +public: + DBCFile(const std::string &filename); + ~DBCFile(); + + // Open database. It must be openened before it can be used. + bool open(); + + // TODO: Add a close function? + + // Database exceptions + class Exception + { + public: + Exception(const std::string &message): message(message) + { } + virtual ~Exception() + { } + const std::string &getMessage() {return message;} + private: + std::string message; + }; + + // + class NotFound: public Exception + { + public: + NotFound(): Exception("Key was not found") + { } + }; + + // Iteration over database + class Iterator; + class Record + { + public: + Record& operator= (const Record& r) + { + file = r.file; + offset = r.offset; + return *this; + } + float getFloat(size_t field) const + { + assert(field < file.fieldCount); + return *reinterpret_cast(offset+field*4); + } + unsigned int getUInt(size_t field) const + { + assert(field < file.fieldCount); + return *reinterpret_cast(offset+(field*4)); + } + int getInt(size_t field) const + { + assert(field < file.fieldCount); + return *reinterpret_cast(offset+field*4); + } + unsigned char getByte(size_t ofs) const + { + assert(ofs < file.recordSize); + return *reinterpret_cast(offset+ofs); + } + const char *getString(size_t field) const + { + assert(field < file.fieldCount); + size_t stringOffset = getUInt(field); + assert(stringOffset < file.stringSize); + //char * tmp = (char*)file.stringTable + stringOffset; + //unsigned char * tmp2 = file.stringTable + stringOffset; + return reinterpret_cast(file.stringTable + stringOffset); + } + private: + Record(DBCFile &file, unsigned char *offset): file(file), offset(offset) {} + DBCFile &file; + unsigned char *offset; + + friend class DBCFile; + friend class Iterator; + }; + + /* Iterator that iterates over records */ + class Iterator + { + public: + Iterator(DBCFile &file, unsigned char *offset): + record(file, offset) {} + /// Advance (prefix only) + Iterator & operator++() { + record.offset += record.file.recordSize; + return *this; + } + /// Return address of current instance + Record const & operator*() const { return record; } + const Record* operator->() const { + return &record; + } + /// Comparison + bool operator==(const Iterator &b) const + { + return record.offset == b.record.offset; + } + bool operator!=(const Iterator &b) const + { + return record.offset != b.record.offset; + } + private: + Record record; + }; + + // Get record by id + Record getRecord(size_t id); + /// Get begin iterator over records + Iterator begin(); + /// Get begin iterator over records + Iterator end(); + /// Trivial + size_t getRecordCount() const { return recordCount;} + size_t getFieldCount() const { return fieldCount; } + +private: + std::string filename; + size_t recordSize; + size_t recordCount; + size_t fieldCount; + size_t stringSize; + unsigned char *data; + unsigned char *stringTable; +}; + +#endif diff --git a/src/tools/vmap3_extractor/loadlib/loadlib.h b/src/tools/vmap3_extractor/loadlib/loadlib.h new file mode 100644 index 00000000000..53731753425 --- /dev/null +++ b/src/tools/vmap3_extractor/loadlib/loadlib.h @@ -0,0 +1,59 @@ +#ifndef LOAD_LIB_H +#define LOAD_LIB_H + +#ifdef WIN32 +typedef __int64 int64; +typedef __int32 int32; +typedef __int16 int16; +typedef __int8 int8; +typedef unsigned __int64 uint64; +typedef unsigned __int32 uint32; +typedef unsigned __int16 uint16; +typedef unsigned __int8 uint8; +#else +#include +#ifndef uint64_t +#ifdef __linux__ +#include +#endif +#endif +typedef int64_t int64; +typedef int32_t int32; +typedef int16_t int16; +typedef int8_t int8; +typedef uint64_t uint64; +typedef uint32_t uint32; +typedef uint16_t uint16; +typedef uint8_t uint8; +#endif + +#define FILE_FORMAT_VERSION 18 + +// +// File version chunk +// +struct file_MVER +{ + union{ + uint32 fcc; + char fcc_txt[4]; + }; + uint32 size; + uint32 ver; +}; + +class FileLoader{ + uint8 *data; + uint32 data_size; +public: + virtual bool prepareLoadedData(); + uint8 *GetData() {return data;} + uint32 GetDataSize() {return data_size;} + + file_MVER *version; + FileLoader(); + ~FileLoader(); + bool loadFile(char *filename, bool log = true); + virtual void free(); +}; +#endif diff --git a/src/tools/vmap3_extractor/model.cpp b/src/tools/vmap3_extractor/model.cpp new file mode 100644 index 00000000000..b914ed96406 --- /dev/null +++ b/src/tools/vmap3_extractor/model.cpp @@ -0,0 +1,187 @@ +#include "vmapexport.h" +#include "model.h" +#include "wmo.h" +#include "mpq_libmpq04.h" +#include +#include +#include + +Model::Model(std::string &filename) : filename(filename) +{ +} + +bool Model::open() +{ + MPQFile f(filename.c_str()); + + ok = !f.isEof(); + + if (!ok) + { + f.close(); + printf("Error loading model %s\n", filename.c_str()); + return false; + } + + memcpy(&header, f.getBuffer(), sizeof(ModelHeader)); + if(header.nBoundingTriangles > 0) + { + f.seek(0); + f.seekRelative(header.ofsBoundingVertices); + vertices = new Vec3D[header.nBoundingVertices]; + f.read(vertices,header.nBoundingVertices*12); + for (uint32 i=0; i0) + { + fwrite(indices, sizeof(unsigned short), nIndexes, output); + } + fwrite("VERT",4, 1, output); + wsize = sizeof(int) + sizeof(float) * 3 * nVertices; + fwrite(&wsize, sizeof(int), 1, output); + fwrite(&nVertices, sizeof(int), 1, output); + if(nVertices >0) + { + for(uint32 vpos=0; vpos + +class Model; +class WMOInstance; +class MPQFile; + +Vec3D fixCoordSystem(Vec3D v); + +class Model +{ +public: + ModelHeader header; + uint32 offsBB_vertices, offsBB_indices; + Vec3D *BB_vertices, *vertices; + uint16 *BB_indices, *indices; + size_t nIndices; + + bool open(); + bool ConvertToVMAPModel(char * outfilename); + + bool ok; + + Model(std::string &filename); + ~Model(); + +private: + std::string filename; + char outfilename; +}; + +class ModelInstance +{ +public: + Model *model; + + uint32 id; + Vec3D pos, rot; + unsigned int d1, scale; + float w,sc; + + ModelInstance() {} + ModelInstance(MPQFile &f,const char* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile); + +}; + +#endif diff --git a/src/tools/vmap3_extractor/modelheaders.h b/src/tools/vmap3_extractor/modelheaders.h new file mode 100644 index 00000000000..776a981ebd8 --- /dev/null +++ b/src/tools/vmap3_extractor/modelheaders.h @@ -0,0 +1,81 @@ +#ifndef MODELHEADERS_H +#define MODELHEADERS_H + +/* typedef unsigned char uint8; +typedef char int8; +typedef unsigned short uint16; +typedef short int16; +typedef unsigned int uint32; +typedef int int32; */ + +#pragma pack(push,1) + +struct ModelHeader +{ + char id[4]; + uint8 version[4]; + uint32 nameLength; + uint32 nameOfs; + uint32 type; + uint32 nGlobalSequences; + uint32 ofsGlobalSequences; + uint32 nAnimations; + uint32 ofsAnimations; + uint32 nAnimationLookup; + uint32 ofsAnimationLookup; + uint32 nBones; + uint32 ofsBones; + uint32 nKeyBoneLookup; + uint32 ofsKeyBoneLookup; + uint32 nVertices; + uint32 ofsVertices; + uint32 nViews; + uint32 nColors; + uint32 ofsColors; + uint32 nTextures; + uint32 ofsTextures; + uint32 nTransparency; + uint32 ofsTransparency; + uint32 nTextureanimations; + uint32 ofsTextureanimations; + uint32 nTexReplace; + uint32 ofsTexReplace; + uint32 nRenderFlags; + uint32 ofsRenderFlags; + uint32 nBoneLookupTable; + uint32 ofsBoneLookupTable; + uint32 nTexLookup; + uint32 ofsTexLookup; + uint32 nTexUnits; + uint32 ofsTexUnits; + uint32 nTransLookup; + uint32 ofsTransLookup; + uint32 nTexAnimLookup; + uint32 ofsTexAnimLookup; + float floats[14]; + uint32 nBoundingTriangles; + uint32 ofsBoundingTriangles; + uint32 nBoundingVertices; + uint32 ofsBoundingVertices; + uint32 nBoundingNormals; + uint32 ofsBoundingNormals; + uint32 nAttachments; + uint32 ofsAttachments; + uint32 nAttachLookup; + uint32 ofsAttachLookup; + uint32 nAttachments_2; + uint32 ofsAttachments_2; + uint32 nLights; + uint32 ofsLights; + uint32 nCameras; + uint32 ofsCameras; + uint32 nCameraLookup; + uint32 ofsCameraLookup; + uint32 nRibbonEmitters; + uint32 ofsRibbonEmitters; + uint32 nParticleEmitters; + uint32 ofsParticleEmitters; +}; + +#pragma pack(pop) +#endif diff --git a/src/tools/vmap3_extractor/mpq_libmpq.cpp b/src/tools/vmap3_extractor/mpq_libmpq.cpp new file mode 100644 index 00000000000..4aa59417f81 --- /dev/null +++ b/src/tools/vmap3_extractor/mpq_libmpq.cpp @@ -0,0 +1,111 @@ +#include "mpq_libmpq04.h" +#include +#include + +ArchiveSet gOpenArchives; + +MPQArchive::MPQArchive(const char* filename) +{ + int result = libmpq__archive_open(&mpq_a, filename, -1); + printf("Opening %s\n", filename); + if(result) { + switch(result) { + case LIBMPQ_ERROR_OPEN : + printf("Error opening archive '%s': Does file really exist?\n", filename); + break; + case LIBMPQ_ERROR_FORMAT : /* bad file format */ + printf("Error opening archive '%s': Bad file format\n", filename); + break; + case LIBMPQ_ERROR_SEEK : /* seeking in file failed */ + printf("Error opening archive '%s': Seeking in file failed\n", filename); + break; + case LIBMPQ_ERROR_READ : /* Read error in archive */ + printf("Error opening archive '%s': Read error in archive\n", filename); + break; + case LIBMPQ_ERROR_MALLOC : /* maybe not enough memory? :) */ + printf("Error opening archive '%s': Maybe not enough memory\n", filename); + break; + default: + printf("Error opening archive '%s': Unknown error\n", filename); + break; + } + return; + } + gOpenArchives.push_front(this); +} + +void MPQArchive::close() +{ + //gOpenArchives.erase(erase(&mpq_a); + libmpq__archive_close(mpq_a); +} + +MPQFile::MPQFile(const char* filename): + eof(false), + buffer(0), + pointer(0), + size(0) +{ + for(ArchiveSet::iterator i=gOpenArchives.begin(); i!=gOpenArchives.end();++i) + { + mpq_archive *mpq_a = (*i)->mpq_a; + + uint32 filenum; + if(libmpq__file_number(mpq_a, filename, &filenum)) continue; + libmpq__off_t transferred; + libmpq__file_unpacked_size(mpq_a, filenum, &size); + + // HACK: in patch.mpq some files don't want to open and give 1 for filesize + if (size<=1) { + printf("warning: file %s has size %d; cannot read.\n", filename, size); + eof = true; + buffer = 0; + return; + } + buffer = new char[size]; + + //libmpq_file_getdata + libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred); + /*libmpq_file_getdata(&mpq_a, hash, fileno, (unsigned char*)buffer);*/ + return; + + } + eof = true; + buffer = 0; +} + +size_t MPQFile::read(void* dest, size_t bytes) +{ + if (eof) return 0; + + size_t rpos = pointer + bytes; + if (rpos > size) { + bytes = size - pointer; + eof = true; + } + + memcpy(dest, &(buffer[pointer]), bytes); + + pointer = rpos; + + return bytes; +} + +void MPQFile::seek(int offset) +{ + pointer = offset; + eof = (pointer >= size); +} + +void MPQFile::seekRelative(int offset) +{ + pointer += offset; + eof = (pointer >= size); +} + +void MPQFile::close() +{ + if (buffer) delete[] buffer; + buffer = 0; + eof = true; +} diff --git a/src/tools/vmap3_extractor/mpq_libmpq04.h b/src/tools/vmap3_extractor/mpq_libmpq04.h new file mode 100644 index 00000000000..ccbfe37cba7 --- /dev/null +++ b/src/tools/vmap3_extractor/mpq_libmpq04.h @@ -0,0 +1,91 @@ +#define _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_WARNINGS + +#ifndef MPQ_H +#define MPQ_H + +#include "loadlib/loadlib.h" +#include "libmpq/mpq.h" +#include +#include +#include +#include +#include + +using namespace std; + +class MPQArchive +{ + +public: + mpq_archive_s *mpq_a; + + MPQArchive(const char* filename); + void close(); + + void GetFileListTo(vector& filelist) { + uint32 filenum; + if(libmpq__file_number(mpq_a, "(listfile)", &filenum)) return; + libmpq__off_t size, transferred; + libmpq__file_unpacked_size(mpq_a, filenum, &size); + + char *buffer = new char[size]; + + libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred); + + char seps[] = "\n"; + char *token; + + token = strtok( buffer, seps ); + uint32 counter = 0; + while ((token != NULL) && (counter < size)) { + //cout << token << endl; + token[strlen(token) - 1] = 0; + string s = token; + filelist.push_back(s); + counter += strlen(token) + 2; + token = strtok(NULL, seps); + } + + delete[] buffer; + } +}; +typedef std::deque ArchiveSet; + +class MPQFile +{ + //MPQHANDLE handle; + bool eof; + char *buffer; + libmpq__off_t pointer,size; + + // disable copying + MPQFile(const MPQFile &f) {} + void operator=(const MPQFile &f) {} + +public: + MPQFile(const char* filename); // filenames are not case sensitive + ~MPQFile() { close(); } + size_t read(void* dest, size_t bytes); + size_t getSize() { return size; } + size_t getPos() { return pointer; } + char* getBuffer() { return buffer; } + char* getPointer() { return buffer + pointer; } + bool isEof() { return eof; } + void seek(int offset); + void seekRelative(int offset); + void close(); +}; + +inline void flipcc(char *fcc) +{ + char t; + t=fcc[0]; + fcc[0]=fcc[3]; + fcc[3]=t; + t=fcc[1]; + fcc[1]=fcc[2]; + fcc[2]=t; +} + +#endif diff --git a/src/tools/vmap3_extractor/vec3d.h b/src/tools/vmap3_extractor/vec3d.h new file mode 100644 index 00000000000..d2569bc133b --- /dev/null +++ b/src/tools/vmap3_extractor/vec3d.h @@ -0,0 +1,230 @@ +#ifndef VEC3D_H +#define VEC3D_H + +#include +#include + +class Vec3D +{ +public: + float x,y,z; + + Vec3D(float x0 = 0.0f, float y0 = 0.0f, float z0 = 0.0f) : x(x0), y(y0), z(z0) {} + + Vec3D(const Vec3D& v) : x(v.x), y(v.y), z(v.z) {} + + Vec3D& operator= (const Vec3D &v) { + x = v.x; + y = v.y; + z = v.z; + return *this; + } + + Vec3D operator+ (const Vec3D &v) const + { + Vec3D r(x+v.x,y+v.y,z+v.z); + return r; + } + + Vec3D operator- (const Vec3D &v) const + { + Vec3D r(x-v.x,y-v.y,z-v.z); + return r; + } + + float operator* (const Vec3D &v) const + { + return x*v.x + y*v.y + z*v.z; + } + + Vec3D operator* (float d) const + { + Vec3D r(x*d,y*d,z*d); + return r; + } + + friend Vec3D operator* (float d, const Vec3D& v) + { + return v * d; + } + + Vec3D operator% (const Vec3D &v) const + { + Vec3D r(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x); + return r; + } + + Vec3D& operator+= (const Vec3D &v) + { + x += v.x; + y += v.y; + z += v.z; + return *this; + } + + Vec3D& operator-= (const Vec3D &v) + { + x -= v.x; + y -= v.y; + z -= v.z; + return *this; + } + + Vec3D& operator*= (float d) + { + x *= d; + y *= d; + z *= d; + return *this; + } + + float lengthSquared() const + { + return x*x+y*y+z*z; + } + + float length() const + { + return sqrt(x*x+y*y+z*z); + } + + Vec3D& normalize() + { + this->operator*= (1.0f/length()); + return *this; + } + + Vec3D operator~ () const + { + Vec3D r(*this); + r.normalize(); + return r; + } + + friend std::istream& operator>>(std::istream& in, Vec3D& v) + { + in >> v.x >> v.y >> v.z; + return in; + } + + friend std::ostream& operator<<(std::ostream& out, const Vec3D& v) + { + out << v.x << " " << v.y << " " << v.z; + return out; + } + + operator float*() + { + return (float*)this; + } +}; + + +class Vec2D +{ +public: + float x,y; + + Vec2D(float x0 = 0.0f, float y0 = 0.0f) : x(x0), y(y0) {} + + Vec2D(const Vec2D& v) : x(v.x), y(v.y) {} + + Vec2D& operator= (const Vec2D &v) { + x = v.x; + y = v.y; + return *this; + } + + Vec2D operator+ (const Vec2D &v) const + { + Vec2D r(x+v.x,y+v.y); + return r; + } + + Vec2D operator- (const Vec2D &v) const + { + Vec2D r(x-v.x,y-v.y); + return r; + } + + float operator* (const Vec2D &v) const + { + return x*v.x + y*v.y; + } + + Vec2D operator* (float d) const + { + Vec2D r(x*d,y*d); + return r; + } + + friend Vec2D operator* (float d, const Vec2D& v) + { + return v * d; + } + + Vec2D& operator+= (const Vec2D &v) + { + x += v.x; + y += v.y; + return *this; + } + + Vec2D& operator-= (const Vec2D &v) + { + x -= v.x; + y -= v.y; + return *this; + } + + Vec2D& operator*= (float d) + { + x *= d; + y *= d; + return *this; + } + + float lengthSquared() const + { + return x*x+y*y; + } + + float length() const + { + return sqrt(x*x+y*y); + } + + Vec2D& normalize() + { + this->operator*= (1.0f/length()); + return *this; + } + + Vec2D operator~ () const + { + Vec2D r(*this); + r.normalize(); + return r; + } + + + friend std::istream& operator>>(std::istream& in, Vec2D& v) + { + in >> v.x >> v.y; + return in; + } + + operator float*() + { + return (float*)this; + } +}; + +inline void rotate(float x0, float y0, float *x, float *y, float angle) +{ + float xa = *x - x0, ya = *y - y0; + *x = xa*cosf(angle) - ya*sinf(angle) + x0; + *y = xa*sinf(angle) + ya*cosf(angle) + y0; +} + +#endif diff --git a/src/tools/vmap3_extractor/vmapexport.cpp b/src/tools/vmap3_extractor/vmapexport.cpp new file mode 100644 index 00000000000..07d5d31d418 --- /dev/null +++ b/src/tools/vmap3_extractor/vmapexport.cpp @@ -0,0 +1,522 @@ +/*****************************************************************************/ +/* StormLibTest.cpp Copyright (c) Ladislav Zezula 2003 */ +/*---------------------------------------------------------------------------*/ +/* This module uses very brutal test methods for StormLib. It extracts all */ +/* files from the archive with Storm.dll and with stormlib and compares them,*/ +/* then tries to build a copy of the entire archive, then removes a few files*/ +/* from the archive and adds them back, then compares the two archives, ... */ +/*---------------------------------------------------------------------------*/ +/* Date Ver Who Comment */ +/* -------- ---- --- ------- */ +/* 25.03.03 1.00 Lad The first version of StormLibTest.cpp */ +/*****************************************************************************/ + +#define _CRT_SECURE_NO_DEPRECATE +#include +#include +#include +#include +#include + +#ifdef WIN32 + #include + #include + #include + #define mkdir _mkdir +#else + #include +#endif + +#undef min +#undef max + +//#pragma warning(disable : 4505) +//#pragma comment(lib, "Winmm.lib") + +#include + +//From Extractor +#include "adtfile.h" +#include "wdtfile.h" +#include "dbcfile.h" +#include "wmo.h" +#include "mpq_libmpq04.h" + +//------------------------------------------------------------------------------ +// Defines + +#define MPQ_BLOCK_SIZE 0x1000 + +//----------------------------------------------------------------------------- + +extern ArchiveSet gOpenArchives; + +typedef struct +{ + char name[64]; + unsigned int id; +}map_id; + +map_id * map_ids; +uint16 *LiqType = 0; +uint32 map_count; +char output_path[128]="."; +char input_path[1024]="."; +bool hasInputPathParam = false; +bool preciseVectorData = false; + +// Constants + +//static const char * szWorkDirMaps = ".\\Maps"; +static const char * szWorkDirWmo = "./Buildings"; + +// Local testing functions + +static void clreol() +{ + printf("\r \r"); +} + +void strToLower(char* str) +{ + while(*str) + { + *str=tolower(*str); + ++str; + } +} + +static const char * GetPlainName(const char * szFileName) +{ + const char * szTemp; + + if((szTemp = strrchr(szFileName, '\\')) != NULL) + szFileName = szTemp + 1; + return szFileName; +} + +// copied from contrib/extractor/System.cpp +void ReadLiquidTypeTableDBC() +{ + printf("Read LiquidType.dbc file..."); + DBCFile dbc("DBFilesClient\\LiquidType.dbc"); + if(!dbc.open()) + { + printf("Fatal error: Invalid LiquidType.dbc file format!\n"); + exit(1); + } + + size_t LiqType_count = dbc.getRecordCount(); + size_t LiqType_maxid = dbc.getRecord(LiqType_count - 1).getUInt(0); + LiqType = new uint16[LiqType_maxid + 1]; + memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16)); + + for(uint32 x = 0; x < LiqType_count; ++x) + LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3); + + printf("Done! (%u LiqTypes loaded)\n", LiqType_count); +} + +int ExtractWmo() +{ + char szLocalFile[1024] = ""; + bool success=true; + + //const char* ParsArchiveNames[] = {"patch-2.MPQ", "patch.MPQ", "common.MPQ", "expansion.MPQ"}; + + for (ArchiveSet::const_iterator ar_itr = gOpenArchives.begin(); ar_itr != gOpenArchives.end() && success; ++ar_itr) + { + vector filelist; + + (*ar_itr)->GetFileListTo(filelist); + for (vector::iterator fname=filelist.begin(); fname != filelist.end() && success; ++fname) + { + bool file_ok=true; + if (fname->find(".wmo") != string::npos) + { + // Copy files from archive + //std::cout << "found *.wmo file " << *fname << std::endl; + sprintf(szLocalFile, "%s/%s", szWorkDirWmo, GetPlainName(fname->c_str())); + fixnamen(szLocalFile,strlen(szLocalFile)); + FILE * n; + if ((n = fopen(szLocalFile, "rb"))== NULL) + { + int p = 0; + //Select root wmo files + const char * rchr = strrchr(GetPlainName(fname->c_str()),0x5f); + if(rchr != NULL) + { + char cpy[4]; + strncpy((char*)cpy,rchr,4); + for (int i=0;i<4; ++i) + { + int m = cpy[i]; + if(isdigit(m)) + p++; + } + } + if(p != 3) + { + std::cout << "Extracting " << *fname << std::endl; + WMORoot * froot = new WMORoot(*fname); + if(!froot->open()) + { + printf("Couldn't open RootWmo!!!\n"); + delete froot; + continue; + } + FILE *output=fopen(szLocalFile,"wb"); + if(!output) + { + printf("couldn't open %s for writing!\n", szLocalFile); + success=false; + } + froot->ConvertToVMAPRootWmo(output); + int Wmo_nVertices = 0; + //printf("root has %d groups\n", froot->nGroups); + if(froot->nGroups !=0) + { + for (uint32 i=0; inGroups; ++i) + { + char temp[1024]; + strcpy(temp, fname->c_str()); + temp[fname->length()-4] = 0; + char groupFileName[1024]; + sprintf(groupFileName,"%s_%03d.wmo",temp, i); + //printf("Trying to open groupfile %s\n",groupFileName); + string s = groupFileName; + WMOGroup * fgroup = new WMOGroup(s); + if(!fgroup->open()) + { + printf("Could not open all Group file for: %s\n",GetPlainName(fname->c_str())); + file_ok=false; + break; + } + + Wmo_nVertices += fgroup->ConvertToVMAPGroupWmo(output, froot, preciseVectorData); + delete fgroup; + } + } + fseek(output, 8, SEEK_SET); // store the correct no of vertices + fwrite(&Wmo_nVertices,sizeof(int),1,output); + fclose(output); + delete froot; + } + } + else + { + fclose(n); + } + } + // Delete the extracted file in the case of an error + if(!file_ok) + remove(szLocalFile); + } + } + + if(success) + printf("\nExtract wmo complete (No (fatal) errors)\n"); + + return success; +} + +void ExtractMapsFromMpq() +{ +} + +void ParsMapFiles() +{ + char fn[512]; + //char id_filename[64]; + char id[10]; + for (unsigned int i=0; iinit(map_ids[i].id, x, y); + delete ADT; + } + } + } + } + } +} + +void getGamePath() +{ +#ifdef _WIN32 + HKEY key; + DWORD t,s; + LONG l; + s = sizeof(input_path); + memset(input_path,0,s); + l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\World of Warcraft",0,KEY_QUERY_VALUE,&key); + //l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\Burning Crusade Closed Beta",0,KEY_QUERY_VALUE,&key); + l = RegQueryValueEx(key,"InstallPath",0,&t,(LPBYTE)input_path,&s); + RegCloseKey(key); + if (strlen(input_path) > 0) + { + if (input_path[strlen(input_path) - 1] != '\\') strcat(input_path, "\\"); + } + strcat(input_path,"Data\\"); +#else + strcpy(input_path,"Data/"); +#endif +} + +bool scan_patches(char* scanmatch, std::vector& pArchiveNames) +{ + int i; + char path[512]; + + for (i = 1; i <= 99; i++) + { + if (i != 1) + { + sprintf(path, "%s-%d.MPQ", scanmatch, i); + } + else + { + sprintf(path, "%s.MPQ", scanmatch); + } +#ifdef __linux__ + if(FILE* h = fopen64(path, "rb")) +#else + if(FILE* h = fopen(path, "rb")) +#endif + { + fclose(h); + //matches.push_back(path); + pArchiveNames.push_back(path); + } + } + + return(true); +} + +bool fillArchiveNameVector(std::vector& pArchiveNames) +{ + if(!hasInputPathParam) + getGamePath(); + + printf("\nGame path: %s\n", input_path); + + char path[512]; + string in_path(input_path); + std::vector locales, searchLocales; + + searchLocales.push_back("enGB"); + searchLocales.push_back("enUS"); + searchLocales.push_back("deDE"); + searchLocales.push_back("esES"); + searchLocales.push_back("frFR"); + searchLocales.push_back("koKR"); + searchLocales.push_back("ruRU"); + + for (std::vector::iterator i = searchLocales.begin(); i != searchLocales.end(); ++i) + { + std::string localePath = in_path + *i; + // check if locale exists: + struct stat status; + if (stat(localePath.c_str(), &status)) + continue; + if ((status.st_mode & S_IFDIR) == 0) + continue; + printf("Found locale '%s'\n", i->c_str()); + locales.push_back(*i); + } + printf("\n"); + + // open locale expansion and common files + printf("Adding data files from locale directories.\n"); + for (std::vector::iterator i = locales.begin(); i != locales.end(); ++i) + { + pArchiveNames.push_back(in_path + *i + "/locale-" + *i + ".MPQ"); + pArchiveNames.push_back(in_path + *i + "/expansion-locale-" + *i + ".MPQ"); + pArchiveNames.push_back(in_path + *i + "/lichking-locale-" + *i + ".MPQ"); + } + + // open expansion and common files + pArchiveNames.push_back(input_path + string("common.MPQ")); + pArchiveNames.push_back(input_path + string("common-2.MPQ")); + pArchiveNames.push_back(input_path + string("expansion.MPQ")); + pArchiveNames.push_back(input_path + string("lichking.MPQ")); + + // now, scan for the patch levels in the core dir + printf("Scanning patch levels from data directory.\n"); + sprintf(path, "%spatch", input_path); + if (!scan_patches(path, pArchiveNames)) + return(false); + + // now, scan for the patch levels in locale dirs + printf("Scanning patch levels from locale directories.\n"); + bool foundOne = false; + for (std::vector::iterator i = locales.begin(); i != locales.end(); ++i) + { + printf("Locale: %s\n", i->c_str()); + sprintf(path, "%s%s/patch-%s", input_path, i->c_str(), i->c_str()); + if(scan_patches(path, pArchiveNames)) + foundOne = true; + } + + printf("\n"); + + if(!foundOne) + { + printf("no locale found\n"); + return false; + } + + return true; +} + +bool processArgv(int argc, char ** argv, const char *versionString) +{ + bool result = true; + hasInputPathParam = false; + bool preciseVectorData = false; + + for(int i=1; i< argc; ++i) + { + if(strcmp("-s",argv[i]) == 0) + { + preciseVectorData = false; + } + else if(strcmp("-d",argv[i]) == 0) + { + if((i+1)]\n", argv[0]); + printf(" -s : (default) small size (data size optimization), ~500MB less vmap data.\n"); + printf(" -l : large size, ~500MB more vmap data. (might contain more details)\n"); + printf(" -d : Path to the vector data source folder.\n"); + printf(" -? : This message.\n"); + } + return result; +} + +//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx +// Main +// +// The program must be run with two command line arguments +// +// Arg1 - The source MPQ name (for testing reading and file find) +// Arg2 - Listfile name +// + +int main(int argc, char ** argv) +{ + bool success=true; + const char *versionString = "V2.90 2010_05"; + + // Use command line arguments, when some + if(!processArgv(argc, argv, versionString)) + return 1; + + printf("Extract %s. Beginning work ....\n",versionString); + //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + // Create the working directory + if(mkdir(szWorkDirWmo +#ifdef __linux__ + , 0711 +#endif + )) + success = (errno == EEXIST); + + // prepare archive name list + std::vector archiveNames; + fillArchiveNameVector(archiveNames); + for (size_t i=0; i < archiveNames.size(); ++i) + { + MPQArchive *archive = new MPQArchive(archiveNames[i].c_str()); + if(!gOpenArchives.size() || gOpenArchives.front() != archive) + delete archive; + } + + if(gOpenArchives.empty()) + { + printf("FATAL ERROR: None MPQ archive found by path '%s'. Use -d option with proper path.\n",input_path); + return 1; + } + ReadLiquidTypeTableDBC(); + + // extract data + if(success) + success = ExtractWmo(); + + //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx + //map.dbc + if(success) + { + DBCFile * dbc = new DBCFile("DBFilesClient\\Map.dbc"); + if(!dbc->open()) + { + delete dbc; + printf("FATAL ERROR: Map.dbc not found in data file.\n"); + return 1; + } + map_count=dbc->getRecordCount (); + map_ids=new map_id[map_count]; + for(unsigned int x=0;xgetRecord (x).getUInt(0); + strcpy(map_ids[x].name,dbc->getRecord(x).getString(1)); + printf("Map - %s\n",map_ids[x].name); + } + + + delete dbc; + ParsMapFiles(); + delete [] map_ids; + //nError = ERROR_SUCCESS; + } + + clreol(); + if(!success) + { + printf("ERROR: Extract %s. Work NOT complete.\n Precise vector data=%d.\nPress any key.\n",versionString, preciseVectorData); + getchar(); + } + + printf("Extract %s. Work complete. No errors.\n",versionString); + delete [] LiqType; + return 0; +} diff --git a/src/tools/vmap3_extractor/vmapexport.h b/src/tools/vmap3_extractor/vmapexport.h new file mode 100644 index 00000000000..625bc930882 --- /dev/null +++ b/src/tools/vmap3_extractor/vmapexport.h @@ -0,0 +1,11 @@ +#ifndef VMAPEXPORT_H +#define VMAPEXPORT_H + +enum ModelFlags +{ + MOD_M2 = 1, + MOD_WORLDSPAWN = 1<<1, + MOD_HAS_BOUND = 1<<2 +}; + +#endif diff --git a/src/tools/vmap3_extractor/vmapextract/CMakeLists.txt b/src/tools/vmap3_extractor/vmapextract/CMakeLists.txt deleted file mode 100644 index 51e867ec07e..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (C) 2005-2009 MaNGOS project -# -# This file is free software; as a special exception the author gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -cmake_minimum_required (VERSION 2.6) -project (MANGOS_IOMAP_EXTRACTOR) - -LINK_DIRECTORIES( ${LINK_DIRECTORIES} ../../libmpq/libmpq/.libs/ ) -add_executable(vmapextractor adtfile.cpp dbcfile.cpp model.cpp mpq_libmpq.cpp vmapexport.cpp wdtfile.cpp wmo.cpp) -target_link_libraries(vmapextractor mpq) diff --git a/src/tools/vmap3_extractor/vmapextract/adtfile.cpp b/src/tools/vmap3_extractor/vmapextract/adtfile.cpp deleted file mode 100644 index 055408edca6..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/adtfile.cpp +++ /dev/null @@ -1,203 +0,0 @@ -#include "adtfile.h" - -#include -#include - -#ifdef WIN32 -#define snprintf _snprintf -#endif - -char * GetPlainName(char * FileName) -{ - char * szTemp; - - if((szTemp = strrchr(FileName, '\\')) != NULL) - FileName = szTemp + 1; - return FileName; -} - -void fixnamen(char *name, size_t len) -{ - for (size_t i=0; i0 && name[i]>='A' && name[i]<='Z' && isalpha(name[i-1])) - { - name[i] |= 0x20; - } else if ((i==0 || !isalpha(name[i-1])) && name[i]>='a' && name[i]<='z') - { - name[i] &= ~0x20; - } - } - //extension in lowercase - for(size_t i=len-3; i= 4 ? path.substr(path.size()-4,4) : ""; - std::transform( ext3.begin(), ext3.end(), ext3.begin(), ::tolower ); - if(ext3 == ".mdx") - { - // replace .mdx -> .m2 - path.erase(path.length()-2,2); - path.append("2"); - } - // >= 3.1.0 ADT MMDX section store filename.m2 filenames for corresponded .m2 file - // nothing do - - char szLocalFile[1024]; - snprintf(szLocalFile, 1024, "./Buildings/%s", s); - FILE * output = fopen(szLocalFile,"rb"); - if(!output) - { - Model m2(path); - if(m2.open()) - m2.ConvertToVMAPModel(szLocalFile); - } - else - fclose(output); - } - delete[] buf; - } - } - else if (!strcmp(fourcc,"MWMO")) - { - if (size) - { - char *buf = new char[size]; - ADT.read(buf, size); - char *p=buf; - int q = 0; - WmoInstansName = new string[size]; - while (p - -DBCFile::DBCFile(const std::string &filename) : filename(filename) -{ - data = NULL; -} - -bool DBCFile::open() -{ - MPQFile f(filename.c_str()); - - // Need some error checking, otherwise an unhandled exception error occurs - // if people screw with the data path. - if (f.isEof() == true) - return false; - - unsigned char header[4]; - unsigned int na,nb,es,ss; - - f.read(header,4); // File Header - - if (header[0]!='W' || header[1]!='D' || header[2]!='B' || header[3] != 'C') - { - f.close(); - data = NULL; - printf("Critical Error: An error occured while trying to read the DBCFile %s.", filename.c_str()); - return false; - } - - //assert(header[0]=='W' && header[1]=='D' && header[2]=='B' && header[3] == 'C'); - - f.read(&na,4); // Number of records - f.read(&nb,4); // Number of fields - f.read(&es,4); // Size of a record - f.read(&ss,4); // String size - - recordSize = es; - recordCount = na; - fieldCount = nb; - stringSize = ss; - //assert(fieldCount*4 == recordSize); - assert(fieldCount*4 >= recordSize); - - data = new unsigned char[recordSize*recordCount+stringSize]; - stringTable = data + recordSize*recordCount; - f.read(data,recordSize*recordCount+stringSize); - f.close(); - return true; -} - -DBCFile::~DBCFile() -{ - delete [] data; -} - -DBCFile::Record DBCFile::getRecord(size_t id) -{ - assert(data); - return Record(*this, data + id*recordSize); -} - -DBCFile::Iterator DBCFile::begin() -{ - assert(data); - return Iterator(*this, data); -} - -DBCFile::Iterator DBCFile::end() -{ - assert(data); - return Iterator(*this, stringTable); -} diff --git a/src/tools/vmap3_extractor/vmapextract/dbcfile.h b/src/tools/vmap3_extractor/vmapextract/dbcfile.h deleted file mode 100644 index 7381ab9f668..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/dbcfile.h +++ /dev/null @@ -1,141 +0,0 @@ -#ifndef DBCFILE_H -#define DBCFILE_H -#define __STORMLIB_SELF__ - -#include -#include -//#include "StormLib.h" - -#undef min -#undef max -class DBCFile -{ -public: - DBCFile(const std::string &filename); - ~DBCFile(); - - // Open database. It must be openened before it can be used. - bool open(); - - // TODO: Add a close function? - - // Database exceptions - class Exception - { - public: - Exception(const std::string &message): message(message) - { } - virtual ~Exception() - { } - const std::string &getMessage() {return message;} - private: - std::string message; - }; - - // - class NotFound: public Exception - { - public: - NotFound(): Exception("Key was not found") - { } - }; - - // Iteration over database - class Iterator; - class Record - { - public: - Record& operator= (const Record& r) - { - file = r.file; - offset = r.offset; - return *this; - } - float getFloat(size_t field) const - { - assert(field < file.fieldCount); - return *reinterpret_cast(offset+field*4); - } - unsigned int getUInt(size_t field) const - { - assert(field < file.fieldCount); - return *reinterpret_cast(offset+(field*4)); - } - int getInt(size_t field) const - { - assert(field < file.fieldCount); - return *reinterpret_cast(offset+field*4); - } - unsigned char getByte(size_t ofs) const - { - assert(ofs < file.recordSize); - return *reinterpret_cast(offset+ofs); - } - const char *getString(size_t field) const - { - assert(field < file.fieldCount); - size_t stringOffset = getUInt(field); - assert(stringOffset < file.stringSize); - //char * tmp = (char*)file.stringTable + stringOffset; - //unsigned char * tmp2 = file.stringTable + stringOffset; - return reinterpret_cast(file.stringTable + stringOffset); - } - private: - Record(DBCFile &file, unsigned char *offset): file(file), offset(offset) {} - DBCFile &file; - unsigned char *offset; - - friend class DBCFile; - friend class Iterator; - }; - - /* Iterator that iterates over records */ - class Iterator - { - public: - Iterator(DBCFile &file, unsigned char *offset): - record(file, offset) {} - /// Advance (prefix only) - Iterator & operator++() { - record.offset += record.file.recordSize; - return *this; - } - /// Return address of current instance - Record const & operator*() const { return record; } - const Record* operator->() const { - return &record; - } - /// Comparison - bool operator==(const Iterator &b) const - { - return record.offset == b.record.offset; - } - bool operator!=(const Iterator &b) const - { - return record.offset != b.record.offset; - } - private: - Record record; - }; - - // Get record by id - Record getRecord(size_t id); - /// Get begin iterator over records - Iterator begin(); - /// Get begin iterator over records - Iterator end(); - /// Trivial - size_t getRecordCount() const { return recordCount;} - size_t getFieldCount() const { return fieldCount; } - -private: - std::string filename; - size_t recordSize; - size_t recordCount; - size_t fieldCount; - size_t stringSize; - unsigned char *data; - unsigned char *stringTable; -}; - -#endif diff --git a/src/tools/vmap3_extractor/vmapextract/loadlib/loadlib.h b/src/tools/vmap3_extractor/vmapextract/loadlib/loadlib.h deleted file mode 100644 index 53731753425..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/loadlib/loadlib.h +++ /dev/null @@ -1,59 +0,0 @@ -#ifndef LOAD_LIB_H -#define LOAD_LIB_H - -#ifdef WIN32 -typedef __int64 int64; -typedef __int32 int32; -typedef __int16 int16; -typedef __int8 int8; -typedef unsigned __int64 uint64; -typedef unsigned __int32 uint32; -typedef unsigned __int16 uint16; -typedef unsigned __int8 uint8; -#else -#include -#ifndef uint64_t -#ifdef __linux__ -#include -#endif -#endif -typedef int64_t int64; -typedef int32_t int32; -typedef int16_t int16; -typedef int8_t int8; -typedef uint64_t uint64; -typedef uint32_t uint32; -typedef uint16_t uint16; -typedef uint8_t uint8; -#endif - -#define FILE_FORMAT_VERSION 18 - -// -// File version chunk -// -struct file_MVER -{ - union{ - uint32 fcc; - char fcc_txt[4]; - }; - uint32 size; - uint32 ver; -}; - -class FileLoader{ - uint8 *data; - uint32 data_size; -public: - virtual bool prepareLoadedData(); - uint8 *GetData() {return data;} - uint32 GetDataSize() {return data_size;} - - file_MVER *version; - FileLoader(); - ~FileLoader(); - bool loadFile(char *filename, bool log = true); - virtual void free(); -}; -#endif diff --git a/src/tools/vmap3_extractor/vmapextract/model.cpp b/src/tools/vmap3_extractor/vmapextract/model.cpp deleted file mode 100644 index b914ed96406..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/model.cpp +++ /dev/null @@ -1,187 +0,0 @@ -#include "vmapexport.h" -#include "model.h" -#include "wmo.h" -#include "mpq_libmpq04.h" -#include -#include -#include - -Model::Model(std::string &filename) : filename(filename) -{ -} - -bool Model::open() -{ - MPQFile f(filename.c_str()); - - ok = !f.isEof(); - - if (!ok) - { - f.close(); - printf("Error loading model %s\n", filename.c_str()); - return false; - } - - memcpy(&header, f.getBuffer(), sizeof(ModelHeader)); - if(header.nBoundingTriangles > 0) - { - f.seek(0); - f.seekRelative(header.ofsBoundingVertices); - vertices = new Vec3D[header.nBoundingVertices]; - f.read(vertices,header.nBoundingVertices*12); - for (uint32 i=0; i0) - { - fwrite(indices, sizeof(unsigned short), nIndexes, output); - } - fwrite("VERT",4, 1, output); - wsize = sizeof(int) + sizeof(float) * 3 * nVertices; - fwrite(&wsize, sizeof(int), 1, output); - fwrite(&nVertices, sizeof(int), 1, output); - if(nVertices >0) - { - for(uint32 vpos=0; vpos - -class Model; -class WMOInstance; -class MPQFile; - -Vec3D fixCoordSystem(Vec3D v); - -class Model -{ -public: - ModelHeader header; - uint32 offsBB_vertices, offsBB_indices; - Vec3D *BB_vertices, *vertices; - uint16 *BB_indices, *indices; - size_t nIndices; - - bool open(); - bool ConvertToVMAPModel(char * outfilename); - - bool ok; - - Model(std::string &filename); - ~Model(); - -private: - std::string filename; - char outfilename; -}; - -class ModelInstance -{ -public: - Model *model; - - uint32 id; - Vec3D pos, rot; - unsigned int d1, scale; - float w,sc; - - ModelInstance() {} - ModelInstance(MPQFile &f,const char* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile); - -}; - -#endif diff --git a/src/tools/vmap3_extractor/vmapextract/modelheaders.h b/src/tools/vmap3_extractor/vmapextract/modelheaders.h deleted file mode 100644 index 776a981ebd8..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/modelheaders.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef MODELHEADERS_H -#define MODELHEADERS_H - -/* typedef unsigned char uint8; -typedef char int8; -typedef unsigned short uint16; -typedef short int16; -typedef unsigned int uint32; -typedef int int32; */ - -#pragma pack(push,1) - -struct ModelHeader -{ - char id[4]; - uint8 version[4]; - uint32 nameLength; - uint32 nameOfs; - uint32 type; - uint32 nGlobalSequences; - uint32 ofsGlobalSequences; - uint32 nAnimations; - uint32 ofsAnimations; - uint32 nAnimationLookup; - uint32 ofsAnimationLookup; - uint32 nBones; - uint32 ofsBones; - uint32 nKeyBoneLookup; - uint32 ofsKeyBoneLookup; - uint32 nVertices; - uint32 ofsVertices; - uint32 nViews; - uint32 nColors; - uint32 ofsColors; - uint32 nTextures; - uint32 ofsTextures; - uint32 nTransparency; - uint32 ofsTransparency; - uint32 nTextureanimations; - uint32 ofsTextureanimations; - uint32 nTexReplace; - uint32 ofsTexReplace; - uint32 nRenderFlags; - uint32 ofsRenderFlags; - uint32 nBoneLookupTable; - uint32 ofsBoneLookupTable; - uint32 nTexLookup; - uint32 ofsTexLookup; - uint32 nTexUnits; - uint32 ofsTexUnits; - uint32 nTransLookup; - uint32 ofsTransLookup; - uint32 nTexAnimLookup; - uint32 ofsTexAnimLookup; - float floats[14]; - uint32 nBoundingTriangles; - uint32 ofsBoundingTriangles; - uint32 nBoundingVertices; - uint32 ofsBoundingVertices; - uint32 nBoundingNormals; - uint32 ofsBoundingNormals; - uint32 nAttachments; - uint32 ofsAttachments; - uint32 nAttachLookup; - uint32 ofsAttachLookup; - uint32 nAttachments_2; - uint32 ofsAttachments_2; - uint32 nLights; - uint32 ofsLights; - uint32 nCameras; - uint32 ofsCameras; - uint32 nCameraLookup; - uint32 ofsCameraLookup; - uint32 nRibbonEmitters; - uint32 ofsRibbonEmitters; - uint32 nParticleEmitters; - uint32 ofsParticleEmitters; -}; - -#pragma pack(pop) -#endif diff --git a/src/tools/vmap3_extractor/vmapextract/mpq_libmpq.cpp b/src/tools/vmap3_extractor/vmapextract/mpq_libmpq.cpp deleted file mode 100644 index 4aa59417f81..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/mpq_libmpq.cpp +++ /dev/null @@ -1,111 +0,0 @@ -#include "mpq_libmpq04.h" -#include -#include - -ArchiveSet gOpenArchives; - -MPQArchive::MPQArchive(const char* filename) -{ - int result = libmpq__archive_open(&mpq_a, filename, -1); - printf("Opening %s\n", filename); - if(result) { - switch(result) { - case LIBMPQ_ERROR_OPEN : - printf("Error opening archive '%s': Does file really exist?\n", filename); - break; - case LIBMPQ_ERROR_FORMAT : /* bad file format */ - printf("Error opening archive '%s': Bad file format\n", filename); - break; - case LIBMPQ_ERROR_SEEK : /* seeking in file failed */ - printf("Error opening archive '%s': Seeking in file failed\n", filename); - break; - case LIBMPQ_ERROR_READ : /* Read error in archive */ - printf("Error opening archive '%s': Read error in archive\n", filename); - break; - case LIBMPQ_ERROR_MALLOC : /* maybe not enough memory? :) */ - printf("Error opening archive '%s': Maybe not enough memory\n", filename); - break; - default: - printf("Error opening archive '%s': Unknown error\n", filename); - break; - } - return; - } - gOpenArchives.push_front(this); -} - -void MPQArchive::close() -{ - //gOpenArchives.erase(erase(&mpq_a); - libmpq__archive_close(mpq_a); -} - -MPQFile::MPQFile(const char* filename): - eof(false), - buffer(0), - pointer(0), - size(0) -{ - for(ArchiveSet::iterator i=gOpenArchives.begin(); i!=gOpenArchives.end();++i) - { - mpq_archive *mpq_a = (*i)->mpq_a; - - uint32 filenum; - if(libmpq__file_number(mpq_a, filename, &filenum)) continue; - libmpq__off_t transferred; - libmpq__file_unpacked_size(mpq_a, filenum, &size); - - // HACK: in patch.mpq some files don't want to open and give 1 for filesize - if (size<=1) { - printf("warning: file %s has size %d; cannot read.\n", filename, size); - eof = true; - buffer = 0; - return; - } - buffer = new char[size]; - - //libmpq_file_getdata - libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred); - /*libmpq_file_getdata(&mpq_a, hash, fileno, (unsigned char*)buffer);*/ - return; - - } - eof = true; - buffer = 0; -} - -size_t MPQFile::read(void* dest, size_t bytes) -{ - if (eof) return 0; - - size_t rpos = pointer + bytes; - if (rpos > size) { - bytes = size - pointer; - eof = true; - } - - memcpy(dest, &(buffer[pointer]), bytes); - - pointer = rpos; - - return bytes; -} - -void MPQFile::seek(int offset) -{ - pointer = offset; - eof = (pointer >= size); -} - -void MPQFile::seekRelative(int offset) -{ - pointer += offset; - eof = (pointer >= size); -} - -void MPQFile::close() -{ - if (buffer) delete[] buffer; - buffer = 0; - eof = true; -} diff --git a/src/tools/vmap3_extractor/vmapextract/mpq_libmpq04.h b/src/tools/vmap3_extractor/vmapextract/mpq_libmpq04.h deleted file mode 100644 index ccbfe37cba7..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/mpq_libmpq04.h +++ /dev/null @@ -1,91 +0,0 @@ -#define _CRT_SECURE_NO_DEPRECATE -#define _CRT_SECURE_NO_WARNINGS - -#ifndef MPQ_H -#define MPQ_H - -#include "loadlib/loadlib.h" -#include "libmpq/mpq.h" -#include -#include -#include -#include -#include - -using namespace std; - -class MPQArchive -{ - -public: - mpq_archive_s *mpq_a; - - MPQArchive(const char* filename); - void close(); - - void GetFileListTo(vector& filelist) { - uint32 filenum; - if(libmpq__file_number(mpq_a, "(listfile)", &filenum)) return; - libmpq__off_t size, transferred; - libmpq__file_unpacked_size(mpq_a, filenum, &size); - - char *buffer = new char[size]; - - libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred); - - char seps[] = "\n"; - char *token; - - token = strtok( buffer, seps ); - uint32 counter = 0; - while ((token != NULL) && (counter < size)) { - //cout << token << endl; - token[strlen(token) - 1] = 0; - string s = token; - filelist.push_back(s); - counter += strlen(token) + 2; - token = strtok(NULL, seps); - } - - delete[] buffer; - } -}; -typedef std::deque ArchiveSet; - -class MPQFile -{ - //MPQHANDLE handle; - bool eof; - char *buffer; - libmpq__off_t pointer,size; - - // disable copying - MPQFile(const MPQFile &f) {} - void operator=(const MPQFile &f) {} - -public: - MPQFile(const char* filename); // filenames are not case sensitive - ~MPQFile() { close(); } - size_t read(void* dest, size_t bytes); - size_t getSize() { return size; } - size_t getPos() { return pointer; } - char* getBuffer() { return buffer; } - char* getPointer() { return buffer + pointer; } - bool isEof() { return eof; } - void seek(int offset); - void seekRelative(int offset); - void close(); -}; - -inline void flipcc(char *fcc) -{ - char t; - t=fcc[0]; - fcc[0]=fcc[3]; - fcc[3]=t; - t=fcc[1]; - fcc[1]=fcc[2]; - fcc[2]=t; -} - -#endif diff --git a/src/tools/vmap3_extractor/vmapextract/vec3d.h b/src/tools/vmap3_extractor/vmapextract/vec3d.h deleted file mode 100644 index d2569bc133b..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/vec3d.h +++ /dev/null @@ -1,230 +0,0 @@ -#ifndef VEC3D_H -#define VEC3D_H - -#include -#include - -class Vec3D -{ -public: - float x,y,z; - - Vec3D(float x0 = 0.0f, float y0 = 0.0f, float z0 = 0.0f) : x(x0), y(y0), z(z0) {} - - Vec3D(const Vec3D& v) : x(v.x), y(v.y), z(v.z) {} - - Vec3D& operator= (const Vec3D &v) { - x = v.x; - y = v.y; - z = v.z; - return *this; - } - - Vec3D operator+ (const Vec3D &v) const - { - Vec3D r(x+v.x,y+v.y,z+v.z); - return r; - } - - Vec3D operator- (const Vec3D &v) const - { - Vec3D r(x-v.x,y-v.y,z-v.z); - return r; - } - - float operator* (const Vec3D &v) const - { - return x*v.x + y*v.y + z*v.z; - } - - Vec3D operator* (float d) const - { - Vec3D r(x*d,y*d,z*d); - return r; - } - - friend Vec3D operator* (float d, const Vec3D& v) - { - return v * d; - } - - Vec3D operator% (const Vec3D &v) const - { - Vec3D r(y*v.z-z*v.y, z*v.x-x*v.z, x*v.y-y*v.x); - return r; - } - - Vec3D& operator+= (const Vec3D &v) - { - x += v.x; - y += v.y; - z += v.z; - return *this; - } - - Vec3D& operator-= (const Vec3D &v) - { - x -= v.x; - y -= v.y; - z -= v.z; - return *this; - } - - Vec3D& operator*= (float d) - { - x *= d; - y *= d; - z *= d; - return *this; - } - - float lengthSquared() const - { - return x*x+y*y+z*z; - } - - float length() const - { - return sqrt(x*x+y*y+z*z); - } - - Vec3D& normalize() - { - this->operator*= (1.0f/length()); - return *this; - } - - Vec3D operator~ () const - { - Vec3D r(*this); - r.normalize(); - return r; - } - - friend std::istream& operator>>(std::istream& in, Vec3D& v) - { - in >> v.x >> v.y >> v.z; - return in; - } - - friend std::ostream& operator<<(std::ostream& out, const Vec3D& v) - { - out << v.x << " " << v.y << " " << v.z; - return out; - } - - operator float*() - { - return (float*)this; - } -}; - - -class Vec2D -{ -public: - float x,y; - - Vec2D(float x0 = 0.0f, float y0 = 0.0f) : x(x0), y(y0) {} - - Vec2D(const Vec2D& v) : x(v.x), y(v.y) {} - - Vec2D& operator= (const Vec2D &v) { - x = v.x; - y = v.y; - return *this; - } - - Vec2D operator+ (const Vec2D &v) const - { - Vec2D r(x+v.x,y+v.y); - return r; - } - - Vec2D operator- (const Vec2D &v) const - { - Vec2D r(x-v.x,y-v.y); - return r; - } - - float operator* (const Vec2D &v) const - { - return x*v.x + y*v.y; - } - - Vec2D operator* (float d) const - { - Vec2D r(x*d,y*d); - return r; - } - - friend Vec2D operator* (float d, const Vec2D& v) - { - return v * d; - } - - Vec2D& operator+= (const Vec2D &v) - { - x += v.x; - y += v.y; - return *this; - } - - Vec2D& operator-= (const Vec2D &v) - { - x -= v.x; - y -= v.y; - return *this; - } - - Vec2D& operator*= (float d) - { - x *= d; - y *= d; - return *this; - } - - float lengthSquared() const - { - return x*x+y*y; - } - - float length() const - { - return sqrt(x*x+y*y); - } - - Vec2D& normalize() - { - this->operator*= (1.0f/length()); - return *this; - } - - Vec2D operator~ () const - { - Vec2D r(*this); - r.normalize(); - return r; - } - - - friend std::istream& operator>>(std::istream& in, Vec2D& v) - { - in >> v.x >> v.y; - return in; - } - - operator float*() - { - return (float*)this; - } -}; - -inline void rotate(float x0, float y0, float *x, float *y, float angle) -{ - float xa = *x - x0, ya = *y - y0; - *x = xa*cosf(angle) - ya*sinf(angle) + x0; - *y = xa*sinf(angle) + ya*cosf(angle) + y0; -} - -#endif diff --git a/src/tools/vmap3_extractor/vmapextract/vmapexport.cpp b/src/tools/vmap3_extractor/vmapextract/vmapexport.cpp deleted file mode 100644 index 07d5d31d418..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/vmapexport.cpp +++ /dev/null @@ -1,522 +0,0 @@ -/*****************************************************************************/ -/* StormLibTest.cpp Copyright (c) Ladislav Zezula 2003 */ -/*---------------------------------------------------------------------------*/ -/* This module uses very brutal test methods for StormLib. It extracts all */ -/* files from the archive with Storm.dll and with stormlib and compares them,*/ -/* then tries to build a copy of the entire archive, then removes a few files*/ -/* from the archive and adds them back, then compares the two archives, ... */ -/*---------------------------------------------------------------------------*/ -/* Date Ver Who Comment */ -/* -------- ---- --- ------- */ -/* 25.03.03 1.00 Lad The first version of StormLibTest.cpp */ -/*****************************************************************************/ - -#define _CRT_SECURE_NO_DEPRECATE -#include -#include -#include -#include -#include - -#ifdef WIN32 - #include - #include - #include - #define mkdir _mkdir -#else - #include -#endif - -#undef min -#undef max - -//#pragma warning(disable : 4505) -//#pragma comment(lib, "Winmm.lib") - -#include - -//From Extractor -#include "adtfile.h" -#include "wdtfile.h" -#include "dbcfile.h" -#include "wmo.h" -#include "mpq_libmpq04.h" - -//------------------------------------------------------------------------------ -// Defines - -#define MPQ_BLOCK_SIZE 0x1000 - -//----------------------------------------------------------------------------- - -extern ArchiveSet gOpenArchives; - -typedef struct -{ - char name[64]; - unsigned int id; -}map_id; - -map_id * map_ids; -uint16 *LiqType = 0; -uint32 map_count; -char output_path[128]="."; -char input_path[1024]="."; -bool hasInputPathParam = false; -bool preciseVectorData = false; - -// Constants - -//static const char * szWorkDirMaps = ".\\Maps"; -static const char * szWorkDirWmo = "./Buildings"; - -// Local testing functions - -static void clreol() -{ - printf("\r \r"); -} - -void strToLower(char* str) -{ - while(*str) - { - *str=tolower(*str); - ++str; - } -} - -static const char * GetPlainName(const char * szFileName) -{ - const char * szTemp; - - if((szTemp = strrchr(szFileName, '\\')) != NULL) - szFileName = szTemp + 1; - return szFileName; -} - -// copied from contrib/extractor/System.cpp -void ReadLiquidTypeTableDBC() -{ - printf("Read LiquidType.dbc file..."); - DBCFile dbc("DBFilesClient\\LiquidType.dbc"); - if(!dbc.open()) - { - printf("Fatal error: Invalid LiquidType.dbc file format!\n"); - exit(1); - } - - size_t LiqType_count = dbc.getRecordCount(); - size_t LiqType_maxid = dbc.getRecord(LiqType_count - 1).getUInt(0); - LiqType = new uint16[LiqType_maxid + 1]; - memset(LiqType, 0xff, (LiqType_maxid + 1) * sizeof(uint16)); - - for(uint32 x = 0; x < LiqType_count; ++x) - LiqType[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3); - - printf("Done! (%u LiqTypes loaded)\n", LiqType_count); -} - -int ExtractWmo() -{ - char szLocalFile[1024] = ""; - bool success=true; - - //const char* ParsArchiveNames[] = {"patch-2.MPQ", "patch.MPQ", "common.MPQ", "expansion.MPQ"}; - - for (ArchiveSet::const_iterator ar_itr = gOpenArchives.begin(); ar_itr != gOpenArchives.end() && success; ++ar_itr) - { - vector filelist; - - (*ar_itr)->GetFileListTo(filelist); - for (vector::iterator fname=filelist.begin(); fname != filelist.end() && success; ++fname) - { - bool file_ok=true; - if (fname->find(".wmo") != string::npos) - { - // Copy files from archive - //std::cout << "found *.wmo file " << *fname << std::endl; - sprintf(szLocalFile, "%s/%s", szWorkDirWmo, GetPlainName(fname->c_str())); - fixnamen(szLocalFile,strlen(szLocalFile)); - FILE * n; - if ((n = fopen(szLocalFile, "rb"))== NULL) - { - int p = 0; - //Select root wmo files - const char * rchr = strrchr(GetPlainName(fname->c_str()),0x5f); - if(rchr != NULL) - { - char cpy[4]; - strncpy((char*)cpy,rchr,4); - for (int i=0;i<4; ++i) - { - int m = cpy[i]; - if(isdigit(m)) - p++; - } - } - if(p != 3) - { - std::cout << "Extracting " << *fname << std::endl; - WMORoot * froot = new WMORoot(*fname); - if(!froot->open()) - { - printf("Couldn't open RootWmo!!!\n"); - delete froot; - continue; - } - FILE *output=fopen(szLocalFile,"wb"); - if(!output) - { - printf("couldn't open %s for writing!\n", szLocalFile); - success=false; - } - froot->ConvertToVMAPRootWmo(output); - int Wmo_nVertices = 0; - //printf("root has %d groups\n", froot->nGroups); - if(froot->nGroups !=0) - { - for (uint32 i=0; inGroups; ++i) - { - char temp[1024]; - strcpy(temp, fname->c_str()); - temp[fname->length()-4] = 0; - char groupFileName[1024]; - sprintf(groupFileName,"%s_%03d.wmo",temp, i); - //printf("Trying to open groupfile %s\n",groupFileName); - string s = groupFileName; - WMOGroup * fgroup = new WMOGroup(s); - if(!fgroup->open()) - { - printf("Could not open all Group file for: %s\n",GetPlainName(fname->c_str())); - file_ok=false; - break; - } - - Wmo_nVertices += fgroup->ConvertToVMAPGroupWmo(output, froot, preciseVectorData); - delete fgroup; - } - } - fseek(output, 8, SEEK_SET); // store the correct no of vertices - fwrite(&Wmo_nVertices,sizeof(int),1,output); - fclose(output); - delete froot; - } - } - else - { - fclose(n); - } - } - // Delete the extracted file in the case of an error - if(!file_ok) - remove(szLocalFile); - } - } - - if(success) - printf("\nExtract wmo complete (No (fatal) errors)\n"); - - return success; -} - -void ExtractMapsFromMpq() -{ -} - -void ParsMapFiles() -{ - char fn[512]; - //char id_filename[64]; - char id[10]; - for (unsigned int i=0; iinit(map_ids[i].id, x, y); - delete ADT; - } - } - } - } - } -} - -void getGamePath() -{ -#ifdef _WIN32 - HKEY key; - DWORD t,s; - LONG l; - s = sizeof(input_path); - memset(input_path,0,s); - l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\World of Warcraft",0,KEY_QUERY_VALUE,&key); - //l = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Blizzard Entertainment\\Burning Crusade Closed Beta",0,KEY_QUERY_VALUE,&key); - l = RegQueryValueEx(key,"InstallPath",0,&t,(LPBYTE)input_path,&s); - RegCloseKey(key); - if (strlen(input_path) > 0) - { - if (input_path[strlen(input_path) - 1] != '\\') strcat(input_path, "\\"); - } - strcat(input_path,"Data\\"); -#else - strcpy(input_path,"Data/"); -#endif -} - -bool scan_patches(char* scanmatch, std::vector& pArchiveNames) -{ - int i; - char path[512]; - - for (i = 1; i <= 99; i++) - { - if (i != 1) - { - sprintf(path, "%s-%d.MPQ", scanmatch, i); - } - else - { - sprintf(path, "%s.MPQ", scanmatch); - } -#ifdef __linux__ - if(FILE* h = fopen64(path, "rb")) -#else - if(FILE* h = fopen(path, "rb")) -#endif - { - fclose(h); - //matches.push_back(path); - pArchiveNames.push_back(path); - } - } - - return(true); -} - -bool fillArchiveNameVector(std::vector& pArchiveNames) -{ - if(!hasInputPathParam) - getGamePath(); - - printf("\nGame path: %s\n", input_path); - - char path[512]; - string in_path(input_path); - std::vector locales, searchLocales; - - searchLocales.push_back("enGB"); - searchLocales.push_back("enUS"); - searchLocales.push_back("deDE"); - searchLocales.push_back("esES"); - searchLocales.push_back("frFR"); - searchLocales.push_back("koKR"); - searchLocales.push_back("ruRU"); - - for (std::vector::iterator i = searchLocales.begin(); i != searchLocales.end(); ++i) - { - std::string localePath = in_path + *i; - // check if locale exists: - struct stat status; - if (stat(localePath.c_str(), &status)) - continue; - if ((status.st_mode & S_IFDIR) == 0) - continue; - printf("Found locale '%s'\n", i->c_str()); - locales.push_back(*i); - } - printf("\n"); - - // open locale expansion and common files - printf("Adding data files from locale directories.\n"); - for (std::vector::iterator i = locales.begin(); i != locales.end(); ++i) - { - pArchiveNames.push_back(in_path + *i + "/locale-" + *i + ".MPQ"); - pArchiveNames.push_back(in_path + *i + "/expansion-locale-" + *i + ".MPQ"); - pArchiveNames.push_back(in_path + *i + "/lichking-locale-" + *i + ".MPQ"); - } - - // open expansion and common files - pArchiveNames.push_back(input_path + string("common.MPQ")); - pArchiveNames.push_back(input_path + string("common-2.MPQ")); - pArchiveNames.push_back(input_path + string("expansion.MPQ")); - pArchiveNames.push_back(input_path + string("lichking.MPQ")); - - // now, scan for the patch levels in the core dir - printf("Scanning patch levels from data directory.\n"); - sprintf(path, "%spatch", input_path); - if (!scan_patches(path, pArchiveNames)) - return(false); - - // now, scan for the patch levels in locale dirs - printf("Scanning patch levels from locale directories.\n"); - bool foundOne = false; - for (std::vector::iterator i = locales.begin(); i != locales.end(); ++i) - { - printf("Locale: %s\n", i->c_str()); - sprintf(path, "%s%s/patch-%s", input_path, i->c_str(), i->c_str()); - if(scan_patches(path, pArchiveNames)) - foundOne = true; - } - - printf("\n"); - - if(!foundOne) - { - printf("no locale found\n"); - return false; - } - - return true; -} - -bool processArgv(int argc, char ** argv, const char *versionString) -{ - bool result = true; - hasInputPathParam = false; - bool preciseVectorData = false; - - for(int i=1; i< argc; ++i) - { - if(strcmp("-s",argv[i]) == 0) - { - preciseVectorData = false; - } - else if(strcmp("-d",argv[i]) == 0) - { - if((i+1)]\n", argv[0]); - printf(" -s : (default) small size (data size optimization), ~500MB less vmap data.\n"); - printf(" -l : large size, ~500MB more vmap data. (might contain more details)\n"); - printf(" -d : Path to the vector data source folder.\n"); - printf(" -? : This message.\n"); - } - return result; -} - -//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -// Main -// -// The program must be run with two command line arguments -// -// Arg1 - The source MPQ name (for testing reading and file find) -// Arg2 - Listfile name -// - -int main(int argc, char ** argv) -{ - bool success=true; - const char *versionString = "V2.90 2010_05"; - - // Use command line arguments, when some - if(!processArgv(argc, argv, versionString)) - return 1; - - printf("Extract %s. Beginning work ....\n",versionString); - //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - // Create the working directory - if(mkdir(szWorkDirWmo -#ifdef __linux__ - , 0711 -#endif - )) - success = (errno == EEXIST); - - // prepare archive name list - std::vector archiveNames; - fillArchiveNameVector(archiveNames); - for (size_t i=0; i < archiveNames.size(); ++i) - { - MPQArchive *archive = new MPQArchive(archiveNames[i].c_str()); - if(!gOpenArchives.size() || gOpenArchives.front() != archive) - delete archive; - } - - if(gOpenArchives.empty()) - { - printf("FATAL ERROR: None MPQ archive found by path '%s'. Use -d option with proper path.\n",input_path); - return 1; - } - ReadLiquidTypeTableDBC(); - - // extract data - if(success) - success = ExtractWmo(); - - //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx - //map.dbc - if(success) - { - DBCFile * dbc = new DBCFile("DBFilesClient\\Map.dbc"); - if(!dbc->open()) - { - delete dbc; - printf("FATAL ERROR: Map.dbc not found in data file.\n"); - return 1; - } - map_count=dbc->getRecordCount (); - map_ids=new map_id[map_count]; - for(unsigned int x=0;xgetRecord (x).getUInt(0); - strcpy(map_ids[x].name,dbc->getRecord(x).getString(1)); - printf("Map - %s\n",map_ids[x].name); - } - - - delete dbc; - ParsMapFiles(); - delete [] map_ids; - //nError = ERROR_SUCCESS; - } - - clreol(); - if(!success) - { - printf("ERROR: Extract %s. Work NOT complete.\n Precise vector data=%d.\nPress any key.\n",versionString, preciseVectorData); - getchar(); - } - - printf("Extract %s. Work complete. No errors.\n",versionString); - delete [] LiqType; - return 0; -} diff --git a/src/tools/vmap3_extractor/vmapextract/vmapexport.h b/src/tools/vmap3_extractor/vmapextract/vmapexport.h deleted file mode 100644 index 625bc930882..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/vmapexport.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef VMAPEXPORT_H -#define VMAPEXPORT_H - -enum ModelFlags -{ - MOD_M2 = 1, - MOD_WORLDSPAWN = 1<<1, - MOD_HAS_BOUND = 1<<2 -}; - -#endif diff --git a/src/tools/vmap3_extractor/vmapextract/wdtfile.cpp b/src/tools/vmap3_extractor/vmapextract/wdtfile.cpp deleted file mode 100644 index 7f81af72931..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/wdtfile.cpp +++ /dev/null @@ -1,117 +0,0 @@ -#define __STORMLIB_SELF__ - -#include "wdtfile.h" -#include "adtfile.h" -#include - -char * wdtGetPlainName(char * FileName) -{ - char * szTemp; - - if((szTemp = strrchr(FileName, '\\')) != NULL) - FileName = szTemp + 1; - return FileName; -} - -WDTFile::WDTFile(char* file_name, char* file_name1):WDT(file_name) -{ - filename.append(file_name1,strlen(file_name1)); -} - -bool WDTFile::init(char *map_id, unsigned int mapID) -{ - if (WDT.isEof()) - { - //printf("Can't find WDT file.\n"); - return false; - } - - char fourcc[5]; - uint32 size; - - const char dirname[] = "Buildings/dir_bin"; - FILE *dirfile; - dirfile = fopen(dirname, "ab"); - if(!dirfile) - { - printf("Can't open dirfile!'%s'\n", dirname); - return false; - } - - while (!WDT.isEof()) - { - WDT.read(fourcc,4); - WDT.read(&size, 4); - - flipcc(fourcc); - fourcc[4] = 0; - - size_t nextpos = WDT.getPos() + size; - - if (!strcmp(fourcc,"MAIN")) - { - } - if (!strcmp(fourcc,"MWMO")) - { - // global map objects - if (size) - { - char *buf = new char[size]; - WDT.read(buf, size); - char *p=buf; - int q = 0; - gWmoInstansName = new string[size]; - while (p=0 && z >= 0 && x<64 && z<64)) - return NULL; - - char name[512]; - - sprintf(name,"World\\Maps\\%s\\%s_%d_%d.adt", filename.c_str(), filename.c_str(), x, z); - return new ADTFile(name); -} diff --git a/src/tools/vmap3_extractor/vmapextract/wdtfile.h b/src/tools/vmap3_extractor/vmapextract/wdtfile.h deleted file mode 100644 index f3d71c41791..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/wdtfile.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef WDTFILE_H -#define WDTFILE_H - -#include "mpq_libmpq04.h" -#include "wmo.h" -#include -#include "stdlib.h" - -class ADTFile; - -class WDTFile -{ -public: - WDTFile(char* file_name, char* file_name1); - ~WDTFile(void); - bool init(char *map_id, unsigned int mapID); - - string* gWmoInstansName; - int gnWMO, nMaps; - - ADTFile* GetMap(int x, int z); - -private: - MPQFile WDT; - bool maps[64][64]; - string filename; -}; - -#endif diff --git a/src/tools/vmap3_extractor/vmapextract/wmo.cpp b/src/tools/vmap3_extractor/vmapextract/wmo.cpp deleted file mode 100644 index 508391be675..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/wmo.cpp +++ /dev/null @@ -1,506 +0,0 @@ - -#include "vmapexport.h" -#include "wmo.h" -#include "vec3d.h" -#include -#include -#include -#include -#include -#undef min -#undef max -#include "mpq_libmpq04.h" - -using namespace std; -extern uint16 *LiqType; - -WMORoot::WMORoot(std::string &filename) : filename(filename) -{ -} - -bool WMORoot::open() -{ - MPQFile f(filename.c_str()); - if(f.isEof ()) - { - printf("No such file.\n"); - return false; - } - - uint32 size; - char fourcc[5]; - - while (!f.isEof()) - { - f.read(fourcc,4); - f.read(&size, 4); - - flipcc(fourcc); - fourcc[4] = 0; - - size_t nextpos = f.getPos() + size; - - if (!strcmp(fourcc,"MOHD"))//header - { - f.read(&nTextures, 4); - f.read(&nGroups, 4); - f.read(&nP, 4); - f.read(&nLights, 4); - f.read(&nModels, 4); - f.read(&nDoodads, 4); - f.read(&nDoodadSets, 4); - f.read(&col, 4); - f.read(&RootWMOID, 4); - f.read(bbcorn1,12); - f.read(bbcorn2,12); - f.read(&liquidType, 4); - break; - } - /* - else if (!strcmp(fourcc,"MOTX")) - { - } - else if (!strcmp(fourcc,"MOMT")) - { - } - else if (!strcmp(fourcc,"MOGN")) - { - } - else if (!strcmp(fourcc,"MOGI")) - { - } - else if (!strcmp(fourcc,"MOLT")) - { - } - else if (!strcmp(fourcc,"MODN")) - { - } - else if (!strcmp(fourcc,"MODS")) - { - } - else if (!strcmp(fourcc,"MODD")) - { - } - else if (!strcmp(fourcc,"MOSB")) - { - } - else if (!strcmp(fourcc,"MOPV")) - { - } - else if (!strcmp(fourcc,"MOPT")) - { - } - else if (!strcmp(fourcc,"MOPR")) - { - } - else if (!strcmp(fourcc,"MFOG")) - { - } - */ - f.seek((int)nextpos); - } - f.close (); - return true; -} - -bool WMORoot::ConvertToVMAPRootWmo(FILE *pOutfile) -{ - //printf("Convert RootWmo...\n"); - - fwrite("VMAP003",1,8,pOutfile); - unsigned int nVectors = 0; - fwrite(&nVectors,sizeof(nVectors),1,pOutfile); // will be filled later - fwrite(&nGroups,4,1,pOutfile); - fwrite(&RootWMOID,4,1,pOutfile); - return true; -} - -WMORoot::~WMORoot() -{ -} - -WMOGroup::WMOGroup(std::string &filename) : filename(filename), - MOPY(0), MOVI(0), MoviEx(0), MOVT(0), MOBA(0), MobaEx(0), hlq(0), LiquEx(0), LiquBytes(0) -{ -} - -bool WMOGroup::open() -{ - MPQFile f(filename.c_str()); - if(f.isEof ()) - { - printf("No such file.\n"); - return false; - } - uint32 size; - char fourcc[5]; - while (!f.isEof()) - { - f.read(fourcc,4); - f.read(&size, 4); - flipcc(fourcc); - if (!strcmp(fourcc,"MOGP"))//Fix sizeoff = Data size. - { - size = 68; - } - fourcc[4] = 0; - size_t nextpos = f.getPos() + size; - LiquEx_size = 0; - liquflags = 0; - - if (!strcmp(fourcc,"MOGP"))//header - { - f.read(&groupName, 4); - f.read(&descGroupName, 4); - f.read(&mogpFlags, 4); - f.read(bbcorn1, 12); - f.read(bbcorn2, 12); - f.read(&moprIdx, 2); - f.read(&moprNItems, 2); - f.read(&nBatchA, 2); - f.read(&nBatchB, 2); - f.read(&nBatchC, 4); - f.read(&fogIdx, 4); - f.read(&liquidType, 4); - f.read(&groupWMOID,4); - - } - else if (!strcmp(fourcc,"MOPY")) - { - MOPY = new char[size]; - mopy_size = size; - nTriangles = (int)size / 2; - f.read(MOPY, size); - } - else if (!strcmp(fourcc,"MOVI")) - { - MOVI = new uint16[size/2]; - f.read(MOVI, size); - } - else if (!strcmp(fourcc,"MOVT")) - { - MOVT = new float[size/4]; - f.read(MOVT, size); - nVertices = (int)size / 12; - } - else if (!strcmp(fourcc,"MONR")) - { - } - else if (!strcmp(fourcc,"MOTV")) - { - } - else if (!strcmp(fourcc,"MOBA")) - { - MOBA = new uint16[size/2]; - moba_size = size/2; - f.read(MOBA, size); - } - else if (!strcmp(fourcc,"MLIQ")) - { - liquflags |= 1; - hlq = new WMOLiquidHeader; - f.read(hlq, 0x1E); - LiquEx_size = sizeof(WMOLiquidVert) * hlq->xverts * hlq->yverts; - LiquEx = new WMOLiquidVert[hlq->xverts * hlq->yverts]; - f.read(LiquEx, LiquEx_size); - int nLiquBytes = hlq->xtiles * hlq->ytiles; - LiquBytes = new char[nLiquBytes]; - f.read(LiquBytes, nLiquBytes); - - /* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app); - llog << filename; - llog << "\nbbox: " << bbcorn1[0] << ", " << bbcorn1[1] << ", " << bbcorn1[2] << " | " << bbcorn2[0] << ", " << bbcorn2[1] << ", " << bbcorn2[2]; - llog << "\nlpos: " << hlq->pos_x << ", " << hlq->pos_y << ", " << hlq->pos_z; - llog << "\nx-/yvert: " << hlq->xverts << "/" << hlq->yverts << " size: " << size << " expected size: " << 30 + hlq->xverts*hlq->yverts*8 + hlq->xtiles*hlq->ytiles << std::endl; - llog.close(); */ - } - f.seek((int)nextpos); - } - f.close(); - return true; -} - -int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool pPreciseVectorData) -{ - fwrite(&mogpFlags,sizeof(uint32),1,output); - fwrite(&groupWMOID,sizeof(uint32),1,output); - // group bound - fwrite(bbcorn1, sizeof(float), 3, output); - fwrite(bbcorn2, sizeof(float), 3, output); - fwrite(&liquflags,sizeof(uint32),1,output); - int nColTriangles = 0; - if(pPreciseVectorData) - { - char GRP[] = "GRP "; - fwrite(GRP,1,4,output); - - int k = 0; - int moba_batch = moba_size/12; - MobaEx = new int[moba_batch*4]; - for(int i=8; i0) - { - if(fwrite(MOVI, sizeof(unsigned short), nIdexes, output) != nIdexes) - { - printf("Error while writing file indexarray"); - exit(0); - } - } - - if(fwrite("VERT",4, 1, output) != 1) - { - printf("Error while writing file nbraches ID"); - exit(0); - } - wsize = sizeof(int) + sizeof(float) * 3 * nVertices; - if(fwrite(&wsize, sizeof(int), 1, output) != 1) - { - printf("Error while writing file wsize"); - // no need to exit? - } - if(fwrite(&nVertices, sizeof(int), 1, output) != 1) - { - printf("Error while writing file nVertices"); - exit(0); - } - if(nVertices >0) - { - if(fwrite(MOVT, sizeof(float)*3, nVertices, output) != nVertices) - { - printf("Error while writing file vectors"); - exit(0); - } - } - - nColTriangles = nTriangles; - } - else - { - char GRP[] = "GRP "; - fwrite(GRP,1,4,output); - int k = 0; - int moba_batch = moba_size/12; - MobaEx = new int[moba_batch*4]; - for(int i=8; i= 0) - check -= fwrite(MOVT+3*i, sizeof(float), 3, output); - - assert(check==0); - - delete [] MoviEx; - delete [] IndexRenum; - } - - //------LIQU------------------------ - if(LiquEx_size != 0) - { - int LIQU_h[] = {0x5551494C, sizeof(WMOLiquidHeader) + LiquEx_size + hlq->xtiles*hlq->ytiles};// "LIQU" - fwrite(LIQU_h, 4, 2, output); - - // according to WoW.Dev Wiki: - uint32 liquidEntry; - if (rootWMO->liquidType & 4) - liquidEntry = liquidType; - else if (liquidType == 15) - liquidEntry = 0; - else - liquidEntry = liquidType + 1; - // overwrite material type in header... - hlq->type = LiqType[liquidEntry]; - - /* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app); - llog << filename; - llog << ":\nliquidEntry: " << liquidEntry << " type: " << hlq->type << " (root:" << rootWMO->liquidType << " group:" << liquidType << ")\n"; - llog.close(); */ - - fwrite(hlq, sizeof(WMOLiquidHeader), 1, output); - // only need height values, the other values are unknown anyway - for (uint32 i = 0; ixtiles*hlq->ytiles, output); - } - - return nColTriangles; -} - -WMOGroup::~WMOGroup() -{ - delete [] MOPY; - delete [] MOVI; - delete [] MOVT; - delete [] MOBA; - delete hlq; - delete [] LiquEx; - delete [] LiquBytes; -} - -WMOInstance::WMOInstance(MPQFile &f,const char* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile) -{ - pos = Vec3D(0,0,0); - - float ff[3]; - f.read(&id, 4); - f.read(ff,12); - pos = Vec3D(ff[0],ff[1],ff[2]); - f.read(ff,12); - rot = Vec3D(ff[0],ff[1],ff[2]); - f.read(ff,12); - pos2 = Vec3D(ff[0],ff[1],ff[2]); - f.read(ff,12); - pos3 = Vec3D(ff[0],ff[1],ff[2]); - f.read(&d2,4); - - uint16 trash,adtId; - f.read(&adtId,2); - f.read(&trash,2); - - //-----------add_in _dir_file---------------- - - char tempname[512]; - sprintf(tempname, "Buildings/%s", WmoInstName); - FILE *input; - input = fopen(tempname, "r+b"); - - if(!input) - { - printf("WMOInstance::WMOInstance: couldn't open %s\n", tempname); - return; - } - - fseek(input, 8, SEEK_SET); // get the correct no of vertices - int nVertices; - fread(&nVertices, sizeof (int), 1, input); - fclose(input); - - if(nVertices == 0) - return; - - float x,z; - x = pos.x; - z = pos.z; - if(x==0 && z == 0) - { - pos.x = 533.33333f*32; - pos.z = 533.33333f*32; - } - pos = fixCoords(pos); - pos2 = fixCoords(pos2); - pos3 = fixCoords(pos3); - - float scale = 1.0f; - uint32 flags = MOD_HAS_BOUND; - if(tileX == 65 && tileY == 65) flags |= MOD_WORLDSPAWN; - //write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, Bound_lo, Bound_hi, 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(&adtId, sizeof(uint16), 1, pDirfile); - fwrite(&id, sizeof(uint32), 1, pDirfile); - fwrite(&pos, sizeof(float), 3, pDirfile); - fwrite(&rot, sizeof(float), 3, pDirfile); - fwrite(&scale, sizeof(float), 1, pDirfile); - fwrite(&pos2, sizeof(float), 3, pDirfile); - fwrite(&pos3, sizeof(float), 3, pDirfile); - uint32 nlen=strlen(WmoInstName); - fwrite(&nlen, sizeof(uint32), 1, pDirfile); - fwrite(WmoInstName, sizeof(char), nlen, pDirfile); - - /* fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f 1.0 %d %d %d,%d %d\n", - MapName, - WmoInstName, - (float) x, (float) pos.y, (float) z, - (float) rot.x, (float) rot.y, (float) rot.z, - nVertices, - realx1, realy1, - realx2, realy2 - ); */ - - // fclose(dirfile); -} diff --git a/src/tools/vmap3_extractor/vmapextract/wmo.h b/src/tools/vmap3_extractor/vmapextract/wmo.h deleted file mode 100644 index 12979bc13d9..00000000000 --- a/src/tools/vmap3_extractor/vmapextract/wmo.h +++ /dev/null @@ -1,118 +0,0 @@ -#ifndef WMO_H -#define WMO_H -#define TILESIZE (533.33333f) -#define CHUNKSIZE ((TILESIZE) / 16.0f) - -#include -#include -#include "vec3d.h" -#include "loadlib/loadlib.h" - -// MOPY flags -#define WMO_MATERIAL_NOCAMCOLLIDE 0x01 -#define WMO_MATERIAL_DETAIL 0x02 -#define WMO_MATERIAL_NO_COLLISION 0x04 -#define WMO_MATERIAL_HINT 0x08 -#define WMO_MATERIAL_RENDER 0x10 -#define WMO_MATERIAL_COLLIDE_HIT 0x20 -#define WMO_MATERIAL_WALL_SURFACE 0x40 - -class WMOInstance; -class WMOManager; -class MPQFile; - -/* for whatever reason a certain company just can't stick to one coordinate system... */ -static inline Vec3D fixCoords(const Vec3D &v){ return Vec3D(v.z, v.x, v.y); } - -class WMORoot -{ -public: - uint32 nTextures, nGroups, nP, nLights, nModels, nDoodads, nDoodadSets, RootWMOID, liquidType; - unsigned int col; - float bbcorn1[3]; - float bbcorn2[3]; - - WMORoot(std::string &filename); - ~WMORoot(); - - bool open(); - bool ConvertToVMAPRootWmo(FILE *output); -private: - std::string filename; - char outfilename; -}; - -struct WMOLiquidHeader -{ - int xverts, yverts, xtiles, ytiles; - float pos_x; - float pos_y; - float pos_z; - short type; -}; - -struct WMOLiquidVert -{ - uint16 unk1; - uint16 unk2; - float height; -}; - -class WMOGroup -{ -public: - // MOGP - int groupName, descGroupName, mogpFlags; - float bbcorn1[3]; - float bbcorn2[3]; - uint16 moprIdx; - uint16 moprNItems; - uint16 nBatchA; - uint16 nBatchB; - uint32 nBatchC, fogIdx, liquidType, groupWMOID; - - int mopy_size,moba_size; - int LiquEx_size; - unsigned int nVertices; // number when loaded - int nTriangles; // number when loaded - char *MOPY; - uint16 *MOVI; - uint16 *MoviEx; - float *MOVT; - uint16 *MOBA; - int *MobaEx; - WMOLiquidHeader *hlq; - WMOLiquidVert *LiquEx; - char *LiquBytes; - uint32 liquflags; - - WMOGroup(std::string &filename); - ~WMOGroup(); - - bool open(); - int ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool pPreciseVectorData); - -private: - std::string filename; - char outfilename; -}; - -class WMOInstance -{ - static std::set ids; -public: - std::string MapName; - int currx; - int curry; - WMOGroup *wmo; - Vec3D pos; - Vec3D pos2, pos3, rot; - uint32 indx,id, d2, d3; - int doodadset; - - WMOInstance(MPQFile &f,const char* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile); - - static void reset(); -}; - -#endif diff --git a/src/tools/vmap3_extractor/wdtfile.cpp b/src/tools/vmap3_extractor/wdtfile.cpp new file mode 100644 index 00000000000..7f81af72931 --- /dev/null +++ b/src/tools/vmap3_extractor/wdtfile.cpp @@ -0,0 +1,117 @@ +#define __STORMLIB_SELF__ + +#include "wdtfile.h" +#include "adtfile.h" +#include + +char * wdtGetPlainName(char * FileName) +{ + char * szTemp; + + if((szTemp = strrchr(FileName, '\\')) != NULL) + FileName = szTemp + 1; + return FileName; +} + +WDTFile::WDTFile(char* file_name, char* file_name1):WDT(file_name) +{ + filename.append(file_name1,strlen(file_name1)); +} + +bool WDTFile::init(char *map_id, unsigned int mapID) +{ + if (WDT.isEof()) + { + //printf("Can't find WDT file.\n"); + return false; + } + + char fourcc[5]; + uint32 size; + + const char dirname[] = "Buildings/dir_bin"; + FILE *dirfile; + dirfile = fopen(dirname, "ab"); + if(!dirfile) + { + printf("Can't open dirfile!'%s'\n", dirname); + return false; + } + + while (!WDT.isEof()) + { + WDT.read(fourcc,4); + WDT.read(&size, 4); + + flipcc(fourcc); + fourcc[4] = 0; + + size_t nextpos = WDT.getPos() + size; + + if (!strcmp(fourcc,"MAIN")) + { + } + if (!strcmp(fourcc,"MWMO")) + { + // global map objects + if (size) + { + char *buf = new char[size]; + WDT.read(buf, size); + char *p=buf; + int q = 0; + gWmoInstansName = new string[size]; + while (p=0 && z >= 0 && x<64 && z<64)) + return NULL; + + char name[512]; + + sprintf(name,"World\\Maps\\%s\\%s_%d_%d.adt", filename.c_str(), filename.c_str(), x, z); + return new ADTFile(name); +} diff --git a/src/tools/vmap3_extractor/wdtfile.h b/src/tools/vmap3_extractor/wdtfile.h new file mode 100644 index 00000000000..f3d71c41791 --- /dev/null +++ b/src/tools/vmap3_extractor/wdtfile.h @@ -0,0 +1,29 @@ +#ifndef WDTFILE_H +#define WDTFILE_H + +#include "mpq_libmpq04.h" +#include "wmo.h" +#include +#include "stdlib.h" + +class ADTFile; + +class WDTFile +{ +public: + WDTFile(char* file_name, char* file_name1); + ~WDTFile(void); + bool init(char *map_id, unsigned int mapID); + + string* gWmoInstansName; + int gnWMO, nMaps; + + ADTFile* GetMap(int x, int z); + +private: + MPQFile WDT; + bool maps[64][64]; + string filename; +}; + +#endif diff --git a/src/tools/vmap3_extractor/wmo.cpp b/src/tools/vmap3_extractor/wmo.cpp new file mode 100644 index 00000000000..508391be675 --- /dev/null +++ b/src/tools/vmap3_extractor/wmo.cpp @@ -0,0 +1,506 @@ + +#include "vmapexport.h" +#include "wmo.h" +#include "vec3d.h" +#include +#include +#include +#include +#include +#undef min +#undef max +#include "mpq_libmpq04.h" + +using namespace std; +extern uint16 *LiqType; + +WMORoot::WMORoot(std::string &filename) : filename(filename) +{ +} + +bool WMORoot::open() +{ + MPQFile f(filename.c_str()); + if(f.isEof ()) + { + printf("No such file.\n"); + return false; + } + + uint32 size; + char fourcc[5]; + + while (!f.isEof()) + { + f.read(fourcc,4); + f.read(&size, 4); + + flipcc(fourcc); + fourcc[4] = 0; + + size_t nextpos = f.getPos() + size; + + if (!strcmp(fourcc,"MOHD"))//header + { + f.read(&nTextures, 4); + f.read(&nGroups, 4); + f.read(&nP, 4); + f.read(&nLights, 4); + f.read(&nModels, 4); + f.read(&nDoodads, 4); + f.read(&nDoodadSets, 4); + f.read(&col, 4); + f.read(&RootWMOID, 4); + f.read(bbcorn1,12); + f.read(bbcorn2,12); + f.read(&liquidType, 4); + break; + } + /* + else if (!strcmp(fourcc,"MOTX")) + { + } + else if (!strcmp(fourcc,"MOMT")) + { + } + else if (!strcmp(fourcc,"MOGN")) + { + } + else if (!strcmp(fourcc,"MOGI")) + { + } + else if (!strcmp(fourcc,"MOLT")) + { + } + else if (!strcmp(fourcc,"MODN")) + { + } + else if (!strcmp(fourcc,"MODS")) + { + } + else if (!strcmp(fourcc,"MODD")) + { + } + else if (!strcmp(fourcc,"MOSB")) + { + } + else if (!strcmp(fourcc,"MOPV")) + { + } + else if (!strcmp(fourcc,"MOPT")) + { + } + else if (!strcmp(fourcc,"MOPR")) + { + } + else if (!strcmp(fourcc,"MFOG")) + { + } + */ + f.seek((int)nextpos); + } + f.close (); + return true; +} + +bool WMORoot::ConvertToVMAPRootWmo(FILE *pOutfile) +{ + //printf("Convert RootWmo...\n"); + + fwrite("VMAP003",1,8,pOutfile); + unsigned int nVectors = 0; + fwrite(&nVectors,sizeof(nVectors),1,pOutfile); // will be filled later + fwrite(&nGroups,4,1,pOutfile); + fwrite(&RootWMOID,4,1,pOutfile); + return true; +} + +WMORoot::~WMORoot() +{ +} + +WMOGroup::WMOGroup(std::string &filename) : filename(filename), + MOPY(0), MOVI(0), MoviEx(0), MOVT(0), MOBA(0), MobaEx(0), hlq(0), LiquEx(0), LiquBytes(0) +{ +} + +bool WMOGroup::open() +{ + MPQFile f(filename.c_str()); + if(f.isEof ()) + { + printf("No such file.\n"); + return false; + } + uint32 size; + char fourcc[5]; + while (!f.isEof()) + { + f.read(fourcc,4); + f.read(&size, 4); + flipcc(fourcc); + if (!strcmp(fourcc,"MOGP"))//Fix sizeoff = Data size. + { + size = 68; + } + fourcc[4] = 0; + size_t nextpos = f.getPos() + size; + LiquEx_size = 0; + liquflags = 0; + + if (!strcmp(fourcc,"MOGP"))//header + { + f.read(&groupName, 4); + f.read(&descGroupName, 4); + f.read(&mogpFlags, 4); + f.read(bbcorn1, 12); + f.read(bbcorn2, 12); + f.read(&moprIdx, 2); + f.read(&moprNItems, 2); + f.read(&nBatchA, 2); + f.read(&nBatchB, 2); + f.read(&nBatchC, 4); + f.read(&fogIdx, 4); + f.read(&liquidType, 4); + f.read(&groupWMOID,4); + + } + else if (!strcmp(fourcc,"MOPY")) + { + MOPY = new char[size]; + mopy_size = size; + nTriangles = (int)size / 2; + f.read(MOPY, size); + } + else if (!strcmp(fourcc,"MOVI")) + { + MOVI = new uint16[size/2]; + f.read(MOVI, size); + } + else if (!strcmp(fourcc,"MOVT")) + { + MOVT = new float[size/4]; + f.read(MOVT, size); + nVertices = (int)size / 12; + } + else if (!strcmp(fourcc,"MONR")) + { + } + else if (!strcmp(fourcc,"MOTV")) + { + } + else if (!strcmp(fourcc,"MOBA")) + { + MOBA = new uint16[size/2]; + moba_size = size/2; + f.read(MOBA, size); + } + else if (!strcmp(fourcc,"MLIQ")) + { + liquflags |= 1; + hlq = new WMOLiquidHeader; + f.read(hlq, 0x1E); + LiquEx_size = sizeof(WMOLiquidVert) * hlq->xverts * hlq->yverts; + LiquEx = new WMOLiquidVert[hlq->xverts * hlq->yverts]; + f.read(LiquEx, LiquEx_size); + int nLiquBytes = hlq->xtiles * hlq->ytiles; + LiquBytes = new char[nLiquBytes]; + f.read(LiquBytes, nLiquBytes); + + /* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app); + llog << filename; + llog << "\nbbox: " << bbcorn1[0] << ", " << bbcorn1[1] << ", " << bbcorn1[2] << " | " << bbcorn2[0] << ", " << bbcorn2[1] << ", " << bbcorn2[2]; + llog << "\nlpos: " << hlq->pos_x << ", " << hlq->pos_y << ", " << hlq->pos_z; + llog << "\nx-/yvert: " << hlq->xverts << "/" << hlq->yverts << " size: " << size << " expected size: " << 30 + hlq->xverts*hlq->yverts*8 + hlq->xtiles*hlq->ytiles << std::endl; + llog.close(); */ + } + f.seek((int)nextpos); + } + f.close(); + return true; +} + +int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool pPreciseVectorData) +{ + fwrite(&mogpFlags,sizeof(uint32),1,output); + fwrite(&groupWMOID,sizeof(uint32),1,output); + // group bound + fwrite(bbcorn1, sizeof(float), 3, output); + fwrite(bbcorn2, sizeof(float), 3, output); + fwrite(&liquflags,sizeof(uint32),1,output); + int nColTriangles = 0; + if(pPreciseVectorData) + { + char GRP[] = "GRP "; + fwrite(GRP,1,4,output); + + int k = 0; + int moba_batch = moba_size/12; + MobaEx = new int[moba_batch*4]; + for(int i=8; i0) + { + if(fwrite(MOVI, sizeof(unsigned short), nIdexes, output) != nIdexes) + { + printf("Error while writing file indexarray"); + exit(0); + } + } + + if(fwrite("VERT",4, 1, output) != 1) + { + printf("Error while writing file nbraches ID"); + exit(0); + } + wsize = sizeof(int) + sizeof(float) * 3 * nVertices; + if(fwrite(&wsize, sizeof(int), 1, output) != 1) + { + printf("Error while writing file wsize"); + // no need to exit? + } + if(fwrite(&nVertices, sizeof(int), 1, output) != 1) + { + printf("Error while writing file nVertices"); + exit(0); + } + if(nVertices >0) + { + if(fwrite(MOVT, sizeof(float)*3, nVertices, output) != nVertices) + { + printf("Error while writing file vectors"); + exit(0); + } + } + + nColTriangles = nTriangles; + } + else + { + char GRP[] = "GRP "; + fwrite(GRP,1,4,output); + int k = 0; + int moba_batch = moba_size/12; + MobaEx = new int[moba_batch*4]; + for(int i=8; i= 0) + check -= fwrite(MOVT+3*i, sizeof(float), 3, output); + + assert(check==0); + + delete [] MoviEx; + delete [] IndexRenum; + } + + //------LIQU------------------------ + if(LiquEx_size != 0) + { + int LIQU_h[] = {0x5551494C, sizeof(WMOLiquidHeader) + LiquEx_size + hlq->xtiles*hlq->ytiles};// "LIQU" + fwrite(LIQU_h, 4, 2, output); + + // according to WoW.Dev Wiki: + uint32 liquidEntry; + if (rootWMO->liquidType & 4) + liquidEntry = liquidType; + else if (liquidType == 15) + liquidEntry = 0; + else + liquidEntry = liquidType + 1; + // overwrite material type in header... + hlq->type = LiqType[liquidEntry]; + + /* std::ofstream llog("Buildings/liquid.log", ios_base::out | ios_base::app); + llog << filename; + llog << ":\nliquidEntry: " << liquidEntry << " type: " << hlq->type << " (root:" << rootWMO->liquidType << " group:" << liquidType << ")\n"; + llog.close(); */ + + fwrite(hlq, sizeof(WMOLiquidHeader), 1, output); + // only need height values, the other values are unknown anyway + for (uint32 i = 0; ixtiles*hlq->ytiles, output); + } + + return nColTriangles; +} + +WMOGroup::~WMOGroup() +{ + delete [] MOPY; + delete [] MOVI; + delete [] MOVT; + delete [] MOBA; + delete hlq; + delete [] LiquEx; + delete [] LiquBytes; +} + +WMOInstance::WMOInstance(MPQFile &f,const char* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile) +{ + pos = Vec3D(0,0,0); + + float ff[3]; + f.read(&id, 4); + f.read(ff,12); + pos = Vec3D(ff[0],ff[1],ff[2]); + f.read(ff,12); + rot = Vec3D(ff[0],ff[1],ff[2]); + f.read(ff,12); + pos2 = Vec3D(ff[0],ff[1],ff[2]); + f.read(ff,12); + pos3 = Vec3D(ff[0],ff[1],ff[2]); + f.read(&d2,4); + + uint16 trash,adtId; + f.read(&adtId,2); + f.read(&trash,2); + + //-----------add_in _dir_file---------------- + + char tempname[512]; + sprintf(tempname, "Buildings/%s", WmoInstName); + FILE *input; + input = fopen(tempname, "r+b"); + + if(!input) + { + printf("WMOInstance::WMOInstance: couldn't open %s\n", tempname); + return; + } + + fseek(input, 8, SEEK_SET); // get the correct no of vertices + int nVertices; + fread(&nVertices, sizeof (int), 1, input); + fclose(input); + + if(nVertices == 0) + return; + + float x,z; + x = pos.x; + z = pos.z; + if(x==0 && z == 0) + { + pos.x = 533.33333f*32; + pos.z = 533.33333f*32; + } + pos = fixCoords(pos); + pos2 = fixCoords(pos2); + pos3 = fixCoords(pos3); + + float scale = 1.0f; + uint32 flags = MOD_HAS_BOUND; + if(tileX == 65 && tileY == 65) flags |= MOD_WORLDSPAWN; + //write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, Bound_lo, Bound_hi, 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(&adtId, sizeof(uint16), 1, pDirfile); + fwrite(&id, sizeof(uint32), 1, pDirfile); + fwrite(&pos, sizeof(float), 3, pDirfile); + fwrite(&rot, sizeof(float), 3, pDirfile); + fwrite(&scale, sizeof(float), 1, pDirfile); + fwrite(&pos2, sizeof(float), 3, pDirfile); + fwrite(&pos3, sizeof(float), 3, pDirfile); + uint32 nlen=strlen(WmoInstName); + fwrite(&nlen, sizeof(uint32), 1, pDirfile); + fwrite(WmoInstName, sizeof(char), nlen, pDirfile); + + /* fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f 1.0 %d %d %d,%d %d\n", + MapName, + WmoInstName, + (float) x, (float) pos.y, (float) z, + (float) rot.x, (float) rot.y, (float) rot.z, + nVertices, + realx1, realy1, + realx2, realy2 + ); */ + + // fclose(dirfile); +} diff --git a/src/tools/vmap3_extractor/wmo.h b/src/tools/vmap3_extractor/wmo.h new file mode 100644 index 00000000000..12979bc13d9 --- /dev/null +++ b/src/tools/vmap3_extractor/wmo.h @@ -0,0 +1,118 @@ +#ifndef WMO_H +#define WMO_H +#define TILESIZE (533.33333f) +#define CHUNKSIZE ((TILESIZE) / 16.0f) + +#include +#include +#include "vec3d.h" +#include "loadlib/loadlib.h" + +// MOPY flags +#define WMO_MATERIAL_NOCAMCOLLIDE 0x01 +#define WMO_MATERIAL_DETAIL 0x02 +#define WMO_MATERIAL_NO_COLLISION 0x04 +#define WMO_MATERIAL_HINT 0x08 +#define WMO_MATERIAL_RENDER 0x10 +#define WMO_MATERIAL_COLLIDE_HIT 0x20 +#define WMO_MATERIAL_WALL_SURFACE 0x40 + +class WMOInstance; +class WMOManager; +class MPQFile; + +/* for whatever reason a certain company just can't stick to one coordinate system... */ +static inline Vec3D fixCoords(const Vec3D &v){ return Vec3D(v.z, v.x, v.y); } + +class WMORoot +{ +public: + uint32 nTextures, nGroups, nP, nLights, nModels, nDoodads, nDoodadSets, RootWMOID, liquidType; + unsigned int col; + float bbcorn1[3]; + float bbcorn2[3]; + + WMORoot(std::string &filename); + ~WMORoot(); + + bool open(); + bool ConvertToVMAPRootWmo(FILE *output); +private: + std::string filename; + char outfilename; +}; + +struct WMOLiquidHeader +{ + int xverts, yverts, xtiles, ytiles; + float pos_x; + float pos_y; + float pos_z; + short type; +}; + +struct WMOLiquidVert +{ + uint16 unk1; + uint16 unk2; + float height; +}; + +class WMOGroup +{ +public: + // MOGP + int groupName, descGroupName, mogpFlags; + float bbcorn1[3]; + float bbcorn2[3]; + uint16 moprIdx; + uint16 moprNItems; + uint16 nBatchA; + uint16 nBatchB; + uint32 nBatchC, fogIdx, liquidType, groupWMOID; + + int mopy_size,moba_size; + int LiquEx_size; + unsigned int nVertices; // number when loaded + int nTriangles; // number when loaded + char *MOPY; + uint16 *MOVI; + uint16 *MoviEx; + float *MOVT; + uint16 *MOBA; + int *MobaEx; + WMOLiquidHeader *hlq; + WMOLiquidVert *LiquEx; + char *LiquBytes; + uint32 liquflags; + + WMOGroup(std::string &filename); + ~WMOGroup(); + + bool open(); + int ConvertToVMAPGroupWmo(FILE *output, WMORoot *rootWMO, bool pPreciseVectorData); + +private: + std::string filename; + char outfilename; +}; + +class WMOInstance +{ + static std::set ids; +public: + std::string MapName; + int currx; + int curry; + WMOGroup *wmo; + Vec3D pos; + Vec3D pos2, pos3, rot; + uint32 indx,id, d2, d3; + int doodadset; + + WMOInstance(MPQFile &f,const char* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile); + + static void reset(); +}; + +#endif -- cgit v1.2.3