2023-10-24 10:16:45 -04:00
|
|
|
#include "patch.h"
|
|
|
|
#include "game_inc.h"
|
|
|
|
|
|
|
|
int iTick = 0;
|
|
|
|
bool bFinished;
|
|
|
|
bool btoggle;
|
|
|
|
|
2023-10-25 13:26:27 -04:00
|
|
|
dvar_t* cl_textChatEnabled = reinterpret_cast<dvar_t*>(0x14EEB0738_g);
|
|
|
|
dvar_t* com_timescale = reinterpret_cast<dvar_t*>(0x14D3865E8_g);
|
|
|
|
|
2023-10-24 10:16:45 -04:00
|
|
|
uintptr_t xuid_generated;
|
|
|
|
int collision_ticker;
|
|
|
|
void R_EndFrame_Detour()
|
|
|
|
{
|
2023-10-25 13:26:27 -04:00
|
|
|
if (strcmp(Dvar_GetStringSafe("NSQLTTMRMP"), "mp_donetsk") == 0)
|
|
|
|
{
|
2023-10-24 10:16:45 -04:00
|
|
|
*reinterpret_cast<int*>(0x14E385A68_g) = 80;
|
|
|
|
*reinterpret_cast<int*>(0x14E385A78_g) = 80;
|
|
|
|
if (collision_ticker == 60) {
|
|
|
|
btoggle = !btoggle;
|
|
|
|
*reinterpret_cast<int*>(0x145CC7555_g) = btoggle; // s_transientsCollisionMP_LobbyToGameStart
|
|
|
|
}
|
|
|
|
collision_ticker++;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
*reinterpret_cast<int*>(0x14E385A68_g) = 1000;
|
|
|
|
*reinterpret_cast<int*>(0x14E385A78_g) = 1000;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!bFinished) {
|
|
|
|
if (iTick == 500) {
|
|
|
|
DWORD flOldProtect;
|
|
|
|
XUID xuid;
|
|
|
|
xuid.RandomXUID();
|
|
|
|
utils::hook::set<int>(0x144622BE0_g, 1);
|
|
|
|
|
|
|
|
utils::hook::set<uintptr_t>(0x14E5C07C0_g, 0x11CB1243B8D7C31E | xuid.m_id * xuid.m_id);
|
|
|
|
utils::hook::set<uintptr_t>(0x14F05ACE8_g, 0x11CB1243B8D7C31E | xuid.m_id * xuid.m_id);
|
|
|
|
|
|
|
|
utils::hook::set<uintptr_t>(0x14E5C07E8_g, 0x11CB1243B8D7C31E | (xuid.m_id * xuid.m_id) / 6); // s_presenceData
|
|
|
|
|
|
|
|
utils::hook::set<int>(0x14E371231_g, 1);
|
|
|
|
utils::hook::set<int>(0x144622910_g, 2);
|
|
|
|
utils::hook::set<int>(0x144622BE0_g, 1);
|
|
|
|
|
|
|
|
utils::hook::set<char>(*reinterpret_cast<uintptr_t*>(0x14EE560B0_g) + 0x28, 0);
|
|
|
|
utils::hook::set(0x14E5C0730_g, 2);
|
|
|
|
|
|
|
|
auto get_bnet_class = reinterpret_cast<uintptr_t(*)()>(0x141660280_g);
|
|
|
|
uintptr_t bnet_class = get_bnet_class();
|
|
|
|
*(DWORD*)(bnet_class + 0x2F4) = 0x795230F0;
|
|
|
|
*(DWORD*)(bnet_class + 0x2FC) = 0;
|
|
|
|
*(BYTE*)(bnet_class + 0x2F8) = 31;
|
|
|
|
|
|
|
|
printf("LOADED!\n");
|
|
|
|
bFinished = true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
iTick += 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
r_endframe.stub<void>();
|
|
|
|
}
|
|
|
|
|
|
|
|
const char* username_Detour()
|
|
|
|
{
|
|
|
|
if (player_name) {
|
|
|
|
return player_name->current.string;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return "Unknown Name";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void GScr_SpawnBrCircle_Detour(uintptr_t scrContext)
|
|
|
|
{
|
|
|
|
if (spawn_br_gas->current.enabled) {
|
|
|
|
gscr_spawnbrcircle.stub<void>(scrContext);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Live_IsUserSignedInToDemonware_Detour()
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
int dwGetLogOnStatus_Detour()
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
int LiveStorage_GetActiveStatsSource_Detour()
|
|
|
|
{
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void hooks()
|
|
|
|
{
|
|
|
|
process_script_file.create(0x141322350_g, ProcessScriptFile);
|
|
|
|
|
|
|
|
//utils::hook::jump(0x141BD3360_g, sub_141BD3360_Detour);
|
|
|
|
|
|
|
|
//sub_141BD3360.create(0x141BD3360_g, sub_141BD3360_Detour);
|
|
|
|
|
|
|
|
// utils::hook::copy(0x1530AD525_g, data_buf, 0x12856B); // Splash screen data
|
|
|
|
|
|
|
|
sv_updateuserinfo_detour.create(0x14136d0c0_g, SV_UpdateUserinfo_f);
|
|
|
|
|
|
|
|
db_findxassetheader.create(0x1411AA890_g, DB_FindXAssetHeader_Detour);
|
|
|
|
db_getrawbufferinflate.create(0x1412C2AE0_g, DB_GetRawBufferInflate_Detour);
|
|
|
|
ddl_setuint.create(0x1420529C0_g, DDL_SetUInt_Detour);
|
|
|
|
//db_pollfastfilestate.create(0x1411ADD00_g, DB_PollFastfileState_Detour);
|
|
|
|
|
|
|
|
load_mapentsasset.create(0x140F61690_g, Load_MapEntsAsset_Detour);
|
|
|
|
load_clipmapasset.create(0x140F60F40_g, Load_ClipMapAsset_Detour);
|
|
|
|
load_xmodelasset.create(0x140F62290_g, Load_XModelAsset_Detour);
|
|
|
|
//load_ttfasset.create(0x140F61F40_g, Load_TTFAsset_Detour);
|
|
|
|
|
|
|
|
db_getrawbuffer.create(0x1412C29A0_g, DB_GetRawBuffer_Detour);
|
|
|
|
|
|
|
|
utils::hook::jump(0x141528490_g, Live_IsUserSignedInToDemonware_Detour);
|
|
|
|
utils::hook::jump(0x1417EC930_g, dwGetLogOnStatus_Detour);
|
|
|
|
utils::hook::jump(0x1412A1EB0_g, LiveStorage_GetActiveStatsSource_Detour);
|
|
|
|
utils::hook::jump(0x1419B96A0_g, LuaShared_LuaCall_IsDemoBuild_Detour);
|
|
|
|
|
|
|
|
dvar_findvarbyname.create(0x1413E63A0_g, Dvar_FindVarByName_Detour);
|
|
|
|
|
|
|
|
db_loadxfile.create(0x1411A79F0_g, DB_LoadXFile_Detour);
|
|
|
|
CL_TransientsMP_ProcessLoadingQueue.create(0x1415F7BF0_g, CL_TransientsMP_ProcessLoadingQueue_Detour);
|
|
|
|
|
|
|
|
lui_cod_registerdvars.create(0x1419D4500_g, LUI_CoD_RegisterDvars_Detour);
|
|
|
|
net_outofbanddata.create(0x1412BB350_g, NET_OutOfBandData_Detour);
|
|
|
|
cl_keys_event.create(0x1415BEB80_g, CL_Keys_Event_Detour);
|
|
|
|
dvar_registerbool.create(0x1413E7670_g, Dvar_RegisterBool_Detour);
|
|
|
|
dvar_registerstring.create(0x1413E7A70_g, Dvar_RegisterString_Detour);
|
|
|
|
seh_stringed_getstring.create(0x1413CC2A0_g, SEH_StringEd_GetString_Detour);
|
|
|
|
|
|
|
|
cl_createdevgui.create(0x1415B2080_g, CL_CreateDevGui_Detour);
|
2023-10-30 13:00:30 -04:00
|
|
|
cg_mainmp_init.create(0x141792E60_g, CG_MainMP_Init_Detour);
|
2023-10-24 10:16:45 -04:00
|
|
|
|
|
|
|
PM_WeaponUseAmmo.create(0x141155AF0_g, PM_WeaponUseAmmo_Detour);
|
|
|
|
|
|
|
|
com_gamemode_supportsfeature.create(0x1410C8980_g, Com_GameMode_SupportsFeature_Detour);
|
|
|
|
|
2023-10-26 19:39:06 -04:00
|
|
|
lui_cod_luacall_enginenotifyserver_detour_impl.create(0x1419F7160_g, LUI_CoD_LuaCall_EngineNotifyServer_Detour);
|
2023-10-25 13:26:27 -04:00
|
|
|
|
|
|
|
// remove FF Header version check
|
|
|
|
// db_checkxfileversion.create(0x1411A7840_g, DB_CheckXFileVersion_Detour);
|
2023-10-24 10:16:45 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
void patchGame()
|
|
|
|
{
|
|
|
|
hooks();
|
|
|
|
|
|
|
|
// patch ui_maxclients limit
|
|
|
|
utils::hook::nop(0x140F30210_g, 5);
|
|
|
|
utils::hook::nop(0x14119E51D_g, 5);
|
|
|
|
utils::hook::nop(0x14136B8F8_g, 5);
|
|
|
|
utils::hook::nop(0x1416029F0_g, 5);
|
|
|
|
utils::hook::nop(0x1419E19A3_g, 5);
|
|
|
|
|
|
|
|
// patch party_maxplayers limit
|
|
|
|
utils::hook::nop(0x140F252EE_g, 5);
|
|
|
|
utils::hook::nop(0x14119D23F_g, 5);
|
|
|
|
utils::hook::nop(0x1410769B9_g, 5);
|
|
|
|
utils::hook::set(0x1410769B9_g, 0xC3);
|
|
|
|
utils::hook::nop(0x140F24B4B_g, 5);
|
|
|
|
utils::hook::set(0x140F24B4B_g, 0xC3);
|
|
|
|
utils::hook::nop(0x1416029E2_g, 5);
|
|
|
|
utils::hook::nop(0x14119E52B_g, 5);
|
|
|
|
utils::hook::nop(0x140f252EE_g, 5);
|
|
|
|
utils::hook::nop(0x14119F13A_g, 5);
|
|
|
|
utils::hook::nop(0x1410D32E2_g, 5);
|
|
|
|
|
|
|
|
// removes "Services aren't ready yet." print
|
|
|
|
utils::hook::nop(0x141504374_g, 5);
|
|
|
|
|
|
|
|
// enable tweaking of jump_slowdownEnable dvar
|
|
|
|
utils::hook::nop(0x1411014F5_g, 2);
|
|
|
|
utils::hook::nop(0x141101B12_g, 2);
|
|
|
|
utils::hook::nop(0x141101C6C_g, 2);
|
|
|
|
utils::hook::nop(0x141101D3C_g, 2);
|
|
|
|
utils::hook::nop(0x141101EE5_g, 2);
|
|
|
|
|
|
|
|
// fixes lost connection issue?
|
|
|
|
utils::hook::nop(0x14165E97E_g, 5);
|
|
|
|
utils::hook::nop(0x14165E660_g, 5);
|
|
|
|
utils::hook::nop(0x141665289_g, 5);
|
|
|
|
utils::hook::nop(0x14166567D_g, 5);
|
2023-10-25 13:26:27 -04:00
|
|
|
|
|
|
|
// set com_timescale dvar to read only
|
|
|
|
utils::hook::set<unsigned int>(0x1412B26CF_g, 8192);
|
|
|
|
|
|
|
|
// remove FF Header version check
|
|
|
|
// utils::hook::set<byte>(0x1411A776B_g, 0xEB);
|
2023-10-24 10:16:45 -04:00
|
|
|
}
|