All required patch files are now being applied (#123)

Not all required patch files were being applied during map and vmap
extraction/creation.

This fix has resulted in a few more (18) vmap files being created
This commit is contained in:
Charles A Edwards 2017-04-15 22:35:55 +01:00 committed by Antz
parent b1d0ca0647
commit 7e9c2628c2
3 changed files with 206 additions and 50 deletions

View file

@ -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<std::string>& 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/<locale> 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);

View file

@ -26,6 +26,7 @@
#include <stdlib.h>
#include <iostream>
#include <sstream>
#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

View file

@ -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/<locale> 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)
{