int main(int argc, char ** argv) { bool success=true; const char *versionString = "V4.00 2012_02"; // 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]; return scanf("%c", garbage); } } printf("Extract %s. Beginning work ....\n\n",versionString); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Create the working directory if (mkdir(szWorkDirWmo #if defined(__linux__) || defined(__APPLE__) , 0711 #endif )) success = (errno == EEXIST); LoadCommonMPQFiles(CONF_TargetBuild); for (int i = 0; i < LOCALES_COUNT; ++i) { //Open MPQs if (!LoadLocaleMPQFile(i)) { if (GetLastError() != ERROR_PATH_NOT_FOUND) printf("Unable to load %s locale archives!\n", Locales[i]); continue; } printf("Detected and using locale: %s\n", Locales[i]); break; } ReadLiquidTypeTableDBC(); // extract data if (success) success = ExtractWmo(); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //map.dbc if (success) { DBCFile * dbc = new DBCFile(LocaleMpq, "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; // Extract models, listed in GameObjectDisplayInfo.dbc ExtractGameobjectModels(); } SFileCloseArchive(LocaleMpq); SFileCloseArchive(WorldMpq); printf("\n"); 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 main(int argc, char ** argv) { bool success=true; const char *versionString = "V4.00 2012_02"; // 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]; return scanf("%c", garbage); } } printf("Extract %s. Beginning work ....\n",versionString); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Create the working directory if (mkdir(szWorkDirWmo #if defined(__linux__) || defined(__APPLE__) , 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.empty() || 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=static_cast<uint32_t>(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); const char* map_name = dbc->getRecord(x).getString(1); size_t max_map_name_length = sizeof(map_ids[x].name); if (strlen(map_name) >= max_map_name_length) { delete dbc; delete[] map_ids; printf("FATAL ERROR: Map name too long.\n"); return 1; } strncpy(map_ids[x].name, map_name, max_map_name_length); map_ids[x].name[max_map_name_length - 1] = '\0'; printf("Map - %s\n", map_ids[x].name); } delete dbc; ParsMapFiles(); delete [] map_ids; //nError = ERROR_SUCCESS; // Extract models, listed in DameObjectDisplayInfo.dbc ExtractGameobjectModels(); } printf("\n"); 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 main(int argc, char ** argv) { bool success = true; const char *versionString = "V4.03 2015_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("<press return to exit>"); char garbage[2]; return scanf("%c", garbage); } } printf("Extract %s. Beginning work ....\n\n", versionString); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Create the working directory if (mkdir(szWorkDirWmo #if defined(__linux__) || defined(__APPLE__) , 0711 #endif )) success = (errno == EEXIST); int FirstLocale = -1; for (int i = 0; i < TOTAL_LOCALES; ++i) { if (i == LOCALE_none) continue; if (!OpenCascStorage(i)) continue; FirstLocale = i; uint32 build = ReadBuild(i); if (!build) { CascCloseStorage(CascStorage); continue; } printf("Detected client build: %u\n\n", build); break; } if (!OpenCascStorage(FirstLocale)) { if (GetLastError() != ERROR_PATH_NOT_FOUND) printf("Unable to open storage!\n"); return 1; } // Extract models, listed in GameObjectDisplayInfo.dbc ExtractGameobjectModels(); ReadLiquidTypeTableDBC(); // extract data if (success) success = ExtractWmo(); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //map.dbc if (success) { DBCFile * dbc = new DBCFile(CascStorage, "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); const char* map_name = dbc->getRecord(x).getString(1); size_t max_map_name_length = sizeof(map_ids[x].name); if (strlen(map_name) >= max_map_name_length) { delete dbc; delete[] map_ids; printf("FATAL ERROR: Map name too long.\n"); return 1; } strncpy(map_ids[x].name, map_name, max_map_name_length); map_ids[x].name[max_map_name_length - 1] = '\0'; printf("Map - %s\n", map_ids[x].name); } delete dbc; ParsMapFiles(); delete [] map_ids; } CascCloseStorage(CascStorage); printf("\n"); 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 main(int argc, char ** argv) { Trinity::Banner::Show("VMAP data extractor", [](char const* text) { printf("%s\n", text); }, nullptr); bool success = true; const char *versionString = "V4.03 2015_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("<press return to exit>"); char garbage[2]; return scanf("%c", garbage); } } printf("Extract %s. Beginning work ....\n\n", versionString); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Create the working directory if (mkdir(szWorkDirWmo #if defined(__linux__) || defined(__APPLE__) , 0711 #endif )) success = (errno == EEXIST); int FirstLocale = -1; for (int i = 0; i < TOTAL_LOCALES; ++i) { if (i == LOCALE_none) continue; if (!OpenCascStorage(i)) continue; FirstLocale = i; uint32 build = ReadBuild(i); if (!build) { CascCloseStorage(CascStorage); continue; } printf("Detected client build: %u\n\n", build); break; } if (FirstLocale == -1) { printf("FATAL ERROR: No locales defined, unable to continue.\n"); return 1; } if (!OpenCascStorage(FirstLocale)) { if (GetLastError() != ERROR_PATH_NOT_FOUND) printf("Unable to open storage!\n"); return 1; } // Extract models, listed in GameObjectDisplayInfo.dbc ExtractGameobjectModels(); ReadLiquidTypeTableDBC(); // extract data if (success) success = ExtractWmo(); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //map.dbc if (success) { printf("Read Map.dbc file... "); HANDLE dbcFile; if (!CascOpenFile(CascStorage, "DBFilesClient\\Map.db2", CASC_LOCALE_NONE, 0, &dbcFile)) { printf("Fatal error: Cannot find Map.dbc in archive! %s\n", HumanReadableCASCError(GetLastError())); exit(1); } DB2FileLoader db2; if (!db2.Load(dbcFile, MapMeta::Instance())) { printf("Fatal error: Invalid Map.db2 file format! %s\n", HumanReadableCASCError(GetLastError())); exit(1); } map_ids.resize(db2.GetNumRows()); std::unordered_map<uint32, uint32> idToIndex; for (uint32 x = 0; x < db2.GetNumRows(); ++x) { if (MapMeta::Instance()->HasIndexFieldInData()) map_ids[x].id = db2.getRecord(x).getUInt(MapMeta::Instance()->GetIndexField(), 0); else map_ids[x].id = db2.getId(x); const char* map_name = db2.getRecord(x).getString(0, 0); size_t max_map_name_length = sizeof(map_ids[x].name); if (strlen(map_name) >= max_map_name_length) { printf("Fatal error: Map name too long!\n"); exit(1); } strncpy(map_ids[x].name, map_name, max_map_name_length); map_ids[x].name[max_map_name_length - 1] = '\0'; idToIndex[map_ids[x].id] = x; } for (uint32 x = 0; x < db2.GetNumRowCopies(); ++x) { uint32 from = db2.GetRowCopy(x).first; uint32 to = db2.GetRowCopy(x).second; auto itr = idToIndex.find(from); if (itr != idToIndex.end()) { map_id id; id.id = to; strcpy(id.name, map_ids[itr->second].name); map_ids.push_back(id); } } CascCloseFile(dbcFile); printf("Done! (" SZFMTD " maps loaded)\n", map_ids.size()); ParsMapFiles(); } CascCloseStorage(CascStorage); printf("\n"); 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); return 0; }
int main(int argc, char* argv[]) { _setmaxstdio(2048); uint32 threads = 4, extractFlags = 0; std::set<uint32> mapIds; if (!HandleArgs(argc, argv, threads, mapIds, Constants::Debug, extractFlags)) { PrintUsage(); return -1; } if (extractFlags == 0) { printf("You must provide valid extract flags.\n"); PrintUsage(); return -1; } Cache = new CacheClass(); MPQHandler = new MPQManager(); MPQHandler->Initialize(); if (extractFlags & Constants::EXTRACT_FLAG_DBC) ExtractDBCs(); if (extractFlags & Constants::EXTRACT_FLAG_MMAPS) ExtractMMaps(mapIds, threads); if (extractFlags & Constants::EXTRACT_FLAG_GOB_MODELS) ExtractGameobjectModels(); if (extractFlags & Constants::EXTRACT_FLAG_TEST) { float start[] = { 16226.200195f, 16257.000000f, 13.202200f }; float end[] = { 16245.725586f, 16382.465820f, 47.384956f }; // float m_spos[3]; m_spos[0] = -start[1]; m_spos[1] = start[2]; m_spos[2] = -start[0]; // float m_epos[3]; m_epos[0] = -end[1]; m_epos[1] = end[2]; m_epos[2] = -end[0]; // dtQueryFilter m_filter; m_filter.setIncludeFlags(Constants::POLY_AREA_ROAD | Constants::POLY_AREA_TERRAIN); m_filter.setExcludeFlags(Constants::POLY_AREA_WATER); // float m_polyPickExt[3]; m_polyPickExt[0] = 2.5f; m_polyPickExt[1] = 2.5f; m_polyPickExt[2] = 2.5f; // dtPolyRef m_startRef; dtPolyRef m_endRef; FILE* mmap = fopen("mmaps/001.mmap", "rb"); dtNavMeshParams params; int count = fread(¶ms, sizeof(dtNavMeshParams), 1, mmap); fclose(mmap); if (count != 1) { printf("main: Error reading from .mmap\n"); return 0; } dtNavMesh* navMesh = new dtNavMesh(); dtNavMeshQuery* navMeshQuery = new dtNavMeshQuery(); navMesh->init(¶ms); for (int i = 0; i <= 32; ++i) { for (int j = 0; j <= 32; ++j) { char buff[100]; sprintf(buff, "mmaps/001%02i%02i.mmtile", i, j); LoadTile(navMesh, buff); } } navMeshQuery->init(navMesh, 2048); float nearestPt[3]; navMeshQuery->findNearestPoly(m_spos, m_polyPickExt, &m_filter, &m_startRef, nearestPt); navMeshQuery->findNearestPoly(m_epos, m_polyPickExt, &m_filter, &m_endRef, nearestPt); if ( !m_startRef || !m_endRef ) { std::cerr << "Could not find any nearby poly's (" << m_startRef << "," << m_endRef << ")" << std::endl; return 0; } int hops; dtPolyRef* hopBuffer = new dtPolyRef[8192]; dtStatus status = navMeshQuery->findPath(m_startRef, m_endRef, m_spos, m_epos, &m_filter, hopBuffer, &hops, 8192); int resultHopCount; float* straightPath = new float[2048*3]; unsigned char* pathFlags = new unsigned char[2048]; dtPolyRef* pathRefs = new dtPolyRef[2048]; status = navMeshQuery->findStraightPath(m_spos, m_epos, hopBuffer, hops, straightPath, pathFlags, pathRefs, &resultHopCount, 2048); std::vector<Vector3> FinalPath; FinalPath.reserve(resultHopCount); for (uint32 i = 0; i < resultHopCount; ++i) { Vector3 finalV = Utils::ToWoWCoords(Vector3(straightPath[i * 3 + 0], straightPath[i * 3 + 1], straightPath[i * 3 + 2])); FinalPath.push_back(finalV); printf("Point %f %f %f\n", finalV.x, finalV.y, finalV.z); } } return 0; }
int main(int argc, char ** argv) { Trinity::Banner::Show("VMAP data extractor", [](char const* text) { printf("%s\n", text); }, nullptr); bool success = true; const char *versionString = "V4.06 2018_02"; // Use command line arguments, when some if (!processArgv(argc, argv, versionString)) return 1; if (!RetardCheck()) 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]; return scanf("%c", garbage); } } printf("Extract %s. Beginning work ....\n\n", versionString); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Create the working directory if (mkdir(szWorkDirWmo #if defined(__linux__) || defined(__APPLE__) , 0711 #endif )) success = (errno == EEXIST); uint32 installedLocalesMask = GetInstalledLocalesMask(); int32 FirstLocale = -1; for (int i = 0; i < TOTAL_LOCALES; ++i) { if (i == LOCALE_none) continue; if (!(installedLocalesMask & WowLocaleToCascLocaleFlags[i])) continue; if (!OpenCascStorage(i)) continue; FirstLocale = i; uint32 build = CASC::GetBuildNumber(CascStorage); if (!build) { CascStorage.reset(); continue; } printf("Detected client build: %u\n\n", build); break; } if (FirstLocale == -1) { printf("FATAL ERROR: No locales defined, unable to continue.\n"); return 1; } // Extract models, listed in GameObjectDisplayInfo.dbc ExtractGameobjectModels(); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //map.dbc if (success) { printf("Read Map.dbc file... "); DB2CascFileSource source(CascStorage, "DBFilesClient\\Map.db2"); DB2FileLoader db2; if (!db2.Load(&source, MapLoadInfo::Instance())) { printf("Fatal error: Invalid Map.db2 file format! %s\n", CASC::HumanReadableCASCError(GetLastError())); exit(1); } for (uint32 x = 0; x < db2.GetRecordCount(); ++x) { DB2Record record = db2.GetRecord(x); map_info& m = map_ids[record.GetId()]; const char* map_name = record.GetString("Directory"); size_t max_map_name_length = sizeof(m.name); if (strlen(map_name) >= max_map_name_length) { printf("Fatal error: Map name too long!\n"); exit(1); } strncpy(m.name, map_name, max_map_name_length); m.name[max_map_name_length - 1] = '\0'; m.parent_id = int16(record.GetUInt16("ParentMapID")); if (m.parent_id >= 0) maps_that_are_parents.insert(m.parent_id); } for (uint32 x = 0; x < db2.GetRecordCopyCount(); ++x) { DB2RecordCopy copy = db2.GetRecordCopy(x); auto itr = map_ids.find(copy.SourceRowId); if (itr != map_ids.end()) { map_info& id = map_ids[copy.NewRowId]; strcpy(id.name, itr->second.name); id.parent_id = itr->second.parent_id; } } printf("Done! (" SZFMTD " maps loaded)\n", map_ids.size()); ParsMapFiles(); } CascStorage.reset(); printf("\n"); 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); return 0; }