static int TestOpenStorage_OpenFile(const TCHAR * szStorage, const char * szFileName) { HANDLE hStorage; HANDLE hFile; DWORD dwBytesRead; BYTE Buffer[0x1000]; int nError = ERROR_SUCCESS; // Open the storage directory if(!CascOpenStorage(szStorage, 0, &hStorage)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } DWORD dwFileCount = 0; if(CascGetStorageInfo(hStorage, CascStorageFileCount, &dwFileCount, sizeof(DWORD), NULL)) { printf("file count: %d\n", dwFileCount); } DWORD dwFeatures = 0; if(CascGetStorageInfo(hStorage, CascStorageFeatures, &dwFeatures, sizeof(DWORD), NULL)) { printf("support listfile? %s\n", (dwFeatures & CASC_FEATURE_LISTFILE) ? "YES" : "NO"); } if(nError == ERROR_SUCCESS) { // Open a file if(!CascOpenFile(hStorage, szFileName, CASC_LOCALE_ZHCN, 0, &hFile)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } } // Read some data from the file if(nError == ERROR_SUCCESS) { DWORD dwFileSize, dwFileSizeHigh; dwFileSize = CascGetFileSize(hFile, &dwFileSizeHigh); printf("file name : %s, file size: %d\n", szFileName, dwFileSize); // Read data from the file CascReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead); CascCloseFile(hFile); } // Close storage and return if(hStorage != NULL) CascCloseStorage(hStorage); return nError; }
static int TestOpenStorage_EnumFiles(const TCHAR * szStorage, const TCHAR * szListFile = NULL) { CASC_FIND_DATA FindData; HANDLE hStorage; HANDLE hFind; DWORD dwTotalFiles = 0; DWORD dwFoundFiles = 0; bool bFileFound = true; int nError = ERROR_SUCCESS; // Open the storage directory if(!CascOpenStorage(szStorage, 0, &hStorage)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } if(nError == ERROR_SUCCESS) { // Retrieve the total number of files CascGetStorageInfo(hStorage, CascStorageFileCount, &dwTotalFiles, sizeof(dwTotalFiles), NULL); // Start finding hFind = CascFindFirstFile(hStorage, "*", &FindData, szListFile); if(hFind != NULL) { while(bFileFound) { // Extract the file // printf("%s\n", FindData.szFileName); dwFoundFiles++; // Find the next file in CASC bFileFound = CascFindNextFile(hFind, &FindData); } // Just a testing call - must fail CascFindNextFile(hFind, &FindData); // Close the search handle CascFindClose(hFind); } } // Close storage and return if(hStorage != NULL) CascCloseStorage(hStorage); return nError; }
CASC::StorageHandle CASC::OpenStorage(boost::filesystem::path const& path, DWORD localeMask) { HANDLE handle = nullptr; if (!::CascOpenStorage(path.string().c_str(), localeMask, &handle)) { DWORD lastError = GetLastError(); // support checking error set by *Open* call, not the next *Close* printf("Error opening casc storage '%s': %s\n", path.string().c_str(), HumanReadableCASCError(lastError)); CascCloseStorage(handle); SetLastError(lastError); return StorageHandle(); } printf("Opened casc storage '%s'\n", path.string().c_str()); return StorageHandle(handle); }
static int TestOpenStorage_EnumFiles(const TCHAR * szStorage, const TCHAR * szListFile) { CASC_FIND_DATA FindData; HANDLE hStorage; HANDLE hFind; bool bFileFound = true; int nError = ERROR_SUCCESS; // Open the storage directory if(!CascOpenStorage(szStorage, 0, &hStorage)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } if(nError == ERROR_SUCCESS) { hFind = CascFindFirstFile(hStorage, "*", &FindData, szListFile); if(hFind != NULL) { while(bFileFound) { // Extract the file printf("%s\n", FindData.szFileName); // Find the next file in CASC bFileFound = CascFindNextFile(hFind, &FindData); } // Just a testing call - must fail CascFindNextFile(hFind, &FindData); // Close the search handle CascFindClose(hFind); } } // Close storage and return if(hStorage != NULL) CascCloseStorage(hStorage); return nError; }
static int TestOpenStorage_ExtractFiles(const TCHAR * szStorage, const TCHAR * szTargetDir, const TCHAR * szListFile) { CASC_FIND_DATA FindData; HANDLE hStorage; HANDLE hFind; bool bFileFound = true; int nError = ERROR_SUCCESS; // Open the storage directory if(!CascOpenStorage(szStorage, 0, &hStorage)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } if(nError == ERROR_SUCCESS) { hFind = CascFindFirstFile(hStorage, "*", &FindData, szListFile); if(hFind != INVALID_HANDLE_VALUE) { while(bFileFound) { // Extract the file printf("Extracting: %s ...", FindData.szFileName); nError = ExtractFile(hStorage, FindData.szFileName, szTargetDir, FindData.dwLocaleFlags); printf((nError == ERROR_SUCCESS) ? "OK\n" : "Failed\n"); // Find the next file in CASC bFileFound = CascFindNextFile(hFind, &FindData); } // Close the search handle CascFindClose(hFind); } } // Close storage and return if(hStorage != NULL) CascCloseStorage(hStorage); return nError; }
static int TestOpenStorage_OpenFile(const TCHAR * szStorage, const char * szFileName) { HANDLE hStorage; HANDLE hFile; DWORD dwBytesRead; BYTE Buffer[0x1000]; int nError = ERROR_SUCCESS; // Open the storage directory if(!CascOpenStorage(szStorage, 0, &hStorage)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } if(nError == ERROR_SUCCESS) { // Open a file if(!CascOpenFile(hStorage, szFileName, 0, 0, &hFile)) { assert(GetLastError() != ERROR_SUCCESS); nError = GetLastError(); } } // Read some data from the file if(nError == ERROR_SUCCESS) { // Read data from the file CascReadFile(hFile, Buffer, sizeof(Buffer), &dwBytesRead); CascCloseFile(hFile); } // Close storage and return if(hStorage != NULL) CascCloseStorage(hStorage); return nError; }
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; }