diff --git a/src/tools/Extractor_projects/map-extractor/System.cpp b/src/tools/Extractor_projects/map-extractor/System.cpp index b092abfc7..fbb671dd8 100644 --- a/src/tools/Extractor_projects/map-extractor/System.cpp +++ b/src/tools/Extractor_projects/map-extractor/System.cpp @@ -103,9 +103,6 @@ float CONF_float_to_int16_limit = 2048.0f; // Max accuracy = val/65536 float CONF_flat_height_delta_limit = 0.005f; // If max - min less this value - surface is flat float CONF_flat_liquid_delta_limit = 0.001f; // If max - min less this value - liquid surface is flat -// static char* const langs[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; -#define LANG_COUNT 12 - #define MIN_SUPPORTED_BUILD 15595 // code expect mpq files and mpq content files structure for this build or later #define EXPANSION_COUNT 3 #define WORLD_COUNT 2 @@ -232,7 +229,7 @@ void AppendDB2FileListTo(HANDLE mpqHandle, std::set& filelist) uint32 ReadBuild(int locale) { // include build info file also - std::string filename = std::string("component.wow-") + langs[locale] + ".txt"; + std::string filename = std::string("component.wow-") + Locales[locale] + ".txt"; //printf("Read %s file... ", filename.c_str()); HANDLE fileHandle; @@ -287,7 +284,7 @@ uint32 ReadMapDBC(int const locale) { HANDLE localeFile; char localMPQ[512]; - sprintf(localMPQ, "%s/Data/%s/locale-%s.MPQ", input_path, langs[locale], langs[locale]); + sprintf(localMPQ, "%s/Data/%s/locale-%s.MPQ", input_path, Locales[locale], Locales[locale]); if (!SFileOpenArchive(localMPQ, 0, MPQ_OPEN_READ_ONLY, &localeFile)) exit(1); @@ -322,7 +319,7 @@ void ReadAreaTableDBC(int const locale) { HANDLE localeFile; char localMPQ[512]; - sprintf(localMPQ, "%s/Data/%s/locale-%s.MPQ", input_path, langs[locale], langs[locale]); + sprintf(localMPQ, "%s/Data/%s/locale-%s.MPQ", input_path, Locales[locale], Locales[locale]); if (!SFileOpenArchive(localMPQ, 0, MPQ_OPEN_READ_ONLY, &localeFile)) exit(1); @@ -360,7 +357,7 @@ void ReadLiquidTypeTableDBC(int const locale) { HANDLE localeFile; char localMPQ[512]; - sprintf(localMPQ, "%s/Data/%s/locale-%s.MPQ", input_path, langs[locale], langs[locale]); + sprintf(localMPQ, "%s/Data/%s/locale-%s.MPQ", input_path, Locales[locale], Locales[locale]); if (!SFileOpenArchive(localMPQ, 0, MPQ_OPEN_READ_ONLY, &localeFile)) exit(1); @@ -1086,14 +1083,14 @@ void ExtractDBCFiles(int locale, bool basicLocale) CreateDir(path); if (!basicLocale) { - path += langs[locale]; + path += Locales[locale]; path += "/"; CreateDir(path); } // extract Build info file { - std::string mpq_name = std::string("component.wow-") + langs[locale] + ".txt"; + std::string mpq_name = std::string("component.wow-") + Locales[locale] + ".txt"; std::string filename = path + mpq_name; ExtractFile(mpq_name.c_str(), filename); @@ -1177,7 +1174,7 @@ void LoadLocaleMPQFiles(int const locale) char filename[512]; // first base old version of dbc files - sprintf(filename, "%s/Data/%s/locale-%s.MPQ", input_path, langs[locale], langs[locale]); + sprintf(filename, "%s/Data/%s/locale-%s.MPQ", input_path, Locales[locale], Locales[locale]); HANDLE localeMpqHandle; @@ -1190,21 +1187,59 @@ void LoadLocaleMPQFiles(int const locale) // prepare sorted list patches in locale dir and Data root Updates updates; // now update to newer view, locale - AppendPatchMPQFilesToList(langs[locale], langs[locale], NULL, updates); + AppendPatchMPQFilesToList(Locales[locale], Locales[locale], NULL, updates); // now update to newer view, root - AppendPatchMPQFilesToList(NULL, NULL, langs[locale], updates); + AppendPatchMPQFilesToList(NULL, NULL, Locales[locale], updates); + + // ./Data wow-update-base files + for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i) + { + sprintf(filename, "%s/Data/wow-update-base-%u.MPQ", input_path, Builds[i]); + + printf("\nPatching : %s\n", filename); + + //if (!OpenArchive(filename)) + if (!SFileOpenPatchArchive(localeMpqHandle, filename, "", 0)) + printf("Error open patch archive: %s\n\n", filename); + } for (Updates::const_iterator itr = updates.begin(); itr != updates.end(); ++itr) { if (!itr->second.second) - sprintf(filename, "%s/Data/%s/%s", input_path, langs[locale], itr->second.first.c_str()); + sprintf(filename, "%s/Data/%s/%s", input_path, Locales[locale], itr->second.first.c_str()); else sprintf(filename, "%s/Data/%s", input_path, itr->second.first.c_str()); + printf("\nPatching : %s\n", filename); + //if (!OpenArchive(filename)) if (!SFileOpenPatchArchive(localeMpqHandle, filename, itr->second.second ? itr->second.second : "", 0)) printf("Error open patch archive: %s\n\n", filename); } + + // ./Data/Cache patch-base files + for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i) + { + sprintf(filename, "%s/Data/Cache/patch-base-%u.MPQ", input_path, Builds[i]); + + printf("\nPatching : %s\n", filename); + + //if (!OpenArchive(filename)) + if (!SFileOpenPatchArchive(localeMpqHandle, filename, "", 0)) + printf("Error open patch archive: %s\n\n", filename); + } + + // ./Data/Cache/ patch files + for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i) + { + sprintf(filename, "%s/Data/Cache/%s/patch-%s-%u.MPQ", input_path, Locales[locale], Locales[locale], Builds[i]); + + printf("\nPatching : %s\n", filename); + + //if (!OpenArchive(filename)) + if (!SFileOpenPatchArchive(localeMpqHandle, filename, "", 0)) + printf("Error open patch archive: %s\n\n", filename); + } } void LoadBaseMPQFiles() @@ -1244,6 +1279,7 @@ void LoadBaseMPQFiles() // now update to newer view, root -base AppendPatchMPQFilesToList(NULL, "base", NULL, updates); + // wow-update-base for (Updates::const_iterator itr = updates.begin(); itr != updates.end(); ++itr) { sprintf(filename, "%s/Data/%s", input_path, itr->second.first.c_str()); @@ -1255,7 +1291,19 @@ void LoadBaseMPQFiles() printf("Error open patch archive: %s\n\n", filename); return; } - } + } + + // ./Data/Cache patch-base files + for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i) + { + sprintf(filename, "%s/Data/Cache/patch-base-%u.MPQ", input_path, Builds[i]); + + printf("\nPatching : %s\n", filename); + + //if (!OpenArchive(filename)) + if (!SFileOpenPatchArchive(worldMpqHandle, filename, "", 0)) + printf("Error open patch archive: %s\n\n", filename); + } } int main(int argc, char* arg[]) @@ -1268,13 +1316,13 @@ int main(int argc, char* arg[]) int FirstLocale = -1; uint32 build = 0; - for (int i = 0; i < LANG_COUNT; i++) + for (int i = 0; i < LOCALES_COUNT; i++) { char tmp1[512]; - sprintf(tmp1, "%s/Data/%s/locale-%s.MPQ", input_path, langs[i], langs[i]); + sprintf(tmp1, "%s/Data/%s/locale-%s.MPQ", input_path, Locales[i], Locales[i]); if (FileExists(tmp1)) { - printf("Detected locale: %s\n", langs[i]); + printf("Detected locale: %s\n", Locales[i]); //Open MPQs LoadLocaleMPQFiles(i); @@ -1302,7 +1350,7 @@ int main(int argc, char* arg[]) CloseArchives(); } } - + if (FirstLocale < 0) { printf("No locales detected\n"); @@ -1311,11 +1359,11 @@ int main(int argc, char* arg[]) if (CONF_extract & EXTRACT_MAP) { - printf("Using locale: %s\n", langs[FirstLocale]); + printf("Using locale: %s\n", Locales[FirstLocale]); // Open MPQs LoadBaseMPQFiles(); - LoadLocaleMPQFiles(FirstLocale); + // LoadLocaleMPQFiles(FirstLocale); // Extract maps ExtractMapsFromMpq(build, FirstLocale); diff --git a/src/tools/Extractor_projects/shared/ExtractorCommon.h b/src/tools/Extractor_projects/shared/ExtractorCommon.h index bb0fdf1e4..1fc5658d9 100644 --- a/src/tools/Extractor_projects/shared/ExtractorCommon.h +++ b/src/tools/Extractor_projects/shared/ExtractorCommon.h @@ -26,6 +26,7 @@ #include #include #include +#include "sl/loadlib.h" FILE* openWoWExe(); int getBuildNumber(); @@ -41,7 +42,11 @@ bool isTransportMap(int mapID); bool shouldSkipMap(int mapID, bool m_skipContinents, bool m_skipJunkMaps, bool m_skipBattlegrounds); -static const char *langs[12] = { "enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" }; +uint32 const Builds[] = {13164, 13205, 13287, 13329, 13596, 13623, 13914, 14007, 14333, 14480, 14545, 15005, 15050, 15211, 15354, 15595, 0}; +static uint32 CONF_TargetBuild = 15595; // 4.3.4.15595 + +static char* const Locales[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU"}; +#define LOCALES_COUNT 12 /// Enumerated Core Numbers enum CoreNumber diff --git a/src/tools/Extractor_projects/vmap-extractor/vmapexport.cpp b/src/tools/Extractor_projects/vmap-extractor/vmapexport.cpp index 139a52e14..e94ac991d 100644 --- a/src/tools/Extractor_projects/vmap-extractor/vmapexport.cpp +++ b/src/tools/Extractor_projects/vmap-extractor/vmapexport.cpp @@ -64,8 +64,6 @@ HANDLE WorldMpq = NULL; HANDLE LocaleMpq = NULL; -uint32 CONF_TargetBuild = 15595; // 4.3.4.15595 - // List MPQ for extract maps from char const* CONF_mpq_list[] = { @@ -77,10 +75,8 @@ char const* CONF_mpq_list[] = "world2.MPQ", }; -uint32 const Builds[] = {13164, 13205, 13287, 13329, 13596, 13623, 13914, 14007, 14333, 14480, 14545, 15005, 15050, 15211, 15354, 15595, 0}; #define LAST_DBC_IN_DATA_BUILD 13623 // after this build mpqs with dbc are back to locale folder -char* const Locales[] = {"enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU"}; TCHAR* const LocalesT[] = { _T("enGB"), _T("enUS"), @@ -105,6 +101,7 @@ uint32 map_count; char output_path[128] = "."; char input_path[1024] = "."; bool preciseVectorData = true; +uint32 CONF_max_build = 0; // Constants @@ -126,41 +123,136 @@ bool FileExists(const char* file) return false; } -bool LoadLocaleMPQFile(int locale) +typedef std::pair < std::string /*full_filename*/, char const* /*locale_prefix*/ > UpdatesPair; +typedef std::map < int /*build*/, UpdatesPair > Updates; + +void AppendPatchMPQFilesToList(char const* subdir, char const* suffix, char const* section, Updates& updates) { - TCHAR buff[512]; - memset(buff, 0, sizeof(buff)); - _stprintf(buff, _T("%s/Data/%s/locale-%s.MPQ"), input_path, LocalesT[locale], LocalesT[locale]); - if (!SFileOpenArchive(buff, 0, MPQ_OPEN_READ_ONLY, &LocaleMpq)) + char dirname[512]; + if (subdir) + sprintf(dirname, "%s/Data/%s", input_path, subdir); + else + sprintf(dirname, "%s/Data", input_path); + + char scanname[512]; + if (suffix) + sprintf(scanname, "wow-update-%s-%%u.MPQ", suffix); + else + sprintf(scanname, "wow-update-%%u.MPQ"); + +#ifdef WIN32 + + char maskname[512]; + if (suffix) + sprintf(maskname, "%s/wow-update-%s-*.MPQ", dirname, suffix); + else + sprintf(maskname, "%s/wow-update-*.MPQ", dirname); + + WIN32_FIND_DATA ffd; + HANDLE hFind = FindFirstFile(maskname, &ffd); + + if (hFind != INVALID_HANDLE_VALUE) { - if (GetLastError() != ERROR_FILE_NOT_FOUND) - _tprintf(_T("Cannot open archive %s\n"), buff); + do + { + if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + continue; + + uint32 ubuild = 0; + if (sscanf(ffd.cFileName, scanname, &ubuild) == 1 && (!CONF_max_build || ubuild <= CONF_max_build)) + updates[ubuild] = UpdatesPair(ffd.cFileName, section); + } + while (FindNextFile(hFind, &ffd) != 0); + + FindClose(hFind); + } + +#else + + if (DIR* dp = opendir(dirname)) + { + int ubuild = 0; + dirent* dirp; + while ((dirp = readdir(dp)) != NULL) + if (sscanf(dirp->d_name, scanname, &ubuild) == 1 && (!CONF_max_build || ubuild <= CONF_max_build)) + updates[ubuild] = UpdatesPair(dirp->d_name, section); + + closedir(dp); + } + +#endif +} + +bool LoadLocaleMPQFile(int const locale) +{ + char filename[512]; + + // first base old version of dbc files + sprintf(filename, "%s/Data/%s/locale-%s.MPQ", input_path, Locales[locale], Locales[locale]); + + if (!OpenArchive(filename, &LocaleMpq)) + { + printf("Error open archive: %s\n\n", filename); return false; } - char const* prefix = NULL; + // prepare sorted list patches in locale dir and Data root + Updates updates; + // now update to newer view, locale + AppendPatchMPQFilesToList(Locales[locale], Locales[locale], NULL, updates); + // now update to newer view, root + AppendPatchMPQFilesToList(NULL, NULL, Locales[locale], updates); + + // ./Data wow-update-base files for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i) { - memset(buff, 0, sizeof(buff)); - if (Builds[i] > LAST_DBC_IN_DATA_BUILD) - { - prefix = ""; - _stprintf(buff, _T("%s/Data/%s/wow-update-%s-%u.MPQ"), input_path, LocalesT[locale], LocalesT[locale], Builds[i]); - } - else - { - prefix = Locales[locale]; - _stprintf(buff, _T("%s/Data/wow-update-%u.MPQ"), input_path, Builds[i]); - } + sprintf(filename, "%s/Data/wow-update-base-%u.MPQ", input_path, Builds[i]); - if (!SFileOpenPatchArchive(LocaleMpq, buff, prefix, 0)) - { - if (GetLastError() != ERROR_FILE_NOT_FOUND) - _tprintf(_T("Cannot open patch archive %s\n"), buff); - continue; - } + printf("\nPatching : %s\n", filename); + + //if (!OpenArchive(filename)) + if (!SFileOpenPatchArchive(LocaleMpq, filename, "", 0)) + printf("Error open patch archive: %s\n\n", filename); } + for (Updates::const_iterator itr = updates.begin(); itr != updates.end(); ++itr) + { + if (!itr->second.second) + sprintf(filename, "%s/Data/%s/%s", input_path, Locales[locale], itr->second.first.c_str()); + else + sprintf(filename, "%s/Data/%s", input_path, itr->second.first.c_str()); + + printf("\nPatching : %s\n", filename); + + //if (!OpenArchive(filename)) + if (!SFileOpenPatchArchive(LocaleMpq, filename, itr->second.second ? itr->second.second : "", 0)) + printf("Error open patch archive: %s\n\n", filename); + } + + // ./Data/Cache patch-base files + for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i) + { + sprintf(filename, "%s/Data/Cache/patch-base-%u.MPQ", input_path, Builds[i]); + + printf("\nPatching : %s\n", filename); + + //if (!OpenArchive(filename)) + if (!SFileOpenPatchArchive(LocaleMpq, filename, "", 0)) + printf("Error open patch archive: %s\n\n", filename); + } + + // ./Data/Cache/ patch files + for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i) + { + sprintf(filename, "%s/Data/Cache/%s/patch-%s-%u.MPQ", input_path, Locales[locale], Locales[locale], Builds[i]); + + printf("\nPatching : %s\n", filename); + + //if (!OpenArchive(filename)) + if (!SFileOpenPatchArchive(LocaleMpq, filename, "", 0)) + printf("Error open patch archive: %s\n\n", filename); + } + return true; } @@ -264,6 +356,17 @@ void LoadCommonMPQFiles(uint32 build) printf("Scanned %d files, found patch = %d\n", count, found); } } + + // ./Data/Cache patch-base files + for (int i = 0; Builds[i] && Builds[i] <= CONF_TargetBuild; ++i) + { + sprintf(filename, "%s/Data/Cache/patch-base-%u.MPQ", input_path, Builds[i]); + + printf("\nPatching : %s\n", filename); + + if (!SFileOpenPatchArchive(WorldMpq, filename, "", 0)) + printf("Error open patch archive: %s\n\n", filename); + } } void strToLower(char* str) {