Merge branch 'develop' into runtime_errors
This commit is contained in:
@ -12,7 +12,7 @@ namespace Components
|
||||
|
||||
std::lock_guard<std::mutex> _(Changelog::Mutex);
|
||||
Changelog::Lines.clear();
|
||||
std::string data = Utils::Cache::GetFile("/iw4/changelog.txt");
|
||||
std::string data = Utils::Cache::GetFile("/develop/CHANGELOG.md");
|
||||
|
||||
if (data.empty())
|
||||
{
|
||||
|
@ -13,7 +13,7 @@ namespace Components
|
||||
~ClanTags();
|
||||
|
||||
private:
|
||||
static std::string ClanTags::Tags[18];
|
||||
static std::string Tags[18];
|
||||
|
||||
static void DrawPlayerNameOnScoreboard();
|
||||
|
||||
|
@ -31,7 +31,7 @@ namespace Components
|
||||
if (mode != "append"s && mode != "write"s)
|
||||
{
|
||||
Game::Com_Printf(0, "^3fileWrite: mode not defined or was wrong, defaulting to 'write'\n");
|
||||
mode = "write";
|
||||
mode = const_cast<char*>("write");
|
||||
}
|
||||
|
||||
if (mode == "write"s)
|
||||
|
@ -25,7 +25,7 @@ namespace Components
|
||||
|
||||
char* Command::ClientParams::get(size_t index)
|
||||
{
|
||||
if (index >= this->length()) return "";
|
||||
if (index >= this->length()) return const_cast<char*>("");
|
||||
return Game::cmd_argv[this->commandId][index];
|
||||
}
|
||||
|
||||
@ -36,7 +36,7 @@ namespace Components
|
||||
|
||||
char* Command::ServerParams::get(size_t index)
|
||||
{
|
||||
if (index >= this->length()) return "";
|
||||
if (index >= this->length()) return const_cast<char*>("");
|
||||
return Game::cmd_argv_sv[this->commandId][index];
|
||||
}
|
||||
|
||||
|
@ -537,7 +537,7 @@ namespace Components
|
||||
Console::Console()
|
||||
{
|
||||
// Console '%s: %s> ' string
|
||||
Utils::Hook::Set<char*>(0x5A44B4, "IW4x: " VERSION "> ");
|
||||
Utils::Hook::Set<const char*>(0x5A44B4, "IW4x: " VERSION "> ");
|
||||
|
||||
// Patch console color
|
||||
static float consoleColor[] = { 0.70f, 1.00f, 0.00f, 1.00f };
|
||||
|
@ -27,7 +27,7 @@ namespace Components
|
||||
return const_cast<char*>(this->dvar->current.string);
|
||||
}
|
||||
|
||||
return "";
|
||||
return const_cast<char*>("");
|
||||
}
|
||||
template <> const char* Dvar::Var::get()
|
||||
{
|
||||
|
@ -186,7 +186,7 @@ namespace Components
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> _(Friends::Mutex);
|
||||
|
||||
const unsigned int modId = *reinterpret_cast<unsigned int*>("IW4x") | 0x80000000;
|
||||
const unsigned int modId = *reinterpret_cast<unsigned int*>(const_cast<char*>("IW4x")) | 0x80000000;
|
||||
|
||||
// Split up the list
|
||||
for (auto entry : Friends::FriendsList)
|
||||
|
@ -766,8 +766,7 @@ namespace Components
|
||||
{
|
||||
if (pack.index == dlc)
|
||||
{
|
||||
News::LaunchUpdater(Utils::String::VA("-dlc %i -c", pack.index));
|
||||
//ShellExecuteA(nullptr, "open", pack.url.data(), nullptr, nullptr, SW_SHOWNORMAL);
|
||||
ShellExecute(0, 0, L"https://xlabs.dev/support_iw4x_client.html", 0, 0, SW_SHOW);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -907,6 +907,7 @@ namespace Components
|
||||
Menus::Add("ui_mp/pc_store.menu");
|
||||
Menus::Add("ui_mp/iw4x_credits.menu");
|
||||
Menus::Add("ui_mp/resetclass.menu");
|
||||
Menus::Add("ui_mp/popup_customtitle.menu");
|
||||
}
|
||||
|
||||
Menus::~Menus()
|
||||
|
@ -15,7 +15,7 @@ namespace Components
|
||||
|
||||
static void Add(const std::string& menu);
|
||||
|
||||
static Game::MenuList* Menus::LoadCustomMenuList(const std::string& menu, Utils::Memory::Allocator* allocator);
|
||||
static Game::MenuList* LoadCustomMenuList(const std::string& menu, Utils::Memory::Allocator* allocator);
|
||||
static std::vector<std::pair<bool, Game::menuDef_t*>> LoadMenu(Game::menuDef_t* menudef);
|
||||
static std::vector<std::pair<bool, Game::menuDef_t*>> LoadMenu(const std::string& file);
|
||||
|
||||
|
@ -364,7 +364,7 @@ namespace Components
|
||||
Utils::Hook::Set<BYTE>(0x4050A5, 125);
|
||||
|
||||
// Parse port as short in Net_AddrToString
|
||||
Utils::Hook::Set<char*>(0x4698E3, "%u.%u.%u.%u:%hu");
|
||||
Utils::Hook::Set<const char*>(0x4698E3, "%u.%u.%u.%u:%hu");
|
||||
|
||||
// Install startup handler
|
||||
Utils::Hook(0x4FD4D4, Network::NetworkStartStub, HOOK_JUMP).install()->quick();
|
||||
|
@ -6,9 +6,6 @@ namespace Components
|
||||
{
|
||||
bool News::Terminate;
|
||||
std::thread News::Thread;
|
||||
std::string News::UpdaterArgs;
|
||||
std::string News::UpdaterHash;
|
||||
std::mutex News::UpdaterMutex;
|
||||
|
||||
bool News::unitTest()
|
||||
{
|
||||
@ -33,165 +30,18 @@ namespace Components
|
||||
return result;
|
||||
}
|
||||
|
||||
void News::ExitProcessStub(unsigned int exitCode)
|
||||
{
|
||||
std::this_thread::sleep_for(10ms);
|
||||
|
||||
STARTUPINFOA sInfo;
|
||||
PROCESS_INFORMATION pInfo;
|
||||
|
||||
ZeroMemory(&sInfo, sizeof(sInfo));
|
||||
ZeroMemory(&pInfo, sizeof(pInfo));
|
||||
sInfo.cb = sizeof(sInfo);
|
||||
|
||||
CreateProcessA("updater.exe", const_cast<char*>(Utils::String::VA("updater.exe %s", News::UpdaterArgs.data())), nullptr, nullptr, false, NULL, nullptr, nullptr, &sInfo, &pInfo);
|
||||
|
||||
if (pInfo.hThread && pInfo.hThread != INVALID_HANDLE_VALUE) CloseHandle(pInfo.hThread);
|
||||
if (pInfo.hProcess && pInfo.hProcess != INVALID_HANDLE_VALUE) CloseHandle(pInfo.hProcess);
|
||||
|
||||
TerminateProcess(GetCurrentProcess(), exitCode);
|
||||
}
|
||||
|
||||
bool News::GetLatestUpdater()
|
||||
{
|
||||
std::lock_guard<std::mutex> _(News::UpdaterMutex);
|
||||
|
||||
if (Utils::IO::FileExists("updater.exe"))
|
||||
{
|
||||
// Generate hash of local updater.exe
|
||||
std::string localUpdater = Utils::IO::ReadFile("updater.exe");
|
||||
localUpdater = Utils::Cryptography::SHA1::Compute(localUpdater, true);
|
||||
|
||||
static Utils::Time::Interval updateInterval;
|
||||
if (News::UpdaterHash.empty() || updateInterval.elapsed(15min)) // Check for updater Update every 15 mins max
|
||||
{
|
||||
updateInterval.update();
|
||||
|
||||
std::string data = Utils::Cache::GetFile("/json/updater"); // {"updater.exe":{"SHA1":"*HASH*"}}
|
||||
|
||||
std::string error;
|
||||
json11::Json listData = json11::Json::parse(data, error);
|
||||
|
||||
if (error.empty() || listData.is_object())
|
||||
{
|
||||
News::UpdaterHash = listData["updater.exe"]["SHA1"].string_value();
|
||||
}
|
||||
}
|
||||
|
||||
if (!News::UpdaterHash.empty() && localUpdater != News::UpdaterHash)
|
||||
{
|
||||
remove("updater.exe");
|
||||
}
|
||||
}
|
||||
|
||||
if (!Utils::IO::FileExists("updater.exe"))
|
||||
{
|
||||
return News::DownloadUpdater();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool News::DownloadUpdater()
|
||||
{
|
||||
std::string data = Utils::Cache::GetFile("/iw4/updater.exe");
|
||||
|
||||
if (!data.empty())
|
||||
{
|
||||
Utils::IO::WriteFile("updater.exe", data);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
const char* News::GetNewsText()
|
||||
{
|
||||
return Localization::Get("MPUI_MOTD_TEXT");
|
||||
}
|
||||
|
||||
void News::CheckForUpdate()
|
||||
{
|
||||
std::string _client = Utils::Cache::GetFile("/json/client");
|
||||
|
||||
if (!_client.empty())
|
||||
{
|
||||
std::string error;
|
||||
json11::Json client = json11::Json::parse(_client.data(), error);
|
||||
|
||||
int revisionNumber;
|
||||
|
||||
if (client["revision"].is_number())
|
||||
{
|
||||
revisionNumber = client["revision"].int_value();
|
||||
}
|
||||
else if (client["revision"].is_string())
|
||||
{
|
||||
revisionNumber = atoi(client["revision"].string_value().data());
|
||||
}
|
||||
else return;
|
||||
|
||||
Dvar::Var("cl_updateversion").get<Game::dvar_t*>()->current.integer = revisionNumber;
|
||||
Dvar::Var("cl_updateavailable").get<Game::dvar_t*>()->current.enabled = (revisionNumber > REVISION);
|
||||
|
||||
// if there is an update then show the toast, but only once
|
||||
static bool showToast = true;
|
||||
if (revisionNumber > REVISION && showToast)
|
||||
{
|
||||
showToast = false;
|
||||
Scheduler::OnReady([]()
|
||||
{
|
||||
Toast::Show("cardicon_gears", "^4Update Available", "There is an update available for your client!", 5000);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void News::LaunchUpdater(const std::string& params)
|
||||
{
|
||||
if (News::Updating()) return;
|
||||
|
||||
News::UpdaterArgs = params;
|
||||
|
||||
Localization::SetTemp("MENU_RECONNECTING_TO_PARTY", "Downloading updater");
|
||||
Command::Execute("openmenu popup_reconnectingtoparty", true);
|
||||
|
||||
// Run the updater on shutdown
|
||||
Utils::Hook::Set(0x6D72A0, News::ExitProcessStub);
|
||||
|
||||
std::thread([]()
|
||||
{
|
||||
if (News::GetLatestUpdater())
|
||||
{
|
||||
Console::SetSkipShutdown();
|
||||
Command::Execute("wait 300; quit;", false);
|
||||
}
|
||||
else
|
||||
{
|
||||
Localization::ClearTemp();
|
||||
News::UpdaterArgs.clear();
|
||||
Command::Execute("closemenu popup_reconnectingtoparty", false);
|
||||
Game::ShowMessageBox("Failed to download the updater!", "Error");
|
||||
}
|
||||
}).detach();
|
||||
}
|
||||
|
||||
bool News::Updating()
|
||||
{
|
||||
return !News::UpdaterArgs.empty();
|
||||
}
|
||||
|
||||
News::News()
|
||||
{
|
||||
News::UpdaterArgs.clear();
|
||||
News::UpdaterHash.clear();
|
||||
if (ZoneBuilder::IsEnabled() || Dedicated::IsEnabled()) return; // Maybe also dedi?
|
||||
|
||||
Dvar::Register<bool>("g_firstLaunch", true, Game::DVAR_FLAG_SAVED, "");
|
||||
|
||||
Dvar::Register<int>("cl_updateoldversion", REVISION, REVISION, REVISION, Game::DVAR_FLAG_WRITEPROTECTED, "Current version number.");
|
||||
Dvar::Register<int>("cl_updateversion", 0, 0, -1, Game::DVAR_FLAG_WRITEPROTECTED, "New version number.");
|
||||
Dvar::Register<bool>("cl_updateavailable", false, Game::DVAR_FLAG_WRITEPROTECTED, "New update is available.");
|
||||
|
||||
UIScript::Add("checkFirstLaunch", [](UIScript::Token)
|
||||
{
|
||||
@ -221,8 +71,6 @@ namespace Components
|
||||
Localization::Set("MPUI_CHANGELOG_TEXT", "Loading...");
|
||||
Localization::Set("MPUI_MOTD_TEXT", NEWS_MOTD_DEFAULT);
|
||||
|
||||
//News::GetLatestUpdater();
|
||||
|
||||
// make newsfeed (ticker) menu items not cut off based on safe area
|
||||
Utils::Hook::Nop(0x63892D, 5);
|
||||
|
||||
@ -230,17 +78,6 @@ namespace Components
|
||||
Utils::Hook::Nop(0x6388BB, 2); // skip the "if (item->text[0] == '@')" localize check
|
||||
Utils::Hook(0x6388C1, News::GetNewsText, HOOK_CALL).install()->quick();
|
||||
|
||||
Command::Add("checkforupdate", [](Command::Params*)
|
||||
{
|
||||
News::CheckForUpdate();
|
||||
});
|
||||
|
||||
Command::Add("getautoupdate", [](Command::Params*)
|
||||
{
|
||||
if (!Dvar::Var("cl_updateavailable").get<Game::dvar_t*>()->current.enabled) return;
|
||||
News::LaunchUpdater("-update -c");
|
||||
});
|
||||
|
||||
if (!Utils::IsWineEnvironment() && !Loader::IsPerformingUnitTests())
|
||||
{
|
||||
News::Terminate = false;
|
||||
@ -257,12 +94,8 @@ namespace Components
|
||||
|
||||
if (!Loader::IsPerformingUnitTests() && !News::Terminate)
|
||||
{
|
||||
News::GetLatestUpdater();
|
||||
|
||||
while (!News::Terminate)
|
||||
{
|
||||
News::CheckForUpdate();
|
||||
|
||||
// Sleep for 3 minutes
|
||||
for (int i = 0; i < 180 && !News::Terminate; ++i)
|
||||
{
|
||||
@ -274,12 +107,6 @@ namespace Components
|
||||
}
|
||||
}
|
||||
|
||||
News::~News()
|
||||
{
|
||||
News::UpdaterArgs.clear();
|
||||
News::UpdaterHash.clear();
|
||||
}
|
||||
|
||||
void News::preDestroy()
|
||||
{
|
||||
News::Terminate = true;
|
||||
|
@ -6,27 +6,16 @@ namespace Components
|
||||
{
|
||||
public:
|
||||
News();
|
||||
~News();
|
||||
|
||||
void preDestroy() override;
|
||||
bool unitTest() override;
|
||||
|
||||
static void LaunchUpdater(const std::string& params);
|
||||
static bool Updating();
|
||||
|
||||
private:
|
||||
static std::string UpdaterArgs;
|
||||
static std::string UpdaterHash;
|
||||
static std::thread Thread;
|
||||
static std::mutex UpdaterMutex;
|
||||
|
||||
static bool Terminate;
|
||||
static bool GetLatestUpdater();
|
||||
static bool DownloadUpdater();
|
||||
|
||||
static void CheckForUpdate();
|
||||
static void ExitProcessStub(unsigned int exitCode);
|
||||
|
||||
static const char* GetNewsText();
|
||||
};
|
||||
}
|
||||
|
@ -210,7 +210,7 @@ namespace Components
|
||||
// Force xblive_privatematch 0 and rename it
|
||||
//Utils::Hook::Set<BYTE>(0x420A6A, 4);
|
||||
Utils::Hook::Set<BYTE>(0x420A6C, 0);
|
||||
Utils::Hook::Set<char*>(0x420A6E, "xblive_privateserver");
|
||||
Utils::Hook::Set<const char*>(0x420A6E, "xblive_privateserver");
|
||||
|
||||
// Remove migration shutdown, it causes crashes and will be destroyed when erroring anyways
|
||||
Utils::Hook::Nop(0x5A8E1C, 12);
|
||||
@ -244,9 +244,9 @@ namespace Components
|
||||
//Utils::Hook(0x4D5D51, Party::RegisterMinPlayers, HOOK_CALL).install()->quick();
|
||||
|
||||
// Set ui_maxclients to sv_maxclients
|
||||
Utils::Hook::Set<char*>(0x42618F, "sv_maxclients");
|
||||
Utils::Hook::Set<char*>(0x4D3756, "sv_maxclients");
|
||||
Utils::Hook::Set<char*>(0x5E3772, "sv_maxclients");
|
||||
Utils::Hook::Set<const char*>(0x42618F, "sv_maxclients");
|
||||
Utils::Hook::Set<const char*>(0x4D3756, "sv_maxclients");
|
||||
Utils::Hook::Set<const char*>(0x5E3772, "sv_maxclients");
|
||||
|
||||
// Unlatch maxclient dvars
|
||||
Utils::Hook::Xor<BYTE>(0x426187, Game::dvar_flag::DVAR_FLAG_LATCHED);
|
||||
|
@ -150,7 +150,7 @@ namespace Components
|
||||
Playlist::Playlist()
|
||||
{
|
||||
// Default playlists
|
||||
Utils::Hook::Set<char*>(0x60B06E, "playlists_default.info");
|
||||
Utils::Hook::Set<const char*>(0x60B06E, "playlists_default.info");
|
||||
|
||||
// disable playlist download function
|
||||
Utils::Hook::Set<BYTE>(0x4D4790, 0xC3);
|
||||
|
@ -159,7 +159,7 @@ namespace Components
|
||||
|
||||
__declspec(naked) void QuickPatch::InvalidNameStub()
|
||||
{
|
||||
static char* kick_reason = "Invalid name detected.";
|
||||
static const char* kick_reason = "Invalid name detected.";
|
||||
|
||||
__asm
|
||||
{
|
||||
@ -216,11 +216,11 @@ namespace Components
|
||||
{
|
||||
static std::vector < char * > values =
|
||||
{
|
||||
"auto",
|
||||
"standard",
|
||||
"wide 16:10",
|
||||
"wide 16:9",
|
||||
"custom",
|
||||
const_cast<char*>("auto"),
|
||||
const_cast<char*>("standard"),
|
||||
const_cast<char*>("wide 16:10"),
|
||||
const_cast<char*>("wide 16:9"),
|
||||
const_cast<char*>("custom"),
|
||||
nullptr,
|
||||
};
|
||||
|
||||
@ -443,16 +443,16 @@ namespace Components
|
||||
Utils::Hook::Set<DWORD>(0x45ACE0, 0xC301B0);
|
||||
|
||||
// fs_basegame
|
||||
Utils::Hook::Set<char*>(0x6431D1, BASEGAME);
|
||||
Utils::Hook::Set<const char*>(0x6431D1, BASEGAME);
|
||||
|
||||
// UI version string
|
||||
Utils::Hook::Set<char*>(0x43F73B, "IW4x: " VERSION);
|
||||
Utils::Hook::Set<const char*>(0x43F73B, "IW4x: " VERSION);
|
||||
|
||||
// console version string
|
||||
Utils::Hook::Set<char*>(0x4B12BB, "IW4x " VERSION " (built " __DATE__ " " __TIME__ ")");
|
||||
Utils::Hook::Set<const char*>(0x4B12BB, "IW4x " VERSION " (built " __DATE__ " " __TIME__ ")");
|
||||
|
||||
// version string
|
||||
Utils::Hook::Set<char*>(0x60BD56, "IW4x (" VERSION ")");
|
||||
Utils::Hook::Set<const char*>(0x60BD56, "IW4x (" VERSION ")");
|
||||
|
||||
// version string color
|
||||
static float buildLocColor[] = { 1.0f, 1.0f, 1.0f, 0.8f };
|
||||
@ -469,33 +469,33 @@ namespace Components
|
||||
// console title
|
||||
if (ZoneBuilder::IsEnabled())
|
||||
{
|
||||
Utils::Hook::Set<char*>(0x4289E8, "IW4x (" VERSION "): ZoneBuilder");
|
||||
Utils::Hook::Set<const char*>(0x4289E8, "IW4x (" VERSION "): ZoneBuilder");
|
||||
}
|
||||
else if (Dedicated::IsEnabled())
|
||||
{
|
||||
Utils::Hook::Set<char*>(0x4289E8, "IW4x (" VERSION "): Dedicated");
|
||||
Utils::Hook::Set<const char*>(0x4289E8, "IW4x (" VERSION "): Dedicated");
|
||||
}
|
||||
else
|
||||
{
|
||||
Utils::Hook::Set<char*>(0x4289E8, "IW4x (" VERSION "): Console");
|
||||
Utils::Hook::Set<const char*>(0x4289E8, "IW4x (" VERSION "): Console");
|
||||
}
|
||||
|
||||
// window title
|
||||
Utils::Hook::Set<char*>(0x5076A0, "IW4x: Multiplayer");
|
||||
Utils::Hook::Set<const char*>(0x5076A0, "IW4x: Multiplayer");
|
||||
|
||||
// sv_hostname
|
||||
Utils::Hook::Set<char*>(0x4D378B, "IW4Host");
|
||||
Utils::Hook::Set<const char*>(0x4D378B, "IW4Host");
|
||||
|
||||
// shortversion
|
||||
Utils::Hook::Set<char*>(0x60BD91, SHORTVERSION);
|
||||
Utils::Hook::Set<const char*>(0x60BD91, SHORTVERSION);
|
||||
|
||||
// console logo
|
||||
Utils::Hook::Set<char*>(0x428A66, BASEGAME "/images/logo.bmp");
|
||||
Utils::Hook::Set<const char*>(0x428A66, BASEGAME "/images/logo.bmp");
|
||||
|
||||
// splash logo
|
||||
Utils::Hook::Set<char*>(0x475F9E, BASEGAME "/images/splash.bmp");
|
||||
Utils::Hook::Set<const char*>(0x475F9E, BASEGAME "/images/splash.bmp");
|
||||
|
||||
Utils::Hook::Set<char*>(0x4876C6, "Successfully read stats data\n");
|
||||
Utils::Hook::Set<const char*>(0x4876C6, "Successfully read stats data\n");
|
||||
|
||||
// Numerical ping (cg_scoreboardPingText 1)
|
||||
Utils::Hook::Set<BYTE>(0x45888E, 1);
|
||||
@ -596,21 +596,21 @@ namespace Components
|
||||
// intro stuff
|
||||
Utils::Hook::Nop(0x60BEE9, 5); // Don't show legals
|
||||
Utils::Hook::Nop(0x60BEF6, 5); // Don't reset the intro dvar
|
||||
Utils::Hook::Set<char*>(0x60BED2, "unskippablecinematic IW_logo\n");
|
||||
Utils::Hook::Set<char*>(0x51C2A4, "%s\\" BASEGAME "\\video\\%s.bik");
|
||||
Utils::Hook::Set<const char*>(0x60BED2, "unskippablecinematic IW_logo\n");
|
||||
Utils::Hook::Set<const char*>(0x51C2A4, "%s\\" BASEGAME "\\video\\%s.bik");
|
||||
Utils::Hook::Set<DWORD>(0x51C2C2, 0x78A0AC);
|
||||
|
||||
// Redirect logs
|
||||
Utils::Hook::Set<char*>(0x5E44D8, "logs/games_mp.log");
|
||||
Utils::Hook::Set<char*>(0x60A90C, "logs/console_mp.log");
|
||||
Utils::Hook::Set<char*>(0x60A918, "logs/console_mp.log");
|
||||
Utils::Hook::Set<const char*>(0x5E44D8, "logs/games_mp.log");
|
||||
Utils::Hook::Set<const char*>(0x60A90C, "logs/console_mp.log");
|
||||
Utils::Hook::Set<const char*>(0x60A918, "logs/console_mp.log");
|
||||
|
||||
// Rename config
|
||||
Utils::Hook::Set<char*>(0x461B4B, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<char*>(0x47DCBB, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<char*>(0x6098F8, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<char*>(0x60B279, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<char*>(0x60BBD4, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<const char*>(0x461B4B, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<const char*>(0x47DCBB, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<const char*>(0x6098F8, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<const char*>(0x60B279, CLIENT_CONFIG);
|
||||
Utils::Hook::Set<const char*>(0x60BBD4, CLIENT_CONFIG);
|
||||
|
||||
// Disable profile system
|
||||
// Utils::Hook::Nop(0x60BEB1, 5); // GamerProfile_InitAllProfiles - Causes an error, when calling a harrier killstreak.
|
||||
|
@ -7,6 +7,6 @@ namespace Components
|
||||
public:
|
||||
RawFiles();
|
||||
|
||||
static void* RawFiles::LoadModdableRawfileFunc(const char* filename);
|
||||
static void* LoadModdableRawfileFunc(const char* filename);
|
||||
};
|
||||
}
|
||||
|
@ -371,7 +371,7 @@ namespace Components
|
||||
UIFeeder::Add(10.0f, Theatre::GetDemoCount, Theatre::GetDemoText, Theatre::SelectDemo);
|
||||
|
||||
// set the configstrings stuff to load the default (empty) string table; this should allow demo recording on all gametypes/maps
|
||||
if (!Dedicated::IsEnabled()) Utils::Hook::Set<char*>(0x47440B, "mp/defaultStringTable.csv");
|
||||
if (!Dedicated::IsEnabled()) Utils::Hook::Set<const char*>(0x47440B, "mp/defaultStringTable.csv");
|
||||
|
||||
// Change font size
|
||||
Utils::Hook::Set<BYTE>(0x5AC854, 2);
|
||||
|
@ -22,7 +22,7 @@ namespace Components
|
||||
return this->token;
|
||||
}
|
||||
|
||||
return "";
|
||||
return const_cast<char*>("");
|
||||
}
|
||||
|
||||
template<> const char* UIScript::Token::get()
|
||||
|
@ -510,7 +510,7 @@ namespace Components
|
||||
// Add branding asset
|
||||
void ZoneBuilder::Zone::addBranding()
|
||||
{
|
||||
char* data = "FastFile built using the IW4x ZoneBuilder!";
|
||||
const char* data = "FastFile built using the IW4x ZoneBuilder!";
|
||||
this->branding = { this->zoneName.data(), static_cast<int>(strlen(data)), 0, data };
|
||||
|
||||
if (this->findAsset(Game::XAssetType::ASSET_TYPE_RAWFILE, this->branding.name) != -1)
|
||||
@ -1306,7 +1306,7 @@ namespace Components
|
||||
|
||||
// HACK: set language to 'techsets' to load from that dir
|
||||
char* language = Utils::Hook::Get<char*>(0x649E740);
|
||||
Utils::Hook::Set<char*>(0x649E740, "techsets");
|
||||
Utils::Hook::Set<const char*>(0x649E740, "techsets");
|
||||
|
||||
// load generated techset fastfiles
|
||||
auto list = Utils::IO::ListFiles("zone/techsets");
|
||||
@ -1366,7 +1366,7 @@ namespace Components
|
||||
info.freeFlags = Game::DB_ZONE_MOD;
|
||||
Game::DB_LoadXAssets(&info, 1, true);
|
||||
|
||||
Utils::Hook::Set<char*>(0x649E740, "techsets");
|
||||
Utils::Hook::Set<const char*>(0x649E740, "techsets");
|
||||
|
||||
i = 0;
|
||||
subCount++;
|
||||
|
@ -693,7 +693,7 @@ namespace Game
|
||||
|
||||
void Vec3Normalize(vec3_t& vec)
|
||||
{
|
||||
const auto length = std::sqrt(std::pow(vec[0], 2) + std::pow(vec[1], 2) + std::pow(vec[2], 2));
|
||||
const float length = static_cast<float>(std::sqrt(std::pow(vec[0], 2) + std::pow(vec[1], 2) + std::pow(vec[2], 2)));
|
||||
vec[0] /= length;
|
||||
vec[1] /= length;
|
||||
vec[2] /= length;
|
||||
|
@ -24,7 +24,7 @@ namespace Steam
|
||||
{
|
||||
if (Components::Dedicated::IsEnabled() || Components::ZoneBuilder::IsEnabled()) // Dedi guid
|
||||
{
|
||||
idBits = *reinterpret_cast<unsigned __int64*>(static_cast<char*>("DEDICATE"));
|
||||
idBits = *reinterpret_cast<unsigned __int64*>(const_cast<char*>("DEDICATE"));
|
||||
}
|
||||
else if (Components::Singleton::IsFirstInstance()) // ECDSA guid
|
||||
{
|
||||
|
@ -154,7 +154,7 @@ namespace Steam
|
||||
gameID.type = 1; // k_EGameIDTypeGameMod
|
||||
gameID.appID = Proxy::AppId & 0xFFFFFF;
|
||||
|
||||
char* modId = "IW4x";
|
||||
char* modId = const_cast<char*>("IW4x");
|
||||
gameID.modID = *reinterpret_cast<unsigned int*>(modId) | 0x80000000;
|
||||
|
||||
Interface clientUtils(Proxy::ClientEngine->GetIClientUtils(Proxy::SteamPipe));
|
||||
@ -194,7 +194,7 @@ namespace Steam
|
||||
|
||||
void Proxy::RunMod()
|
||||
{
|
||||
char* command = "-proc ";
|
||||
const char* command = "-proc ";
|
||||
char* parentProc = strstr(GetCommandLineA(), command);
|
||||
|
||||
if (parentProc)
|
||||
|
@ -111,7 +111,8 @@ namespace Steam
|
||||
{
|
||||
bool SteamAPI_Init()
|
||||
{
|
||||
Proxy::SetGame(10190);
|
||||
//The latest steam update has broke IW4x's steam integration. As of now the best way of dealing with this is to just disable it. This has been commented out so that if fixed, this may be easily enabled once again.
|
||||
/*Proxy::SetGame(10190);
|
||||
|
||||
if (!Proxy::Inititalize())
|
||||
{
|
||||
@ -122,7 +123,7 @@ namespace Steam
|
||||
{
|
||||
Proxy::SetMod("IW4x: Modern Warfare 2");
|
||||
Proxy::RunGame();
|
||||
}
|
||||
}*/
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -4,27 +4,15 @@ namespace Utils
|
||||
{
|
||||
const char* Cache::Urls[] =
|
||||
{
|
||||
"https://iw4x.org",
|
||||
"https://xlabs.dev",
|
||||
"https://raw.githubusercontent.com/XLabsProject/iw4x-client"
|
||||
|
||||
"https://iw4xcachep26muba.onion.to",
|
||||
"https://iw4xcachep26muba.tor2web.xyz",
|
||||
"https://iw4xcachep26muba.onion.ws",
|
||||
"https://iw4xcachep26muba.onion.sh",
|
||||
"https://iw4xcachep26muba.onion.pet",
|
||||
//Links to old onion site - deprecated
|
||||
//"https://iw4xcachep26muba.tor2web.xyz",
|
||||
//"https://iw4xcachep26muba.onion.ws",
|
||||
//"https://iw4xcachep26muba.onion.sh",
|
||||
//"https://iw4xcachep26muba.onion.pet",
|
||||
|
||||
// Links below are dead
|
||||
// Still, let's keep them in case they come back
|
||||
"https://iw4xcachep26muba.onion.rip",
|
||||
"https://iw4xcachep26muba.onion.nu",
|
||||
"https://iw4xcachep26muba.onion.guide",
|
||||
"https://iw4xcachep26muba.onion.casa",
|
||||
"https://iw4xcachep26muba.hiddenservice.net",
|
||||
"https://iw4xcachep26muba.onion.cab",
|
||||
"https://iw4xcachep26muba.onion.link",
|
||||
|
||||
// Not registered yet
|
||||
//"https://iw4xcachejnetuln.onion.to",
|
||||
//"https://iw4xcachedjodc4y.onion.to",
|
||||
};
|
||||
std::string Cache::ValidUrl;
|
||||
std::mutex Cache::CacheMutex;
|
||||
|
@ -18,7 +18,7 @@ namespace Utils
|
||||
{
|
||||
if (this->tokenString.empty())
|
||||
{
|
||||
this->tokenString.append(reinterpret_cast<uint8_t*>("\0"), 1);
|
||||
this->tokenString.append(reinterpret_cast<uint8_t*>(const_cast<char *>("\0")), 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -31,7 +31,7 @@ namespace Utils
|
||||
if (!i)
|
||||
{
|
||||
// Prepend here, as /dev/urandom says so ;) https://github.com/IW4x/iw4x-client-node/wikis/technical-information#incrementing-the-token
|
||||
this->tokenString = std::basic_string<uint8_t>(reinterpret_cast<uint8_t*>("\0"), 1) + this->tokenString;
|
||||
this->tokenString = std::basic_string<uint8_t>(reinterpret_cast<uint8_t*>(const_cast<char*>("\0")), 1) + this->tokenString;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -2,9 +2,9 @@
|
||||
|
||||
namespace Utils
|
||||
{
|
||||
Library::Library(const std::string& buffer, bool _freeOnDestroy) : module(nullptr), freeOnDestroy(_freeOnDestroy)
|
||||
Library::Library(const std::string& buffer, bool _freeOnDestroy) : _module(nullptr), freeOnDestroy(_freeOnDestroy)
|
||||
{
|
||||
this->module = LoadLibraryExA(buffer.data(), nullptr, 0);
|
||||
this->_module = LoadLibraryExA(buffer.data(), nullptr, 0);
|
||||
}
|
||||
|
||||
Library::~Library()
|
||||
@ -22,7 +22,7 @@ namespace Utils
|
||||
|
||||
HMODULE Library::getModule()
|
||||
{
|
||||
return this->module;
|
||||
return this->_module;
|
||||
}
|
||||
|
||||
void Library::free()
|
||||
@ -32,6 +32,6 @@ namespace Utils
|
||||
FreeLibrary(this->getModule());
|
||||
}
|
||||
|
||||
this->module = nullptr;
|
||||
this->_module = nullptr;
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ namespace Utils
|
||||
class Library
|
||||
{
|
||||
public:
|
||||
Library() : module(nullptr), freeOnDestroy(false) {};
|
||||
Library() : _module(nullptr), freeOnDestroy(false) {};
|
||||
Library(const std::string& buffer, bool freeOnDestroy = true);
|
||||
~Library();
|
||||
|
||||
@ -26,7 +26,7 @@ namespace Utils
|
||||
void free();
|
||||
|
||||
private:
|
||||
HMODULE module;
|
||||
HMODULE _module;
|
||||
bool freeOnDestroy;
|
||||
};
|
||||
}
|
||||
|
@ -149,7 +149,7 @@ namespace Utils
|
||||
|
||||
std::string FormatBandwidth(size_t bytes, int milliseconds)
|
||||
{
|
||||
static char* sizes[] =
|
||||
static const char* sizes[] =
|
||||
{
|
||||
"B",
|
||||
"KB",
|
||||
|
@ -13,7 +13,7 @@ namespace Utils
|
||||
VAProvider() : currentBuffer(0) {}
|
||||
~VAProvider() {}
|
||||
|
||||
char* get(const char* format, va_list ap)
|
||||
const char* get(const char* format, va_list ap)
|
||||
{
|
||||
++this->currentBuffer %= ARRAYSIZE(this->stringPool);
|
||||
auto entry = &this->stringPool[this->currentBuffer];
|
||||
|
@ -15,7 +15,7 @@ namespace Utils
|
||||
bool IsWineEnvironment();
|
||||
|
||||
unsigned long GetParentProcessId();
|
||||
size_t GetModuleSize(HMODULE module);
|
||||
size_t GetModuleSize(HMODULE);
|
||||
void* GetThreadStartAddress(HANDLE hThread);
|
||||
HMODULE GetNTDLL();
|
||||
|
||||
|
Reference in New Issue
Block a user