bool ExtractSingleWmo(std::string& fname) { // Copy files from archive char szLocalFile[1024]; const char * plain_name = GetPlainName(fname.c_str()); sprintf(szLocalFile, "%s/%s", szWorkDirWmo, plain_name); FixNameCase(szLocalFile, strlen(szLocalFile)); FixNameSpaces(szLocalFile, strlen(szLocalFile)); if (FileExists(szLocalFile)) return true; int p = 0; // Select root wmo files char const* rchr = strrchr(plain_name, '_'); if (rchr != NULL) { char cpy[4]; memcpy(cpy, rchr, 4); for (int i = 0; i < 4; ++i) { int m = cpy[i]; if (isdigit(m)) p++; } } if (p == 3) return true; bool file_ok = true; printf("Extracting %s\n", fname.c_str()); WMORoot froot(fname); if(!froot.open()) { printf("Couldn't open RootWmo!!!\n"); return true; } FILE *output = fopen(szLocalFile,"wb"); if(!output) { printf("couldn't open %s for writing!\n", szLocalFile); return false; } froot.ConvertToVMAPRootWmo(output); int Wmo_nVertices = 0; //printf("root has %d groups\n", froot->nGroups); for (std::size_t i = 0; i < froot.groupFileDataIDs.size(); ++i) { std::string s = Trinity::StringFormat("FILE%08X.xxx", froot.groupFileDataIDs[i]); WMOGroup fgroup(s); if(!fgroup.open()) { printf("Could not open all Group file for: %s\n", plain_name); file_ok = false; break; } Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, &froot, preciseVectorData); } fseek(output, 8, SEEK_SET); // store the correct no of vertices fwrite(&Wmo_nVertices,sizeof(int),1,output); fclose(output); // Delete the extracted file in the case of an error if (!file_ok) remove(szLocalFile); return true; }
bool ExtractSingleWmo(std::string& fname) { // Copy files from archive char szLocalFile[1024]; const char * plain_name = GetPlainName(fname.c_str()); sprintf(szLocalFile, "%s/%s", szWorkDirWmo, plain_name); FixNameCase(szLocalFile,strlen(szLocalFile)); if (FileExists(szLocalFile)) return true; int p = 0; // Select root wmo files char const* rchr = strrchr(plain_name, '_'); if (rchr != NULL) { char cpy[4]; memcpy(cpy, rchr, 4); for (int i = 0; i < 4; ++i) { int m = cpy[i]; if (isdigit(m)) p++; } } if (p == 3) return true; bool file_ok = true; std::cout << "Extracting " << fname << std::endl; WMORoot froot(fname); if(!froot.open()) { printf("Couldn't open RootWmo!!!\n"); return true; } FILE *output = fopen(szLocalFile,"wb"); if(!output) { printf("couldn't open %s for writing!\n", szLocalFile); return false; } froot.ConvertToVMAPRootWmo(output); int Wmo_nVertices = 0; //printf("root has %d groups\n", froot->nGroups); 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_%03u.wmo", temp, i); //printf("Trying to open groupfile %s\n",groupFileName); std::string s = groupFileName; WMOGroup fgroup(s); if(!fgroup.open()) { printf("Could not open all Group file for: %s\n", plain_name); file_ok = false; break; } Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, &froot, preciseVectorData); } } fseek(output, 8, SEEK_SET); // store the correct no of vertices fwrite(&Wmo_nVertices,sizeof(int),1,output); fclose(output); // Delete the extracted file in the case of an error if (!file_ok) remove(szLocalFile); return true; }
bool ExtractSingleWmo(std::string& fname) { // Copy files from archive std::string originalName = fname; char szLocalFile[1024]; char* plain_name = GetPlainName(&fname[0]); FixNameCase(plain_name, strlen(plain_name)); FixNameSpaces(plain_name, strlen(plain_name)); sprintf(szLocalFile, "%s/%s", szWorkDirWmo, plain_name); if (FileExists(szLocalFile)) return true; int p = 0; // Select root wmo files char const* rchr = strrchr(plain_name, '_'); if (rchr != NULL) { char cpy[4]; memcpy(cpy, rchr, 4); for (int i = 0; i < 4; ++i) { int m = cpy[i]; if (isdigit(m)) p++; } } if (p == 3) return true; bool file_ok = true; printf("Extracting %s\n", originalName.c_str()); WMORoot froot(originalName); if (!froot.open()) { printf("Couldn't open RootWmo!!!\n"); return true; } FILE *output = fopen(szLocalFile,"wb"); if(!output) { printf("couldn't open %s for writing!\n", szLocalFile); return false; } froot.ConvertToVMAPRootWmo(output); WMODoodadData& doodads = WmoDoodads[plain_name]; std::swap(doodads, froot.DoodadData); int Wmo_nVertices = 0; //printf("root has %d groups\n", froot->nGroups); for (std::size_t i = 0; i < froot.groupFileDataIDs.size(); ++i) { std::string s = Trinity::StringFormat("FILE%08X.xxx", froot.groupFileDataIDs[i]); WMOGroup fgroup(s); if (!fgroup.open(&froot)) { printf("Could not open all Group file for: %s\n", plain_name); file_ok = false; break; } Wmo_nVertices += fgroup.ConvertToVMAPGroupWmo(output, preciseVectorData); for (uint16 groupReference : fgroup.DoodadReferences) { if (groupReference >= doodads.Spawns.size()) continue; uint32 doodadNameIndex = doodads.Spawns[groupReference].NameIndex; if (froot.ValidDoodadNames.find(doodadNameIndex) == froot.ValidDoodadNames.end()) continue; doodads.References.insert(groupReference); } } fseek(output, 8, SEEK_SET); // store the correct no of vertices fwrite(&Wmo_nVertices,sizeof(int),1,output); fclose(output); // Delete the extracted file in the case of an error if (!file_ok) remove(szLocalFile); return true; }