From 50e7b93bbd66b1d26916bc4168ea4fe875fa2566 Mon Sep 17 00:00:00 2001 From: Shauren Date: Thu, 27 Jun 2013 19:31:38 +0200 Subject: Tools/Extractors: Fixed possible name issues (underscore instead of space) when attempting to extract M2 models from MPQ --- src/server/collision/Maps/TileAssembler.cpp | 15 ++--- src/tools/vmap4_extractor/adtfile.cpp | 73 ++++++++++++++---------- src/tools/vmap4_extractor/adtfile.h | 16 +++--- src/tools/vmap4_extractor/dbcfile.h | 15 +++++ src/tools/vmap4_extractor/gameobject_extract.cpp | 32 ++++------- src/tools/vmap4_extractor/model.cpp | 2 +- src/tools/vmap4_extractor/vmapexport.cpp | 34 +---------- src/tools/vmap4_extractor/wdtfile.cpp | 2 +- 8 files changed, 89 insertions(+), 100 deletions(-) (limited to 'src') diff --git a/src/server/collision/Maps/TileAssembler.cpp b/src/server/collision/Maps/TileAssembler.cpp index b2d381b0ffd..02300c0b34a 100644 --- a/src/server/collision/Maps/TileAssembler.cpp +++ b/src/server/collision/Maps/TileAssembler.cpp @@ -395,13 +395,14 @@ namespace VMAP fclose(model_list); fclose(model_list_copy); } - // temporary use defines to simplify read/check code (close file and return at fail) - #define READ_OR_RETURN(V, S) if (fread((V), (S), 1, rf) != 1) { \ - fclose(rf); printf("readfail, op = %i\n", readOperation); return(false); } - #define READ_OR_RETURN_WITH_DELETE(V, S) if (fread((V), (S), 1, rf) != 1) { \ - fclose(rf); printf("readfail, op = %i\n", readOperation); delete[] V; return(false); }; - #define CMP_OR_RETURN(V, S) if (strcmp((V), (S)) != 0) { \ - fclose(rf); printf("cmpfail, %s!=%s\n", V, S);return(false); } + +// temporary use defines to simplify read/check code (close file and return at fail) +#define READ_OR_RETURN(V, S) if (fread((V), (S), 1, rf) != 1) { \ + fclose(rf); printf("readfail, op = %i\n", readOperation); return(false); } +#define READ_OR_RETURN_WITH_DELETE(V, S) if (fread((V), (S), 1, rf) != 1) { \ + fclose(rf); printf("readfail, op = %i\n", readOperation); delete[] V; return(false); }; +#define CMP_OR_RETURN(V, S) if (strcmp((V), (S)) != 0) { \ + fclose(rf); printf("cmpfail, %s!=%s\n", V, S);return(false); } bool GroupModel_Raw::Read(FILE* rf) { diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp index 652b162189b..18d400d29e8 100644 --- a/src/tools/vmap4_extractor/adtfile.cpp +++ b/src/tools/vmap4_extractor/adtfile.cpp @@ -44,26 +44,29 @@ char* GetPlainName(char* FileName) return FileName; } -void fixnamen(char* name, size_t len) +void FixNameCase(char* name, size_t len) { - for (size_t i = 0; i < len-3; i++) + char* ptr = name + len - 1; + + //extension in lowercase + for (; *ptr != '.'; --ptr) + *ptr |= 0x20; + + for (; ptr >= name; --ptr) { - if (i > 0 && 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; + if (ptr > name && *ptr >= 'A' && *ptr <= 'Z' && isalpha(*(ptr - 1))) + *ptr |= 0x20; + else if ((ptr == name || !isalpha(*(ptr - 1))) && *ptr >= 'a' && *ptr <= 'z') + *ptr &= ~0x20; } - //extension in lowercase - for (size_t i = len - 3; i < len; i++) - name[i] |= 0x20; } -void fixname2(char* name, size_t len) +void FixNameSpaces(char* name, size_t len) { for (size_t i=0; i .m2 - fname.erase(fname.length()-2,2); + fname.erase(fname.length() - 2, 2); fname.append("2"); } - // >= 3.1.0 ADT MMDX section store filename.m2 filenames for corresponded .m2 file - // nothing do + + std::string originalName = fname; + + char* name = GetPlainName((char*)fname.c_str()); + FixNameCase(name, strlen(name)); + FixNameSpaces(name, strlen(name)); std::string output(szWorkDirWmo); output += "/"; @@ -28,7 +27,7 @@ bool ExtractSingleModel(std::string& fname) if (FileExists(output.c_str())) return true; - Model mdl(fname); + Model mdl(originalName); if (!mdl.open()) return false; @@ -60,9 +59,9 @@ void ExtractGameobjectModels() if (path.length() < 4) continue; - fixnamen((char*)path.c_str(), path.size()); + FixNameCase((char*)path.c_str(), path.size()); char * name = GetPlainName((char*)path.c_str()); - fixname2(name, strlen(name)); + FixNameSpaces(name, strlen(name)); char * ch_ext = GetExtension(name); if (!ch_ext) @@ -72,18 +71,11 @@ void ExtractGameobjectModels() bool result = false; if (!strcmp(ch_ext, ".wmo")) - { result = ExtractSingleWmo(path); - } - else if (!strcmp(ch_ext, ".mdl")) - { - // TODO: extract .mdl files, if needed + else if (!strcmp(ch_ext, ".mdl")) // TODO: extract .mdl files, if needed continue; - } else //if (!strcmp(ch_ext, ".mdx") || !strcmp(ch_ext, ".m2")) - { result = ExtractSingleModel(path); - } if (result) { diff --git a/src/tools/vmap4_extractor/model.cpp b/src/tools/vmap4_extractor/model.cpp index 68b839c4a6d..f929da63f56 100644 --- a/src/tools/vmap4_extractor/model.cpp +++ b/src/tools/vmap4_extractor/model.cpp @@ -46,7 +46,7 @@ bool Model::open() _unload(); memcpy(&header, f.getBuffer(), sizeof(ModelHeader)); - if(header.nBoundingTriangles > 0) + if (header.nBoundingTriangles > 0) { f.seek(0); f.seekRelative(header.ofsBoundingVertices); diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp index 84390a5fc9a..b650121f587 100644 --- a/src/tools/vmap4_extractor/vmapexport.cpp +++ b/src/tools/vmap4_extractor/vmapexport.cpp @@ -309,7 +309,7 @@ bool ExtractSingleWmo(std::string& fname) char szLocalFile[1024]; const char * plain_name = GetPlainName(fname.c_str()); sprintf(szLocalFile, "%s/%s", szWorkDirWmo, plain_name); - fixnamen(szLocalFile,strlen(szLocalFile)); + FixNameCase(szLocalFile,strlen(szLocalFile)); if (FileExists(szLocalFile)) return true; @@ -360,7 +360,7 @@ bool ExtractSingleWmo(std::string& fname) sprintf(groupFileName, "%s_%03u.wmo", temp, i); //printf("Trying to open groupfile %s\n",groupFileName); - string s = groupFileName; + std::string s = groupFileName; WMOGroup fgroup(s); if(!fgroup.open()) { @@ -424,36 +424,6 @@ void getGamePath() #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 processArgv(int argc, char ** argv, const char *versionString) { bool result = true; diff --git a/src/tools/vmap4_extractor/wdtfile.cpp b/src/tools/vmap4_extractor/wdtfile.cpp index 3e503259c83..13458bceb7c 100644 --- a/src/tools/vmap4_extractor/wdtfile.cpp +++ b/src/tools/vmap4_extractor/wdtfile.cpp @@ -83,7 +83,7 @@ bool WDTFile::init(char* /*map_id*/, unsigned int mapID) while (p < buf + size) { char* s=wdtGetPlainName(p); - fixnamen(s,strlen(s)); + FixNameCase(s,strlen(s)); p=p+strlen(p)+1; gWmoInstansName[q++] = s; } -- cgit v1.2.3