mirror of
https://github.com/mangosfour/server.git
synced 2025-12-12 10:37:03 +00:00
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:
parent
b1d0ca0647
commit
7e9c2628c2
3 changed files with 206 additions and 50 deletions
|
|
@ -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());
|
||||
|
|
@ -1256,6 +1292,18 @@ void LoadBaseMPQFiles()
|
|||
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);
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,39 +123,134 @@ 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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue