diff --git a/contrib/vmap_extract_assembler_bin/vmapExtractor3.exe b/contrib/vmap_extract_assembler_bin/vmapExtractor3.exe new file mode 100644 index 000000000..db9552732 Binary files /dev/null and b/contrib/vmap_extract_assembler_bin/vmapExtractor3.exe differ diff --git a/contrib/vmap_extractor_v2/.gitignore b/contrib/vmap_extractor_v2/.gitignore index 69d56e264..6128066ce 100644 --- a/contrib/vmap_extractor_v2/.gitignore +++ b/contrib/vmap_extractor_v2/.gitignore @@ -10,7 +10,11 @@ # MaNGOS generated files at Windows build # -*.ncb -*.suo -*.user -bin \ No newline at end of file +bin + +# CMake files + +CMakeFiles +CMakeCache.txt +cmake_install.cmake + diff --git a/contrib/vmap_extractor_v2/CMakeLists.txt b/contrib/vmap_extractor_v2/CMakeLists.txt new file mode 100644 index 000000000..8e8f6e362 --- /dev/null +++ b/contrib/vmap_extractor_v2/CMakeLists.txt @@ -0,0 +1,25 @@ +# 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_VMAP_EXTRACT_IO) + + +# 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(../../dep/libmpq) + +add_subdirectory(vmapextract) diff --git a/contrib/vmap_extractor_v2/README b/contrib/vmap_extractor_v2/README new file mode 100644 index 000000000..696657d05 --- /dev/null +++ b/contrib/vmap_extractor_v2/README @@ -0,0 +1,42 @@ +Linux: + +1. Building + + Because vmap_extractor depends on libmpq for reading mpq files, you will have + to build libmpq prior to vmap_extractor. Therefore cd to dep/libmpq and execute: + + $ ./autogen.sh + $ ./configure + $ make + + After that, cd to contrib/vmap_extractor_v2/ and execute: + + $ cmake . + $ make + + You should now have an executable file at vmapextract/vmapextractor + +2. Extracting + + Use the created executable to extract model information. Change the data path if + needed. + + $ vmapextract/vmapextractor -d /mnt/windows/games/wow/Data/ + + Resulting files will be in ./Buildings + +########################### +Windows: + +1. Building + + Just buid the solution in contrib\vmap_extractor_v2\win + Resulting binaries will be in contrib\vmap_extractor_v2\bin\$(PlatformName)_$(ConfigurationName) + +2. Extracting + + Use the created executable (from command prompt) to extract model information. + It should find the data path for your client installation through the windows registry, + but the data path can be specified with the -d option. + + Resulting files will be in .\Buildings diff --git a/contrib/vmap_extractor_v2/vmapExtractor_VC80.sln b/contrib/vmap_extractor_v2/vmapExtractor_VC80.sln deleted file mode 100644 index cc24730b1..000000000 --- a/contrib/vmap_extractor_v2/vmapExtractor_VC80.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual C++ Express 2005 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmapExtractor", "vmapExtractor_VC80.vcproj", "{87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug Ansi Static|Win32 = Debug Ansi Static|Win32 - Release Ansi Static|Win32 = Release Ansi Static|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Debug Ansi Static|Win32.ActiveCfg = Debug Ansi Static|Win32 - {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Debug Ansi Static|Win32.Build.0 = Debug Ansi Static|Win32 - {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Release Ansi Static|Win32.ActiveCfg = Release Ansi Static|Win32 - {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Release Ansi Static|Win32.Build.0 = Release Ansi Static|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/contrib/vmap_extractor_v2/vmapExtractor_VC80.vcproj b/contrib/vmap_extractor_v2/vmapExtractor_VC80.vcproj deleted file mode 100644 index 5d8cdea90..000000000 --- a/contrib/vmap_extractor_v2/vmapExtractor_VC80.vcproj +++ /dev/null @@ -1,1000 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/vmap_extractor_v2/vmapExtractor_VC90.sln b/contrib/vmap_extractor_v2/vmapExtractor_VC90.sln deleted file mode 100644 index 82d3e1509..000000000 --- a/contrib/vmap_extractor_v2/vmapExtractor_VC90.sln +++ /dev/null @@ -1,19 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmapExtractor", "vmapExtractor_VC90.vcproj", "{87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug Ansi Static|Win32 = Debug Ansi Static|Win32 - Release Ansi Static|Win32 = Release Ansi Static|Win32 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Debug Ansi Static|Win32.ActiveCfg = Debug Ansi Static|Win32 - {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Debug Ansi Static|Win32.Build.0 = Debug Ansi Static|Win32 - {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Release Ansi Static|Win32.ActiveCfg = Release Ansi Static|Win32 - {87335BBF-5DA8-4FEC-A51E-1FB948F2FFE9}.Release Ansi Static|Win32.Build.0 = Release Ansi Static|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/contrib/vmap_extractor_v2/vmapExtractor_VC90.vcproj b/contrib/vmap_extractor_v2/vmapExtractor_VC90.vcproj deleted file mode 100644 index ed75735c4..000000000 --- a/contrib/vmap_extractor_v2/vmapExtractor_VC90.vcproj +++ /dev/null @@ -1,999 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/vmap_extractor_v2/vmapextract/.gitignore b/contrib/vmap_extractor_v2/vmapextract/.gitignore new file mode 100644 index 000000000..79b30acc5 --- /dev/null +++ b/contrib/vmap_extractor_v2/vmapextract/.gitignore @@ -0,0 +1,18 @@ +# +# NOTE! Don't add files that are generated in specific +# subdirectories here. Add them in the ".gitignore" file +# in that subdirectory instead. +# +# NOTE! Please use 'git-ls-files -i --exclude-standard' +# command after changing this file, to see if there are +# any tracked files which get ignored after the change. +# +# MaNGOS generated files at Windows build +# + +# CMake files + +CMakeFiles +CMakeCache.txt +cmake_install.cmake + diff --git a/contrib/vmap_extractor_v2/vmapextract/CMakeLists.txt b/contrib/vmap_extractor_v2/vmapextract/CMakeLists.txt new file mode 100644 index 000000000..473bd5085 --- /dev/null +++ b/contrib/vmap_extractor_v2/vmapextract/CMakeLists.txt @@ -0,0 +1,16 @@ +# 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} ../../../dep/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 libmpq.a bz2 z) diff --git a/contrib/vmap_extractor_v2/vmapextract/adtfile.cpp b/contrib/vmap_extractor_v2/vmapextract/adtfile.cpp index 49717c047..314255d3a 100644 --- a/contrib/vmap_extractor_v2/vmapextract/adtfile.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/adtfile.cpp @@ -1,6 +1,12 @@ +#include "vmapexport.h" #include "adtfile.h" #include +#include + +#ifdef WIN32 +#define snprintf _snprintf +#endif char * GetPlainName(char * FileName) { @@ -23,6 +29,9 @@ void fixnamen(char *name, size_t len) name[i] &= ~0x20; } } + //extension in lowercase + for(size_t i=len-3; i= 3.1.0 ADT MMDX section store filename.m2 filenames for corresponded .m2 file // nothing do - char szLocalFile[MAX_PATH]; - sprintf(szLocalFile, ".\\buildings\\%s", s); + char szLocalFile[1024]; + snprintf(szLocalFile, 1024, "%s/%s", szWorkDirWmo, s); FILE * output = fopen(szLocalFile,"rb"); if(!output) { - Model * m2 = new Model(path); - if(m2->open()) - m2->ConvertToVMAPModel(szLocalFile); - delete m2; + Model m2(path); + if(m2.open()) + m2.ConvertToVMAPModel(szLocalFile); } else fclose(output); @@ -161,9 +169,9 @@ bool ADTFile::init(char *map_id) nMDX = (int)size / 36; for (int i=0; i DBCFile::DBCFile(const std::string &filename) : filename(filename) { diff --git a/contrib/vmap_extractor_v2/vmapextract/dbcfile.h b/contrib/vmap_extractor_v2/vmapextract/dbcfile.h index 002e7eeeb..7d23f2d1e 100644 --- a/contrib/vmap_extractor_v2/vmapextract/dbcfile.h +++ b/contrib/vmap_extractor_v2/vmapextract/dbcfile.h @@ -1,10 +1,8 @@ #ifndef DBCFILE_H #define DBCFILE_H -#define __STORMLIB_SELF__ #include #include -#include "Stormlib.h" class DBCFile { @@ -80,8 +78,8 @@ public: } private: Record(DBCFile &file, unsigned char *offset): file(file), offset(offset) {} - unsigned char *offset; DBCFile &file; + unsigned char *offset; friend class DBCFile; friend class Iterator; diff --git a/contrib/vmap_extractor_v2/vmapextract/loadlib/loadlib.h b/contrib/vmap_extractor_v2/vmapextract/loadlib/loadlib.h new file mode 100644 index 000000000..537317534 --- /dev/null +++ b/contrib/vmap_extractor_v2/vmapextract/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/contrib/vmap_extractor_v2/vmapextract/model.cpp b/contrib/vmap_extractor_v2/vmapextract/model.cpp index 9605e3320..a2493f7e5 100644 --- a/contrib/vmap_extractor_v2/vmapextract/model.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/model.cpp @@ -1,6 +1,10 @@ +#include "vmapexport.h" #include "model.h" +#include "wmo.h" +#include "mpq_libmpq04.h" #include #include +#include Model::Model(std::string &filename) : filename(filename) { @@ -35,8 +39,8 @@ bool Model::open() indices = new uint16[header.nBoundingTriangles]; f.read(indices,header.nBoundingTriangles*2); f.close(); - } - else + } + else { //printf("not included %s\n", filename.c_str()); f.close(); @@ -47,20 +51,22 @@ bool Model::open() bool Model::ConvertToVMAPModel(char * outfilename) { - int N[] = {0x00000000}; + int N[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; FILE * output=fopen(outfilename,"wb"); if(!output) { printf("Can't create the output file '%s'\n",outfilename); return false; } - fwrite("VMAP002",8,1,output); + fwrite("VMAP003",8,1,output); uint32 nVertices = 0; nVertices = header.nBoundingVertices; fwrite(&nVertices, sizeof(int), 1, output); uint32 nofgroups = 1; fwrite(&nofgroups,sizeof(uint32), 1, output); - fwrite(N,4,1,output); + fwrite(N,4*3,1,output);// rootwmoid, flags, groupid + fwrite(N,sizeof(float),3*2,output);//bbox, only needed for WMO currently + fwrite(N,4,1,output);// liquidflags fwrite("GRP ",4,1,output); uint32 branches = 1; int wsize; @@ -115,12 +121,12 @@ Vec3D fixCoordSystem2(Vec3D v) return Vec3D(v.x, v.z, v.y); } -ModelInstance::ModelInstance(MPQFile &f,const char* ModelInstName,const char*MapName, FILE *pDirfile) +ModelInstance::ModelInstance(MPQFile &f,const char* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile) { float ff[3]; - f.read(&d1, 4); + f.read(&id, 4); f.read(ff,12); - pos = Vec3D(ff[0],ff[1],ff[2]); + pos = fixCoords(Vec3D(ff[0],ff[1],ff[2])); f.read(ff,12); rot = Vec3D(ff[0],ff[1],ff[2]); f.read(&scale,4); @@ -128,12 +134,15 @@ ModelInstance::ModelInstance(MPQFile &f,const char* ModelInstName,const char*Map sc = scale / 1024.0f; char tempname[512]; - sprintf(tempname, ".\\buildings\\%s", ModelInstName); + sprintf(tempname, "%s/%s", szWorkDirWmo, ModelInstName); FILE *input; input = fopen(tempname, "r+b"); if(!input) + { + //printf("ModelInstance::ModelInstance couldn't open %s\n", tempname); return; + } fseek(input, 8, SEEK_SET); // get the correct no of vertices int nVertices; @@ -143,22 +152,36 @@ ModelInstance::ModelInstance(MPQFile &f,const char* ModelInstName,const char*Map if(nVertices == 0) return; - if(pDirfile) - { - int realx1 = (int) ((float) pos.x / 533.333333f); - int realy1 = (int) ((float) pos.z / 533.333333f); - int realx2 = (int) ((float) pos.x / 533.333333f); - int realy2 = (int) ((float) pos.z / 533.333333f); + uint16 adtId = 0;// not used for models + uint32 flags = MOD_M2; + if(tileX == 65 && tileY == 65) flags |= MOD_WORLDSPAWN; + //write mapID, tileX, tileY, Flags, ID, Pos, Rot, Scale, name + fwrite(&mapID, sizeof(uint32), 1, pDirfile); + fwrite(&tileX, sizeof(uint32), 1, pDirfile); + fwrite(&tileY, sizeof(uint32), 1, pDirfile); + fwrite(&flags, sizeof(uint32), 1, pDirfile); + fwrite(&adtId, sizeof(uint16), 1, pDirfile); + fwrite(&id, sizeof(uint32), 1, pDirfile); + fwrite(&pos, sizeof(float), 3, pDirfile); + fwrite(&rot, sizeof(float), 3, pDirfile); + fwrite(&sc, sizeof(float), 1, pDirfile); + uint32 nlen=strlen(ModelInstName); + fwrite(&nlen, sizeof(uint32), 1, pDirfile); + fwrite(ModelInstName, sizeof(char), nlen, pDirfile); - fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f %f %d %d %d,%d %d\n", - MapName, - ModelInstName, - (float) pos.x, (float) pos.y, (float) pos.z, - (float) rot.x, (float) rot.y, (float) rot.z, - sc, - nVertices, - realx1, realy1, - realx2, realy2 - ); - } + /* int realx1 = (int) ((float) pos.x / 533.333333f); + int realy1 = (int) ((float) pos.z / 533.333333f); + int realx2 = (int) ((float) pos.x / 533.333333f); + int realy2 = (int) ((float) pos.z / 533.333333f); + + fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f %f %d %d %d,%d %d\n", + MapName, + ModelInstName, + (float) pos.x, (float) pos.y, (float) pos.z, + (float) rot.x, (float) rot.y, (float) rot.z, + sc, + nVertices, + realx1, realy1, + realx2, realy2 + ); */ } diff --git a/contrib/vmap_extractor_v2/vmapextract/model.h b/contrib/vmap_extractor_v2/vmapextract/model.h index 2bcb20b11..d1be46f3c 100644 --- a/contrib/vmap_extractor_v2/vmapextract/model.h +++ b/contrib/vmap_extractor_v2/vmapextract/model.h @@ -1,13 +1,15 @@ #ifndef MODEL_H #define MODEL_H +#include "loadlib/loadlib.h" #include "vec3d.h" -#include "mpq.h" +//#include "mpq.h" #include "modelheaders.h" #include class Model; class WMOInstance; +class MPQFile; Vec3D fixCoordSystem(Vec3D v); @@ -38,13 +40,13 @@ class ModelInstance public: Model *model; - int id; + uint32 id; Vec3D pos, rot; unsigned int d1, scale; float w,sc; ModelInstance() {} - ModelInstance(MPQFile &f,const char* ModelInstName,const char*MapName, FILE *pDirfile); + ModelInstance(MPQFile &f,const char* ModelInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile); }; diff --git a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h index 445ab3843..776a981eb 100644 --- a/contrib/vmap_extractor_v2/vmapextract/modelheaders.h +++ b/contrib/vmap_extractor_v2/vmapextract/modelheaders.h @@ -1,12 +1,12 @@ #ifndef MODELHEADERS_H #define MODELHEADERS_H -typedef unsigned char uint8; +/* typedef unsigned char uint8; typedef char int8; typedef unsigned short uint16; typedef short int16; typedef unsigned int uint32; -typedef int int32; +typedef int int32; */ #pragma pack(push,1) diff --git a/contrib/vmap_extractor_v2/vmapextract/mpq.cpp b/contrib/vmap_extractor_v2/vmapextract/mpq.cpp deleted file mode 100644 index 0d72f06a7..000000000 --- a/contrib/vmap_extractor_v2/vmapextract/mpq.cpp +++ /dev/null @@ -1,143 +0,0 @@ -#include "mpq.h" -//#include -#include "Stormlib.h" -#define __STORMLIB_SELF__ - -MPQArchiveSet gOpenArchives; - -//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx -MPQArchive::MPQArchive(const char* filename) -{ - BOOL succ = SFileOpenArchive(filename, 0, 0,&hMPQ); - if (succ) - printf("Opening %s\n", filename); - else - printf("Error!!!Not open archive %s\n", filename); -} - -void MPQArchive::close() -{ - SFileCloseArchive(hMPQ); -} - -bool MPQArchiveSet::Open( std::vector const& archiveNames ) -{ - for (size_t i=0; i < archiveNames.size(); ++i) - { - MPQArchive mpqarch(archiveNames[i].c_str()); - if(mpqarch.isOpen()) - archives.push_back(mpqarch); - } - - return !archives.empty(); -} - -MPQArchiveSet::~MPQArchiveSet() -{ - // close archives - for (ArchiveSet::iterator ar_itr = archives.begin(); ar_itr != archives.end(); ++ar_itr) - ar_itr->close(); -} - -MPQFile::MPQFile(const char* filename): - eof(false), - buffer(0), - pointer(0), - size(0) -{ - for(ArchiveSet::const_iterator i=gOpenArchives.archives.begin(); i!=gOpenArchives.archives.end();++i) - { - HANDLE hFile = ""; - hMPQ = i->hMPQ; - BOOL succ = SFileOpenFileEx(hMPQ,filename,0, &hFile); - if (succ) - { - DWORD s = SFileGetFileSize(hFile, 0); - if (!s) - { - eof = true; - buffer = 0; - return; - } - size = (size_t)s; - buffer = new char[s]; - SFileReadFile(hFile, buffer, s, 0, 0); - SFileCloseFile(hFile); - - eof = false; - return; - } - } - - eof = true; - buffer = 0; -} - -MPQFile::~MPQFile() -{ - close(); -} - -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; -} - -bool MPQFile::isEof() -{ - return eof; -} - -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; -} - -size_t MPQFile::getSize() -{ - return size; -} - -size_t MPQFile::getPos() -{ - return pointer; -} - -char* MPQFile::getBuffer() -{ - return buffer; -} - -char* MPQFile::getPointer() -{ - return buffer + pointer; -} diff --git a/contrib/vmap_extractor_v2/vmapextract/mpq.h b/contrib/vmap_extractor_v2/vmapextract/mpq.h deleted file mode 100644 index 0d1d14851..000000000 --- a/contrib/vmap_extractor_v2/vmapextract/mpq.h +++ /dev/null @@ -1,80 +0,0 @@ -#define _CRT_SECURE_NO_DEPRECATE - -#ifndef MPQ_H -#define MPQ_H - -#define __STORMLIB_SELF__ - -#include -#include -#include -#include -#include "Stormlib.h" - -using namespace std; - -typedef unsigned int uint32; - -class MPQArchive -{ - public: - HANDLE hMPQ; - MPQArchive(const char* filename); - void close(); - bool isOpen() const { return hMPQ != 0; } -}; - -typedef std::vector ArchiveSet; - -class MPQArchiveSet -{ - public: - MPQArchiveSet() {} - ~MPQArchiveSet(); - - bool Open(std::vector const& archiveNames); - - ArchiveSet archives; -}; - -extern MPQArchiveSet gOpenArchives; - -class MPQFile -{ - HANDLE hFile; - HANDLE hMPQ; - bool eof; - char *buffer; - size_t pointer, - size; - - // disable copying - //MPQFile(const MPQFile &f) {} - //void operator=(const MPQFile &f) {} - -public: - MPQFile(const char* filename); - ~MPQFile(); - size_t read(void* dest, size_t bytes); - size_t getSize(); - size_t getPos(); - char* getBuffer(); - char* getPointer(); - bool isEof(); - 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/contrib/vmap_extractor_v2/vmapextract/mpq_libmpq.cpp b/contrib/vmap_extractor_v2/vmapextract/mpq_libmpq.cpp new file mode 100644 index 000000000..528b9679a --- /dev/null +++ b/contrib/vmap_extractor_v2/vmapextract/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("info: file %s has size %d; considered dummy file.\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/contrib/vmap_extractor_v2/vmapextract/mpq_libmpq04.h b/contrib/vmap_extractor_v2/vmapextract/mpq_libmpq04.h new file mode 100644 index 000000000..ccbfe37cb --- /dev/null +++ b/contrib/vmap_extractor_v2/vmapextract/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/contrib/vmap_extractor_v2/vmapextract/vec3d.h b/contrib/vmap_extractor_v2/vmapextract/vec3d.h index 405135521..d2569bc13 100644 --- a/contrib/vmap_extractor_v2/vmapextract/vec3d.h +++ b/contrib/vmap_extractor_v2/vmapextract/vec3d.h @@ -106,6 +106,12 @@ public: 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*() { diff --git a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp index a96a404f6..a11d05e37 100644 --- a/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/vmapexport.cpp @@ -1,38 +1,33 @@ -/*****************************************************************************/ -/* 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 +#include +#include #include #include +#include +#ifdef WIN32 + #include + #include + #include + #define mkdir _mkdir +#else + #include +#endif -#define __STORMLIB_SELF__ // Don't use StormLib.lib -#include "StormLib.h" +#undef min +#undef max -#pragma warning(disable : 4505) -#pragma comment(lib, "Winmm.lib") +//#pragma warning(disable : 4505) +//#pragma comment(lib, "Winmm.lib") + +#include //From Extractor #include "adtfile.h" #include "wdtfile.h" #include "dbcfile.h" -#include "mpq.h" #include "wmo.h" +#include "mpq_libmpq04.h" //------------------------------------------------------------------------------ // Defines @@ -40,10 +35,9 @@ #define MPQ_BLOCK_SIZE 0x1000 //----------------------------------------------------------------------------- -// from extractor -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned int uint32; + +extern ArchiveSet gOpenArchives; + typedef struct { char name[64]; @@ -51,26 +45,17 @@ typedef struct }map_id; map_id * map_ids; -uint16 * areas; -uint16 *areamax; +uint16 *LiqType = 0; uint32 map_count; char output_path[128]="."; char input_path[1024]="."; bool hasInputPathParam = false; -char tmp[512]; bool preciseVectorData = false; -//char gamepath[1024]; - -//Convert function -//bool ConvertADT(char*,char*); // Constants //static const char * szWorkDirMaps = ".\\Maps"; -static const char * szWorkDirWmo = ".\\buildings"; - -//static LPBYTE pbBuffer1 = NULL; -//static LPBYTE pbBuffer2 = NULL; +const char * szWorkDirWmo = "./Buildings"; // Local testing functions @@ -79,6 +64,15 @@ 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; @@ -88,56 +82,55 @@ static const char * GetPlainName(const char * szFileName) return szFileName; } -static void ShowProcessedFile(const char * szFileName) +// copied from contrib/extractor/System.cpp +void ReadLiquidTypeTableDBC() { -/* not truncate file names in output - char szLine[80]; - size_t nLength = strlen(szFileName); + printf("Read LiquidType.dbc file..."); + DBCFile dbc("DBFilesClient\\LiquidType.dbc"); + if(!dbc.open()) + { + printf("Fatal error: Invalid LiquidType.dbc file format!\n"); + exit(1); + } - memset(szLine, 0x20, sizeof(szLine)); - szLine[sizeof(szLine)-1] = 0; + 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)); - if(nLength > sizeof(szLine)-1) - nLength = sizeof(szLine)-1; - memcpy(szLine, szFileName, nLength); - printf("\r%s\n", szLine); -*/ - printf("\r%s\n", szFileName); + 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", (unsigned int)LiqType_count); } int ExtractWmo() { - char* szListFile = ""; - char szLocalFile[MAX_PATH] = ""; - BOOL bResult = FALSE; + char szLocalFile[1024] = ""; + bool success=true; //const char* ParsArchiveNames[] = {"patch-2.MPQ", "patch.MPQ", "common.MPQ", "expansion.MPQ"}; - int nError = ERROR_SUCCESS; - if(szListFile == NULL || *szListFile == 0) - szListFile = NULL; - - for (ArchiveSet::const_iterator ar_itr = gOpenArchives.archives.begin(); ar_itr != gOpenArchives.archives.end(); ++ar_itr) + for (ArchiveSet::const_iterator ar_itr = gOpenArchives.begin(); ar_itr != gOpenArchives.end() && success; ++ar_itr) { - // Copy files from archive - if(nError == ERROR_SUCCESS) - { - SFILE_FIND_DATA wf; - HANDLE hFind = SFileFindFirstFile(ar_itr->hMPQ,"*.wmo*", &wf, szListFile); - bResult = TRUE; + vector filelist; - while(hFind != NULL && bResult == TRUE) + (*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) { - ShowProcessedFile(wf.cFileName); - SFileSetLocale(wf.lcLocale); - sprintf(szLocalFile, "%s\\%s", szWorkDirWmo, GetPlainName(wf.cFileName)); + // 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(wf.cFileName),0x5f); + const char * rchr = strrchr(GetPlainName(fname->c_str()),0x5f); if(rchr != NULL) { char cpy[4]; @@ -151,67 +144,67 @@ int ExtractWmo() } if(p != 3) { - //printf("RootWmo!\n"); - string s = wf.cFileName; - WMORoot * froot = new WMORoot(s); + std::cout << "Extracting " << *fname << std::endl; + WMORoot * froot = new WMORoot(*fname); if(!froot->open()) { - printf("Not open RootWmo!!!\n"); - bResult = SFileFindNextFile(hFind, &wf); + 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 (int i=0; inGroups; ++i) + for (uint32 i=0; inGroups; ++i) { - char temp[MAX_PATH]; - strcpy(temp, wf.cFileName); - temp[strlen(wf.cFileName)-4] = 0; - char groupFileName[MAX_PATH]; + char temp[1024]; + strcpy(temp, fname->c_str()); + temp[fname->length()-4] = 0; + char groupFileName[1024]; sprintf(groupFileName,"%s_%03d.wmo",temp, i); - printf("%s\n",groupFileName); - //printf("GroupWmo!\n"); + //printf("Trying to open groupfile %s\n",groupFileName); string s = groupFileName; WMOGroup * fgroup = new WMOGroup(s); if(!fgroup->open()) { - printf("Not all open Group file for: %s\n",GetPlainName(wf.cFileName)); - bResult = SFileFindNextFile(hFind, &wf); + printf("Could not open all Group file for: %s\n",GetPlainName(fname->c_str())); + file_ok=false; break; } - Wmo_nVertices += fgroup->ConvertToVMAPGroupWmo(output, preciseVectorData); + + 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); } - wf.dwFileFlags &= ~MPQ_FILE_HAS_EXTRA; - wf.dwFileFlags &= ~MPQ_FILE_EXISTS; - // Find the next file - bResult = SFileFindNextFile(hFind, &wf); } // Delete the extracted file in the case of an error - if(nError != ERROR_SUCCESS) - DeleteFile(szLocalFile); - // Close the search handle - if(hFind != NULL) - SFileFindClose(hFind); + if(!file_ok) + remove(szLocalFile); } } - if(nError == ERROR_SUCCESS) - printf("\nExtract wmo complete (No errors)\n"); + if(success) + printf("\nExtract wmo complete (No (fatal) errors)\n"); - return nError; + return success; } void ExtractMapsFromMpq() @@ -221,55 +214,34 @@ void ExtractMapsFromMpq() void ParsMapFiles() { char fn[512]; - char id_filename[64]; + //char id_filename[64]; char id[10]; for (unsigned int i=0; iinit(id_filename); + //sprintf(id_filename,"%02u %02u %03u",x,y,map_ids[i].id);//!!!!!!!!! + ADT->init(map_ids[i].id, x, y); delete ADT; } } + printf("#"); + fflush(stdout); } + printf("]\n"); } } } -#if 0 -void ParsMapFiles() -{ - char fn[512]; - for (unsigned int i=0; iinit(); - delete ADT; - } - } - } - } - } -} -#endif void getGamePath() { @@ -289,7 +261,7 @@ void getGamePath() } strcat(input_path,"Data\\"); #else - strcpy(input_path,"data/"); + strcpy(input_path,"Data/"); #endif } @@ -297,38 +269,29 @@ bool scan_patches(char* scanmatch, std::vector& pArchiveNames) { int i; char path[512]; - std::list matches; - - WIN32_FIND_DATA ffData; - HANDLE hFind; for (i = 1; i <= 99; i++) { if (i != 1) { - sprintf(path, "%s-%d.mpq", scanmatch, i); + sprintf(path, "%s-%d.MPQ", scanmatch, i); } else { - sprintf(path, "%s.mpq", scanmatch); + 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); } - - hFind = INVALID_HANDLE_VALUE; - hFind = FindFirstFile(path, &ffData); - if (hFind == INVALID_HANDLE_VALUE) break; - FindClose(hFind); - - matches.push_back(path); } - matches.reverse(); - for (std::list::iterator i = matches.begin(); i != matches.end(); ++i) - { - pArchiveNames.push_back(i->c_str()); - } - - printf("\n"); - return(true); } @@ -340,96 +303,75 @@ bool fillArchiveNameVector(std::vector& pArchiveNames) printf("\nGame path: %s\n", input_path); char path[512]; - std::vector locales; + string in_path(input_path); + std::vector locales, searchLocales; - // scan game directories - WIN32_FIND_DATA ffData; - HANDLE hFind; - DWORD dwError; + 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"); - // first, scan for locales (4-letter directories) - printf("Scanning for locales.\n"); - sprintf(path, "%s*.*", input_path); - hFind = INVALID_HANDLE_VALUE; - hFind = FindFirstFile(path, &ffData); - if (hFind == INVALID_HANDLE_VALUE) + for (std::vector::iterator i = searchLocales.begin(); i != searchLocales.end(); ++i) { - printf("\nCould not open data directory for reading. Aborting.\n"); - return(false); - } - do - { - if (ffData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - { - if (ffData.cFileName[0] != '.') - { - if (strlen(ffData.cFileName) == 4) - { - printf("Found locale: %s\n", ffData.cFileName); - locales.push_back(ffData.cFileName); - } - } - } - } while (FindNextFile(hFind, &ffData) != 0); - dwError = GetLastError(); - FindClose(hFind); - if (dwError != ERROR_NO_MORE_FILES) - { - printf("\nError reading data directory while scanning locales. Aborting.\n"); - return(false); + 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"); - if (locales.size() == 0) + // 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) { - printf("Sorry, no locales found. Aborting.\n"); - return(false); + 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("Loading patch levels from data directory.\n"); + 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("Loading patch levels from locale directories.\n"); + 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)) return(false); + sprintf(path, "%s%s/patch-%s", input_path, i->c_str(), i->c_str()); + if(scan_patches(path, pArchiveNames)) + foundOne = true; } - // open expansion and common files - printf("Opening data files from data directory.\n"); - sprintf(path, "%slichking.mpq", input_path); - pArchiveNames.push_back(path); - sprintf(path, "%scommon-2.mpq", input_path); - pArchiveNames.push_back(path); - sprintf(path, "%sexpansion.mpq", input_path); - pArchiveNames.push_back(path); - sprintf(path, "%scommon.mpq", input_path); - pArchiveNames.push_back(path); printf("\n"); - // open locale expansion and common files - printf("Opening data files from locale directories.\n"); - for (std::vector::iterator i = locales.begin(); i != locales.end(); ++i) + if(!foundOne) { - printf("Locale: %s\n", i->c_str()); - sprintf(path, "%s%s\\lichking-locale-%s.mpq", input_path, i->c_str(), i->c_str()); - pArchiveNames.push_back(path); - sprintf(path, "%s%s\\expansion-locale-%s.mpq", input_path, i->c_str(), i->c_str()); - pArchiveNames.push_back(path); - sprintf(path, "%s%s\\locale-%s.mpq", input_path, i->c_str(), i->c_str()); - pArchiveNames.push_back(path); - printf("\n"); + printf("no locale found\n"); + return false; } + return true; } -bool processArgv(int argc, char ** argv, char*versionString) +bool processArgv(int argc, char ** argv, const char *versionString) { bool result = true; hasInputPathParam = false; @@ -448,7 +390,7 @@ bool processArgv(int argc, char ** argv, char*versionString) hasInputPathParam = true; strcpy(input_path, argv[i+1]); if (input_path[strlen(input_path) - 1] != '\\' || input_path[strlen(input_path) - 1] != '/') - strcat(input_path, "\\"); + strcat(input_path, "/"); ++i; } else @@ -484,7 +426,7 @@ bool processArgv(int argc, char ** argv, char*versionString) //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Main -// +// // The program must be run with two command line arguments // // Arg1 - The source MPQ name (for testing reading and file find) @@ -493,52 +435,63 @@ bool processArgv(int argc, char ** argv, char*versionString) int main(int argc, char ** argv) { - //char tmp[512]; -// FILE* pDatei; -// char tmp[512]; -// char tmp1[512]; - //char tmp2[512]; -// char tmp3[512]; -// char tmp4[512]; -// char szMpqName[MAX_PATH] = ""; -// char szListFile[MAX_PATH] = ""; - int nError = ERROR_SUCCESS; - char *versionString = "V2.4 2007_07_12"; + bool success=true; + const char *versionString = "V2.90 2010_05"; // Use command line arguments, when some if(!processArgv(argc, argv, versionString)) return 1; + // some simple check if working dir is dirty + else + { + std::string sdir = std::string(szWorkDirWmo) + "/dir"; + std::string sdir_bin = std::string(szWorkDirWmo) + "/dir_bin"; + struct stat status; + if (!stat(sdir.c_str(), &status) || !stat(sdir_bin.c_str(), &status)) + { + printf("Your output directory seems to be polluted, please use an empty directory!\n"); + printf(""); + char garbage[2]; + scanf("%c", garbage); + return 1; + } + } + printf("Extract %s. Beginning work ....\n",versionString); - // Set the lowest priority to allow running in the background - SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Create the working directory - if(nError == ERROR_SUCCESS) - { - //if(!CreateDirectory(szWorkDirMaps, NULL)) - // nError = GetLastError(); - if(!CreateDirectory(szWorkDirWmo, NULL)) - nError = GetLastError(); - if(nError == ERROR_ALREADY_EXISTS) - nError = ERROR_SUCCESS; - } + if(mkdir(szWorkDirWmo +#ifdef __linux__ + , 0711 +#endif + )) + success = (errno == EEXIST); // prepare archive name list std::vector archiveNames; fillArchiveNameVector(archiveNames); - if(!gOpenArchives.Open(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 - ExtractWmo(); + if(success) + success = ExtractWmo(); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //map.dbc - if(nError == ERROR_SUCCESS) + if(success) { DBCFile * dbc = new DBCFile("DBFilesClient\\Map.dbc"); if(!dbc->open()) @@ -556,18 +509,21 @@ int main(int argc, char ** argv) printf("Map - %s\n",map_ids[x].name); } + delete dbc; ParsMapFiles(); delete [] map_ids; - nError = ERROR_SUCCESS; + //nError = ERROR_SUCCESS; } clreol(); - if(nError != ERROR_SUCCESS) + if(!success) { printf("ERROR: Extract %s. Work NOT complete.\n Precise vector data=%d.\nPress any key.\n",versionString, preciseVectorData); - _getch(); + getchar(); } - printf("Extract %s. Work complete. No errors.",versionString); + printf("Extract %s. Work complete. No errors.\n",versionString); + delete [] LiqType; + return 0; } diff --git a/contrib/vmap_extractor_v2/vmapextract/vmapexport.h b/contrib/vmap_extractor_v2/vmapextract/vmapexport.h new file mode 100644 index 000000000..fa9a609ab --- /dev/null +++ b/contrib/vmap_extractor_v2/vmapextract/vmapexport.h @@ -0,0 +1,13 @@ +#ifndef VMAPEXPORT_H +#define VMAPEXPORT_H + +enum ModelFlags +{ + MOD_M2 = 1, + MOD_WORLDSPAWN = 1<<1, + MOD_HAS_BOUND = 1<<2 +}; + +extern const char * szWorkDirWmo; + +#endif diff --git a/contrib/vmap_extractor_v2/vmapextract/wdtfile.cpp b/contrib/vmap_extractor_v2/vmapextract/wdtfile.cpp index 697f9b33b..cd24ef034 100644 --- a/contrib/vmap_extractor_v2/vmapextract/wdtfile.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/wdtfile.cpp @@ -1,7 +1,7 @@ -#define __STORMLIB_SELF__ - +#include "vmapexport.h" #include "wdtfile.h" #include "adtfile.h" +#include char * wdtGetPlainName(char * FileName) { @@ -17,7 +17,7 @@ WDTFile::WDTFile(char* file_name, char* file_name1):WDT(file_name) filename.append(file_name1,strlen(file_name1)); } -bool WDTFile::init(char *map_id) +bool WDTFile::init(char *map_id, unsigned int mapID) { if (WDT.isEof()) { @@ -26,14 +26,14 @@ bool WDTFile::init(char *map_id) } char fourcc[5]; - size_t size; + uint32 size; - const char dirname[] = "buildings\\dir"; + std::string dirname = std::string(szWorkDirWmo) + "/dir_bin"; FILE *dirfile; - dirfile = fopen(dirname, "ab"); + dirfile = fopen(dirname.c_str(), "ab"); if(!dirfile) { - printf("Can't open dirfile!'%s'\n"); + printf("Can't open dirfile!'%s'\n", dirname.c_str()); return false; } @@ -86,7 +86,7 @@ bool WDTFile::init(char *map_id) { int id; WDT.read(&id, 4); - WMOInstance inst(WDT,gWmoInstansName[id].c_str(),gWMO_mapname.c_str(), dirfile); + WMOInstance inst(WDT,gWmoInstansName[id].c_str(),mapID, 65, 65, dirfile); } delete[] gWmoInstansName; } diff --git a/contrib/vmap_extractor_v2/vmapextract/wdtfile.h b/contrib/vmap_extractor_v2/vmapextract/wdtfile.h index 0baef22f1..f3d71c417 100644 --- a/contrib/vmap_extractor_v2/vmapextract/wdtfile.h +++ b/contrib/vmap_extractor_v2/vmapextract/wdtfile.h @@ -1,20 +1,19 @@ #ifndef WDTFILE_H #define WDTFILE_H -#define __STORMLIB_SELF__ - -#include "mpq.h" -#include "adtfile.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); + bool init(char *map_id, unsigned int mapID); string* gWmoInstansName; int gnWMO, nMaps; diff --git a/contrib/vmap_extractor_v2/vmapextract/wmo.cpp b/contrib/vmap_extractor_v2/vmapextract/wmo.cpp index 4817e14c8..03cc2c16c 100644 --- a/contrib/vmap_extractor_v2/vmapextract/wmo.cpp +++ b/contrib/vmap_extractor_v2/vmapextract/wmo.cpp @@ -1,10 +1,18 @@ -#define __STORMLIB_SELF__ +#include "vmapexport.h" #include "wmo.h" -#include "Stormlib.h" -#include "mpq.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) { @@ -19,10 +27,8 @@ bool WMORoot::open() return false; } - size_t size; + uint32 size; char fourcc[5]; - bbcorn1[3] = 0; - bbcorn2[3]= 0; while (!f.isEof()) { @@ -44,9 +50,10 @@ bool WMORoot::open() f.read(&nDoodads, 4); f.read(&nDoodadSets, 4); f.read(&col, 4); - f.read(&RootID, 4); + f.read(&RootWMOID, 4); f.read(bbcorn1,12); f.read(bbcorn2,12); + f.read(&liquidType, 4); break; } /* @@ -100,10 +107,11 @@ bool WMORoot::ConvertToVMAPRootWmo(FILE *pOutfile) { //printf("Convert RootWmo...\n"); - fwrite("VMAP002",1,8,pOutfile); + 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; } @@ -111,7 +119,8 @@ WMORoot::~WMORoot() { } -WMOGroup::WMOGroup(std::string &filename) : filename(filename) +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) { } @@ -123,10 +132,8 @@ bool WMOGroup::open() printf("No such file.\n"); return false; } - size_t size; + uint32 size; char fourcc[5]; - bbcorn1[3] = 0; - bbcorn2[3] = 0; while (!f.isEof()) { f.read(fourcc,4); @@ -143,19 +150,20 @@ bool WMOGroup::open() if (!strcmp(fourcc,"MOGP"))//header { - f.seekRelative(-4); - f.read(&offsize, 4); - f.read(&flag, 4); - f.read(&flag1, 4); - f.read(&Xid, 4); + f.read(&groupName, 4); + f.read(&descGroupName, 4); + f.read(&mogpFlags, 4); f.read(bbcorn1, 12); f.read(bbcorn2, 12); - f.read(&Xid2, 4); - f.read(&Xid3, 4); - f.read(&zero1, 4); - f.read(&Xflag, 4); - f.read(&nTexture,4); - f.read(&GroupID,4); + 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")) { @@ -190,26 +198,21 @@ bool WMOGroup::open() else if (!strcmp(fourcc,"MLIQ")) { liquflags |= 1; - WMOLiquidHeader hlq; - f.read(&hlq, 0x1E); - float ydir = -1.0f; - hlq_xverts = hlq.xverts; - hlq_yverts = hlq.yverts; - int noVer = hlq.xverts * hlq.yverts; - float tilesize = CHUNKSIZE / 8.0f; - LiquEx_size = sizeof(float) * 3 * noVer; - LiquEx = new float[sizeof(float) * 3 * noVer]; - int p = 0; + 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); - for (int j=0; jpos_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); } @@ -217,11 +220,17 @@ bool WMOGroup::open() return true; } -int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, bool pPreciseVectorData) +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) { - fwrite(&liquflags,sizeof(uint32),1,output); char GRP[] = "GRP "; fwrite(GRP,1,4,output); @@ -232,7 +241,6 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, bool pPreciseVectorData) { MobaEx[k++] = MOBA[i]; } - delete [] MOBA; int moba_size_grp = moba_batch*4+4; fwrite(&moba_size_grp,4,1,output); fwrite(&moba_batch,4,1,output); @@ -291,21 +299,10 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, bool pPreciseVectorData) } } - if(LiquEx_size != 0) - { - int LIQU_h[] = {0x5551494C,LiquEx_size+8,hlq_xverts,hlq_yverts};// "LIQU" - fwrite(LIQU_h,4,4,output); - fwrite(LiquEx,4,LiquEx_size/4,output); - delete [] LiquEx; - } - - return nTriangles; + nColTriangles = nTriangles; } else { - //printf("Convert GroupWmo...\n"); - //-------GRP ------------------------------------- - fwrite(&liquflags,sizeof(uint32),1,output); char GRP[] = "GRP "; fwrite(GRP,1,4,output); int k = 0; @@ -315,7 +312,7 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, bool pPreciseVectorData) { MobaEx[k++] = MOBA[i]; } - delete [] MOBA; + int moba_size_grp = moba_batch*4+4; fwrite(&moba_size_grp,4,1,output); fwrite(&moba_batch,4,1,output); @@ -324,146 +321,106 @@ int WMOGroup::ConvertToVMAPGroupWmo(FILE *output, bool pPreciseVectorData) //-------INDX------------------------------------ //-------MOPY-------- - int n = 0; - int j = 0; - MopyEx = new char[mopy_size]; - IndexExTr = new int[mopy_size]; - for (int i=0; i MoviExSort[i+1]) - { - hold = MoviExSort[i]; - MoviExSort[i] = MoviExSort[i+1]; - MoviExSort[i+1] = hold; - } - //double = 65535 - else - if (MoviExSort[i] == MoviExSort[i+1]) - MoviExSort[i+1] = 65535; + IndexRenum[i] = nColVertices; + ++nColVertices; } } - // double delet - uint16 s = 0; - for (int i=0; i < IndexExTr_size*3; ++i) - { - if (MoviExSort[i]!=65535) - { - MoviExSort[s] = MoviExSort[i]; - s++; - } - } - MovtExSort = new uint16[s]; - for (int i=0; i < s; ++i) - { - MovtExSort[i] = MoviExSort[i]; - } - for (int i=0; i < IndexExTr_size*3; ++i) + // translate triangle indices to new numbers + for (int i=0; i<3*nColTriangles; ++i) { - uint16 b = MoviEx[i]; - for (uint16 x = 0; x < s; ++x) - { - if(MoviExSort[x] == b) - { - MoviEx[i] = x; - break; - } - } + assert(MoviEx[i] < nVertices); + MoviEx[i] = IndexRenum[MoviEx[i]]; } - int INDX[] = {0x58444E49,IndexExTr_size*6+4,IndexExTr_size*3}; + + // write triangle indices + int INDX[] = {0x58444E49, nColTriangles*6+4, nColTriangles*3}; fwrite(INDX,4,3,output); - fwrite(MoviEx,2,IndexExTr_size*3,output); + fwrite(MoviEx,2,nColTriangles*3,output); + + // write vertices + int VERT[] = {0x54524556, nColVertices*3*sizeof(float)+4, nColVertices};// "VERT" + int check = 3*nColVertices; + fwrite(VERT,4,3,output); + for (uint32 i=0; i= 0) + check -= fwrite(MOVT+3*i, sizeof(float), 3, output); + + assert(check==0); delete [] MoviEx; - delete [] MoviExSort; - delete [] IndexExTr; - - //----------VERT--------- - //-----MOVT---------- - int d = 0; - MovtEx = new float[s*3]; - for (uint16 i=0; ixtiles*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 = 1; // first entry, generic "Water" + 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,const char*MapName, FILE *pDirfile) +WMOInstance::WMOInstance(MPQFile &f,const char* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile) { pos = Vec3D(0,0,0); @@ -478,35 +435,23 @@ WMOInstance::WMOInstance(MPQFile &f,const char* WmoInstName,const char*MapName, f.read(ff,12); pos3 = Vec3D(ff[0],ff[1],ff[2]); f.read(&d2,4); - f.read(&d3,4); - doodadset = (d2 & 0xFFFF0000) >> 16; - - int realx1 = (int) ((float) pos2.x / 533.333333f); - int realy1 = (int) ((float) pos2.z / 533.333333f); - int realx2 = (int) ((float) pos3.x / 533.333333f); - int realy2 = (int) ((float) pos3.z / 533.333333f); - - if(realx1 < 0) - { - realx1 +=20; realx2+=20; - } - if(realy1 < 0) - { - realy1 +=20; realy2+=20; - } // hack to prevent neg. values + uint16 trash,adtId; + f.read(&adtId,2); + f.read(&trash,2); //-----------add_in _dir_file---------------- char tempname[512]; - // const char dirname[] = "buildings\\dir"; - - sprintf(tempname, "buildings\\%s", WmoInstName); + sprintf(tempname, "%s/%s", szWorkDirWmo, 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; @@ -516,24 +461,38 @@ WMOInstance::WMOInstance(MPQFile &f,const char* WmoInstName,const char*MapName, if(nVertices == 0) return; - /* FILE *dirfile; - dirfile = fopen(dirname, "ab"); - if(!dirfile) - { - printf("Can't open dirfile!'%s'\n"); - return; - } - */ float x,z; x = pos.x; z = pos.z; if(x==0 && z == 0) { - x = 533.33333f*32; - z = 533.33333f*32; + pos.x = 533.33333f*32; + pos.z = 533.33333f*32; } + pos = fixCoords(pos); + pos2 = fixCoords(pos2); + pos3 = fixCoords(pos3); - fprintf(pDirfile,"%s/%s %f,%f,%f_%f,%f,%f 1.0 %d %d %d,%d %d\n", + 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, @@ -541,7 +500,7 @@ WMOInstance::WMOInstance(MPQFile &f,const char* WmoInstName,const char*MapName, nVertices, realx1, realy1, realx2, realy2 - ); + ); */ // fclose(dirfile); } diff --git a/contrib/vmap_extractor_v2/vmapextract/wmo.h b/contrib/vmap_extractor_v2/vmapextract/wmo.h index 3000050c1..12979bc13 100644 --- a/contrib/vmap_extractor_v2/vmapextract/wmo.h +++ b/contrib/vmap_extractor_v2/vmapextract/wmo.h @@ -1,14 +1,12 @@ #ifndef WMO_H #define WMO_H -#define __STORMLIB_SELF__ #define TILESIZE (533.33333f) #define CHUNKSIZE ((TILESIZE) / 16.0f) -#include "Stormlib.h" #include -#include "vec3d.h" #include -#include "mpq.h" +#include "vec3d.h" +#include "loadlib/loadlib.h" // MOPY flags #define WMO_MATERIAL_NOCAMCOLLIDE 0x01 @@ -21,19 +19,18 @@ class WMOInstance; class WMOManager; +class MPQFile; -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned int uint32; - +/* 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: - int nTextures, nGroups, nP, nLights, nModels, nDoodads, nDoodadSets, RootID; + uint32 nTextures, nGroups, nP, nLights, nModels, nDoodads, nDoodadSets, RootWMOID, liquidType; unsigned int col; - int bbcorn1[3]; - int bbcorn2[3]; + float bbcorn1[3]; + float bbcorn2[3]; WMORoot(std::string &filename); ~WMORoot(); @@ -45,44 +42,7 @@ private: char outfilename; }; -class WMOGroup -{ -public: - int offsize,flag,flag1,Xid,Xid2,Xid3,zero1,Xflag,nTexture,GroupID; - int mopy_size,moba_size,hlq_xverts,hlq_yverts; - int MopyEx_size,IndexExTr_size,LiquEx_size; - unsigned int nVertices; // number when loaded - int nTriangles; // number when loaded - int bbcorn1[3]; - int bbcorn2[3]; - int * IndexExTr; - char* MOPY; - char* MopyEx; - uint16* MOVI; - uint16* MoviEx; - uint16* MoviExSort; - float* MOVT; - float* MovtEx; - uint16* MovtExSort; - float* MONR; - float* MonrEx; - uint16* MOBA; - int* MobaEx; - float* LiquEx; - uint32 liquflags; - - WMOGroup(std::string &filename); - ~WMOGroup(); - - bool open(); - int ConvertToVMAPGroupWmo(FILE *output, bool pPreciseVectorData); - -private: - std::string filename; - char outfilename; -}; - -struct WMOLiquidHeader +struct WMOLiquidHeader { int xverts, yverts, xtiles, ytiles; float pos_x; @@ -91,20 +51,66 @@ struct WMOLiquidHeader short type; }; -class WMOInstance +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: - string MapName; + std::string MapName; int currx; int curry; WMOGroup *wmo; Vec3D pos; Vec3D pos2, pos3, rot; - int indx,id, d2, d3; + uint32 indx,id, d2, d3; int doodadset; - WMOInstance(MPQFile &f,const char* WmoInstName,const char*MapName, FILE *pDirfile); + WMOInstance(MPQFile &f,const char* WmoInstName, uint32 mapID, uint32 tileX, uint32 tileY, FILE *pDirfile); static void reset(); }; diff --git a/contrib/vmap_extractor_v2/win/.gitignore b/contrib/vmap_extractor_v2/win/.gitignore new file mode 100644 index 000000000..52fa31bb7 --- /dev/null +++ b/contrib/vmap_extractor_v2/win/.gitignore @@ -0,0 +1,6 @@ + +*.opensdf +*.sdf +*.suo +bin +ipch \ No newline at end of file diff --git a/contrib/vmap_extractor_v2/win/VC100/.gitignore b/contrib/vmap_extractor_v2/win/VC100/.gitignore new file mode 100644 index 000000000..4fb7be5e4 --- /dev/null +++ b/contrib/vmap_extractor_v2/win/VC100/.gitignore @@ -0,0 +1,2 @@ + +*.user \ No newline at end of file diff --git a/contrib/vmap_extractor_v2/win/VC100/vmapExtractor3.vcxproj b/contrib/vmap_extractor_v2/win/VC100/vmapExtractor3.vcxproj new file mode 100644 index 000000000..78e8c8765 --- /dev/null +++ b/contrib/vmap_extractor_v2/win/VC100/vmapExtractor3.vcxproj @@ -0,0 +1,106 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393} + vmapExtractor3 + + + + Application + MultiByte + true + + + Application + MultiByte + + + + + + + + + + + + + <_ProjectFileVersion>10.0.30319.1 + ..\..\bin\$(Platform)_$(Configuration)\ + ..\bin\$(ProjectName)__$(Platform)_$(Configuration)\ + ..\..\bin\$(Platform)_$(Configuration)\ + ..\bin\$(ProjectName)__$(Platform)_$(Configuration)\ + + + + Disabled + ..\..\..\..\dep\libmpq;%(AdditionalIncludeDirectories) + WIN32;%(PreprocessorDefinitions) + true + EnableFastChecks + MultiThreadedDebugDLL + Level3 + EditAndContinue + + + libmpq.lib;%(AdditionalDependencies) + ..\..\..\..\dep\libmpq\bin\$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) + true + MachineX86 + + + + + MaxSpeed + true + ..\..\..\..\dep\libmpq;%(AdditionalIncludeDirectories) + WIN32;%(PreprocessorDefinitions) + MultiThreadedDLL + true + Level3 + ProgramDatabase + + + libmpq.lib;%(AdditionalDependencies) + ..\..\..\..\dep\libmpq\bin\$(Platform)_$(Configuration);%(AdditionalLibraryDirectories) + false + true + true + MachineX86 + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/contrib/vmap_extractor_v2/win/VC90/.gitignore b/contrib/vmap_extractor_v2/win/VC90/.gitignore new file mode 100644 index 000000000..4fb7be5e4 --- /dev/null +++ b/contrib/vmap_extractor_v2/win/VC90/.gitignore @@ -0,0 +1,2 @@ + +*.user \ No newline at end of file diff --git a/contrib/vmap_extractor_v2/win/VC90/vmapExtractor3.vcproj b/contrib/vmap_extractor_v2/win/VC90/vmapExtractor3.vcproj new file mode 100644 index 000000000..83801906a --- /dev/null +++ b/contrib/vmap_extractor_v2/win/VC90/vmapExtractor3.vcproj @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/contrib/vmap_extractor_v2/win/vmapExtractor3_VC100.sln b/contrib/vmap_extractor_v2/win/vmapExtractor3_VC100.sln new file mode 100644 index 000000000..7fed404d0 --- /dev/null +++ b/contrib/vmap_extractor_v2/win/vmapExtractor3_VC100.sln @@ -0,0 +1,42 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmapExtractor3", "VC100\vmapExtractor3.vcxproj", "{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}" + ProjectSection(ProjectDependencies) = postProject + {B96F612A-C91D-43B3-A4C3-D4294817EC6C} = {B96F612A-C91D-43B3-A4C3-D4294817EC6C} + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2} = {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2} + {03AB0F44-628E-4855-99A0-C98A1EB52C50} = {03AB0F44-628E-4855-99A0-C98A1EB52C50} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpq", "..\..\..\dep\libmpq\win\VC100\libmpq.vcxproj", "{03AB0F44-628E-4855-99A0-C98A1EB52C50}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\..\..\win\VC100\zlib.vcxproj", "{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzip2", "..\..\..\win\VC100\bzip2.vcxproj", "{B96F612A-C91D-43B3-A4C3-D4294817EC6C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|Win32.ActiveCfg = Debug|Win32 + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|Win32.Build.0 = Debug|Win32 + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|Win32.ActiveCfg = Release|Win32 + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|Win32.Build.0 = Release|Win32 + {03AB0F44-628E-4855-99A0-C98A1EB52C50}.Debug|Win32.ActiveCfg = Debug|Win32 + {03AB0F44-628E-4855-99A0-C98A1EB52C50}.Debug|Win32.Build.0 = Debug|Win32 + {03AB0F44-628E-4855-99A0-C98A1EB52C50}.Release|Win32.ActiveCfg = Release|Win32 + {03AB0F44-628E-4855-99A0-C98A1EB52C50}.Release|Win32.Build.0 = Release|Win32 + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|Win32.ActiveCfg = Debug|Win32 + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|Win32.Build.0 = Debug|Win32 + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|Win32.ActiveCfg = Release|Win32 + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|Win32.Build.0 = Release|Win32 + {B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|Win32.ActiveCfg = Debug|Win32 + {B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|Win32.Build.0 = Debug|Win32 + {B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|Win32.ActiveCfg = Release|Win32 + {B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/contrib/vmap_extractor_v2/win/vmapExtractor3_VC90.sln b/contrib/vmap_extractor_v2/win/vmapExtractor3_VC90.sln new file mode 100644 index 000000000..f353a972b --- /dev/null +++ b/contrib/vmap_extractor_v2/win/vmapExtractor3_VC90.sln @@ -0,0 +1,42 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "vmapExtractor3", "VC90\vmapExtractor3.vcproj", "{D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}" + ProjectSection(ProjectDependencies) = postProject + {B96F612A-C91D-43B3-A4C3-D4294817EC6C} = {B96F612A-C91D-43B3-A4C3-D4294817EC6C} + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2} = {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2} + {03AB0F44-628E-4855-99A0-C98A1EB52C50} = {03AB0F44-628E-4855-99A0-C98A1EB52C50} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmpq", "..\..\..\dep\libmpq\win\VC90\libmpq.vcproj", "{03AB0F44-628E-4855-99A0-C98A1EB52C50}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "..\..\..\win\VC90\zlib.vcproj", "{8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bzip2", "..\..\..\win\VC90\bzip2.vcproj", "{B96F612A-C91D-43B3-A4C3-D4294817EC6C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|Win32.ActiveCfg = Debug|Win32 + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Debug|Win32.Build.0 = Debug|Win32 + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|Win32.ActiveCfg = Release|Win32 + {D4624B20-AC1E-4EE9-8C9C-0FB65EEE3393}.Release|Win32.Build.0 = Release|Win32 + {03AB0F44-628E-4855-99A0-C98A1EB52C50}.Debug|Win32.ActiveCfg = Debug|Win32 + {03AB0F44-628E-4855-99A0-C98A1EB52C50}.Debug|Win32.Build.0 = Debug|Win32 + {03AB0F44-628E-4855-99A0-C98A1EB52C50}.Release|Win32.ActiveCfg = Release|Win32 + {03AB0F44-628E-4855-99A0-C98A1EB52C50}.Release|Win32.Build.0 = Release|Win32 + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|Win32.ActiveCfg = Debug|Win32 + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Debug|Win32.Build.0 = Debug|Win32 + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|Win32.ActiveCfg = Release|Win32 + {8F1DEA42-6A5B-4B62-839D-C141A7BFACF2}.Release|Win32.Build.0 = Release|Win32 + {B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|Win32.ActiveCfg = Debug|Win32 + {B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Debug|Win32.Build.0 = Debug|Win32 + {B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|Win32.ActiveCfg = Release|Win32 + {B96F612A-C91D-43B3-A4C3-D4294817EC6C}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 97e285422..c78fbf752 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "10162" + #define REVISION_NR "10163" #endif // __REVISION_NR_H__