int main(int argc, char ** argv) { bool success=true; const char *versionString = "V3.00 2010_07"; // 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("<press return to exit>"); char garbage[2]; scanf("%c", garbage); return 1; } } printf("Extract %s. Beginning work ....\n",versionString); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Create the working directory if(mkdir(szWorkDirWmo #ifdef _XOPEN_UNIX , 0711 #endif )) success = (errno == EEXIST); // prepare archive name list std::vector<std::string> 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;x<map_count;++x) { map_ids[x].id=dbc->getRecord (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; }
int ExtractWmo() { char szLocalFile[1024] = ""; bool success=true; for (ArchiveSet::const_iterator ar_itr = gOpenArchives.begin(); ar_itr != gOpenArchives.end() && success; ++ar_itr) { vector<string> filelist; (*ar_itr)->GetFileListTo(filelist); for (vector<string>::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; if(froot->nGroups !=0) { for (uint32 i=0; i<froot->nGroups; ++i) { char temp[1024]; strcpy(temp, fname->c_str()); temp[fname->length()-4] = 0; char groupFileName[1024]; sprintf(groupFileName,"%s_%03d.wmo",temp, i); 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 CloseArchives() { for(ArchiveSet::const_iterator i = gOpenArchives.begin(); i != gOpenArchives.end();++i) SFileCloseArchive(*i); gOpenArchives.clear(); }
ArchiveSetBounds GetArchivesBounds() { return ArchiveSetBounds(gOpenArchives.begin(), gOpenArchives.end()); }
inline void CloseMPQFiles() { for(ArchiveSet::iterator j = gOpenArchives.begin(); j != gOpenArchives.end();++j) (*j)->close(); gOpenArchives.clear(); }