Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions source/proxy-dll/component/debugging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,11 @@ namespace debugging
public:
void post_unpack() override
{
sys_error_hook.create(0x143D36CC0_g, sys_error_stub);
sys_error_hook.create(0x143D34E70_g, sys_error_stub);
scheduler::loop(draw_debug_info, scheduler::renderer);
scheduler::loop(test_key_catcher, scheduler::main);
}
};
}

REGISTER_COMPONENT(debugging::component)
REGISTER_COMPONENT(debugging::component)
18 changes: 9 additions & 9 deletions source/proxy-dll/component/demonware.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -504,16 +504,16 @@ namespace demonware
{
server_thread = utilities::thread::create_named_thread("Demonware", server_main);

utilities::hook::set<uint8_t>(0x144508469_g, 0x0); // CURLOPT_SSL_VERIFYPEER
utilities::hook::set<uint8_t>(0x144508455_g, 0xAF); // CURLOPT_SSL_VERIFYHOST
utilities::hook::set<uint8_t>(0x144B28D98_g, 0x0); // HTTPS -> HTTP
utilities::hook::set<uint8_t>(0x144506619_g, 0x0); // CURLOPT_SSL_VERIFYPEER
utilities::hook::set<uint8_t>(0x144506605_g, 0xAF); // CURLOPT_SSL_VERIFYHOST
utilities::hook::set<uint8_t>(0x144B26C38_g, 0x0); // HTTPS -> HTTP

utilities::hook::copy_string(0x144A27C70_g, "http://prod.umbrella.demonware.net");
utilities::hook::copy_string(0x144A2BAA0_g, "http://prod.uno.demonware.net/v1.0");
utilities::hook::copy_string(0x144A29CB0_g, "http://%s:%d/auth/");
utilities::hook::copy_string(0x144A25B20_g, "http://prod.umbrella.demonware.net");
utilities::hook::copy_string(0x144A29950_g, "http://prod.uno.demonware.net/v1.0");
utilities::hook::copy_string(0x144A27B60_g, "http://%s:%d/auth/");

utilities::hook::set(0x142DD0E10_g, 0xC301B0); // Live_Qos_Finished
utilities::hook::set(0x1438C2C70_g, 0xC301B0); // Live_Contracts? related to bdUNK125
utilities::hook::set(0x142DCF110_g, 0xC301B0); // Live_Qos_Finished
utilities::hook::set(0x1438C0DA0_g, 0xC301B0); // Live_Contracts? related to bdUNK125
}

void pre_destroy() override
Expand All @@ -532,4 +532,4 @@ namespace demonware
};
}

REGISTER_COMPONENT(demonware::component)
REGISTER_COMPONENT(demonware::component)
8 changes: 4 additions & 4 deletions source/proxy-dll/component/gsc_custom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -503,7 +503,7 @@ namespace gsc_custom

void patch_linking_sys_error()
{
auto scr_get_gsc_obj = 0x142748BB0_g;
auto scr_get_gsc_obj = 0x142746EB0_g;

// skip the error and the autoexec
// 1C1 = syserr start
Expand Down Expand Up @@ -575,11 +575,11 @@ namespace gsc_custom
game::gVmOpJumpTable[shield_devblock_opcode] = vm_op_custom_devblock;

// group gsc link
scr_get_gsc_obj_hook.create(0x142748BB0_g, scr_get_gsc_obj_stub);
scr_get_gsc_obj_hook.create(0x142746EB0_g, scr_get_gsc_obj_stub);

if (gsc_funcs::enable_dev_blocks)
{
gsc_obj_resolve_hook.create(0x142746A30_g, gsc_obj_resolve_stub);
gsc_obj_resolve_hook.create(0x142744D30_g, gsc_obj_resolve_stub);
}


Expand All @@ -588,4 +588,4 @@ namespace gsc_custom
};
}

REGISTER_COMPONENT(gsc_custom::component)
REGISTER_COMPONENT(gsc_custom::component)
26 changes: 13 additions & 13 deletions source/proxy-dll/component/gsc_funcs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1434,7 +1434,7 @@ namespace gsc_funcs

void patch_scrvm_runtime_error()
{
const auto scrvm_runtimeerror = 0x1427775B0_g;
const auto scrvm_runtimeerror = 0x1427758B0_g;
void* stub = utilities::hook::assemble([scrvm_runtimeerror](utilities::hook::assembler& a)
{
a.mov(ebx, 0x20); // set errorcode to 0x20
Expand Down Expand Up @@ -1540,27 +1540,27 @@ namespace gsc_funcs
void post_unpack() override
{
// replace nulled function references
reinterpret_cast<game::BO4_BuiltinFunctionDef*>(0x144ED5D90_g)->actionFunc = add_debug_command; // csc
reinterpret_cast<game::BO4_BuiltinFunctionDef*>(0x1449BAD60_g)->actionFunc = add_debug_command; // gsc
reinterpret_cast<game::BO4_BuiltinFunctionDef*>(0x144ED3D90_g)->actionFunc = add_debug_command; // csc
reinterpret_cast<game::BO4_BuiltinFunctionDef*>(0x1449B8C20_g)->actionFunc = add_debug_command; // gsc

scr_get_function_reverse_lookup.create(0x1433AF8A0_g, scr_get_function_reverse_lookup_stub);
cscr_get_function_reverse_lookup.create(0x141F132A0_g, cscr_get_function_reverse_lookup_stub);
cscr_get_function.create(0x141F13140_g, cscr_get_function_stub);
cscr_get_method.create(0x141F13650_g, cscr_get_method_stub);
scr_get_function.create(0x1433AF840_g, scr_get_function_stub);
scr_get_method.create(0x1433AFC20_g, scr_get_method_stub);
scr_get_function_reverse_lookup.create(0x1433AD9D0_g, scr_get_function_reverse_lookup_stub);
cscr_get_function_reverse_lookup.create(0x141F12CE0_g, cscr_get_function_reverse_lookup_stub);
cscr_get_function.create(0x141F12B80_g, cscr_get_function_stub);
cscr_get_method.create(0x141F13090_g, cscr_get_method_stub);
scr_get_function.create(0x1433AD970_g, scr_get_function_stub);
scr_get_method.create(0x1433ADD50_g, scr_get_method_stub);

// log gsc errors
scrvm_error.create(0x142770330_g, scrvm_error_stub);
utilities::hook::jump(0x142890470_g, scrvm_log_compiler_error);
scrvm_error.create(0x14276E630_g, scrvm_error_stub);
utilities::hook::jump(0x14288E770_g, scrvm_log_compiler_error);

// better runtime error
utilities::hook::jump(0x142748550_g, get_gsc_export_info);
utilities::hook::jump(0x142746850_g, get_gsc_export_info);
patch_scrvm_runtime_error();

scheduler::loop(draw_hud, scheduler::renderer);
}
};
}

REGISTER_COMPONENT(gsc_funcs::component)
REGISTER_COMPONENT(gsc_funcs::component)
6 changes: 3 additions & 3 deletions source/proxy-dll/component/keycatchers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,10 +62,10 @@ namespace keycatchers
public:
void post_unpack() override
{
cl_key_event_hook.create(0x142839250_g, cl_key_event_stub);
cl_char_event_hook.create(0x142836F80_g, cl_char_event_stub);
cl_key_event_hook.create(0x142837550_g, cl_key_event_stub);
cl_char_event_hook.create(0x142835280_g, cl_char_event_stub);
}
};
}

REGISTER_COMPONENT(keycatchers::component)
REGISTER_COMPONENT(keycatchers::component)
84 changes: 42 additions & 42 deletions source/proxy-dll/component/lua.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,44 +125,44 @@ namespace lua {
// - 0x141FD3220_g engine_openurl
// - 0x141D34190_g debug

utilities::hook::jump(0x1437358D0_g, lua_unsafe_function_stub); // base_loadfile
utilities::hook::jump(0x143736A50_g, lua_unsafe_function_stub); // base_load
utilities::hook::jump(0x14373B640_g, lua_unsafe_function_stub); // string_dump
utilities::hook::jump(0x143733A00_g, lua_unsafe_function_stub); // base_loadfile
utilities::hook::jump(0x143734B80_g, lua_unsafe_function_stub); // base_load
utilities::hook::jump(0x143739770_g, lua_unsafe_function_stub); // string_dump


// io helpers
utilities::hook::jump(0x14373F000_g, lua_unsafe_function_stub); // os_exit
utilities::hook::jump(0x14373F020_g, lua_unsafe_function_stub); // os_remove
utilities::hook::jump(0x14373F150_g, lua_unsafe_function_stub); // os_rename
utilities::hook::jump(0x14373EEC0_g, lua_unsafe_function_stub); // os_tmpname
utilities::hook::jump(0x14373EE90_g, lua_unsafe_function_stub); // os_sleep
utilities::hook::jump(0x14373ED30_g, lua_unsafe_function_stub); // os_execute
utilities::hook::jump(0x14373ED90_g, lua_unsafe_function_stub); // os_getenv

utilities::hook::jump(0x14373D170_g, lua_unsafe_function_stub); // io_close
utilities::hook::jump(0x14373D060_g, lua_unsafe_function_stub); // io_close_file
utilities::hook::jump(0x14373D030_g, lua_unsafe_function_stub); // io_flush
utilities::hook::jump(0x14375C7B0_g, lua_unsafe_function_stub); // io_output/io_input
utilities::hook::jump(0x14373D7B0_g, lua_unsafe_function_stub); // io_lines
utilities::hook::jump(0x14373D670_g, lua_unsafe_function_stub); // io_lines
utilities::hook::jump(0x14373DD20_g, lua_unsafe_function_stub); // io_open
utilities::hook::jump(0x14373D5B0_g, lua_unsafe_function_stub); // io_read
utilities::hook::jump(0x14373D200_g, lua_unsafe_function_stub); // io_read_file
utilities::hook::jump(0x14373DA90_g, lua_unsafe_function_stub); // io_type
utilities::hook::jump(0x14373CFB0_g, lua_unsafe_function_stub); // io_write
utilities::hook::jump(0x14373CF70_g, lua_unsafe_function_stub); // io_write_file
utilities::hook::jump(0x14373DC60_g, lua_unsafe_function_stub); // io_tmpfile
utilities::hook::jump(0x14373E160_g, lua_unsafe_function_stub); // io_popen
utilities::hook::jump(0x14373DE40_g, lua_unsafe_function_stub); // io_seek_file
utilities::hook::jump(0x14373DF80_g, lua_unsafe_function_stub); // io_setvbuf
utilities::hook::jump(0x14373E0A0_g, lua_unsafe_function_stub); // io_tostring
utilities::hook::jump(0x143735360_g, lua_unsafe_function_stub); // serialize_persist
utilities::hook::jump(0x143735590_g, lua_unsafe_function_stub); // serialize_unpersist

utilities::hook::jump(0x14373BC40_g, lua_unsafe_function_stub); // havokscript_compiler_settings
utilities::hook::jump(0x14373C670_g, lua_unsafe_function_stub); // havokscript_getgcweights
utilities::hook::jump(0x14373C100_g, lua_unsafe_function_stub); // havokscript_setgcweights
utilities::hook::jump(0x143734DC0_g, lua_unsafe_function_stub); // package_loadlib
utilities::hook::jump(0x14373D130_g, lua_unsafe_function_stub); // os_exit
utilities::hook::jump(0x14373D150_g, lua_unsafe_function_stub); // os_remove
utilities::hook::jump(0x14373D280_g, lua_unsafe_function_stub); // os_rename
utilities::hook::jump(0x14373CFF0_g, lua_unsafe_function_stub); // os_tmpname
utilities::hook::jump(0x14373CFC0_g, lua_unsafe_function_stub); // os_sleep
utilities::hook::jump(0x14373CE60_g, lua_unsafe_function_stub); // os_execute
utilities::hook::jump(0x14373CEC0_g, lua_unsafe_function_stub); // os_getenv

utilities::hook::jump(0x14373B2A0_g, lua_unsafe_function_stub); // io_close
utilities::hook::jump(0x14373B190_g, lua_unsafe_function_stub); // io_close_file
utilities::hook::jump(0x14373B160_g, lua_unsafe_function_stub); // io_flush
utilities::hook::jump(0x14375A8E0_g, lua_unsafe_function_stub); // io_output/io_input
utilities::hook::jump(0x14373B8E0_g, lua_unsafe_function_stub); // io_lines
utilities::hook::jump(0x14373B7A0_g, lua_unsafe_function_stub); // io_lines
utilities::hook::jump(0x14373BE50_g, lua_unsafe_function_stub); // io_open
utilities::hook::jump(0x14373B6E0_g, lua_unsafe_function_stub); // io_read
utilities::hook::jump(0x14373B330_g, lua_unsafe_function_stub); // io_read_file
utilities::hook::jump(0x14373BBC0_g, lua_unsafe_function_stub); // io_type
utilities::hook::jump(0x14373B0E0_g, lua_unsafe_function_stub); // io_write
utilities::hook::jump(0x14373B0A0_g, lua_unsafe_function_stub); // io_write_file
utilities::hook::jump(0x14373BD90_g, lua_unsafe_function_stub); // io_tmpfile
utilities::hook::jump(0x14373C290_g, lua_unsafe_function_stub); // io_popen
utilities::hook::jump(0x14373BF70_g, lua_unsafe_function_stub); // io_seek_file
utilities::hook::jump(0x14373C0B0_g, lua_unsafe_function_stub); // io_setvbuf
utilities::hook::jump(0x14373C1D0_g, lua_unsafe_function_stub); // io_tostring
utilities::hook::jump(0x143733490_g, lua_unsafe_function_stub); // serialize_persist
utilities::hook::jump(0x1437336C0_g, lua_unsafe_function_stub); // serialize_unpersist

utilities::hook::jump(0x143739D70_g, lua_unsafe_function_stub); // havokscript_compiler_settings
utilities::hook::jump(0x14373A7A0_g, lua_unsafe_function_stub); // havokscript_getgcweights
utilities::hook::jump(0x14373A230_g, lua_unsafe_function_stub); // havokscript_setgcweights
utilities::hook::jump(0x143732EF0_g, lua_unsafe_function_stub); // package_loadlib

}

Expand Down Expand Up @@ -192,20 +192,20 @@ namespace lua {
{
if (utilities::json_config::ReadBoolean("lua", "info", false))
{
utilities::hook::jump(0x143956010_g, lua_engine_print_info);
utilities::hook::jump(0x143954280_g, lua_engine_print_info);

}
if (utilities::json_config::ReadBoolean("lua", "error", false))
{
hksi_lual_error_hook.create(0x143757780_g, hksi_lual_error_stub);
lual_error_hook.create(0x14375D410_g, lual_error_stub);
utilities::hook::jump(0x14423A1D0_g, lui_panic_stub);
utilities::hook::jump(0x143955FA0_g, lua_engine_print_error);
utilities::hook::jump(0x143956090_g, lua_engine_print_warning);
hksi_lual_error_hook.create(0x1437558B0_g, hksi_lual_error_stub);
lual_error_hook.create(0x14375B540_g, lual_error_stub);
utilities::hook::jump(0x144238380_g, lui_panic_stub);
utilities::hook::jump(0x143954210_g, lua_engine_print_error);
utilities::hook::jump(0x143954300_g, lua_engine_print_warning);
}

patch_unsafe_lua_functions();
}
};
}
REGISTER_COMPONENT(lua::component)
REGISTER_COMPONENT(lua::component)
10 changes: 5 additions & 5 deletions source/proxy-dll/component/mods.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1358,14 +1358,14 @@ namespace mods {

// custom assets loading
db_find_xasset_header_hook.create(xassets::DB_FindXAssetHeader.get(), db_find_xasset_header_stub);
db_does_xasset_exist_hook.create(0x142EB6C90_g, db_does_xasset_exist_stub);
scr_gsc_obj_link_hook.create(0x142748F10_g, scr_gsc_obj_link_stub);
hksl_loadfile_hook.create(0x14375D6A0_g, hksl_loadfile_stub);
bg_cache_sync_hook.create(0x1405CE0B0_g, bg_cache_sync_stub);
db_does_xasset_exist_hook.create(0x142EB4F90_g, db_does_xasset_exist_stub);
scr_gsc_obj_link_hook.create(0x142747210_g, scr_gsc_obj_link_stub);
hksl_loadfile_hook.create(0x14375B7D0_g, hksl_loadfile_stub);
bg_cache_sync_hook.create(0x1405CDE40_g, bg_cache_sync_stub);

command::add("reload_mods", mods_reload_f, "Reload the shield mods");
}
};
}

REGISTER_COMPONENT(mods::component)
REGISTER_COMPONENT(mods::component)
26 changes: 13 additions & 13 deletions source/proxy-dll/component/platform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,22 +76,22 @@ namespace platform

void post_unpack() override
{
utilities::hook::set<uint16_t>(0x1423271D0_g, 0x01B0); // BattleNet_IsDisabled (patch to mov al,1)
utilities::hook::set<uint32_t>(0x1423271E0_g, 0x90C301B0); // BattleNet_IsConnected (patch to mov al,1 retn)
utilities::hook::set<uint16_t>(0x1423254D0_g, 0x01B0); // BattleNet_IsDisabled (patch to mov al,1)
utilities::hook::set<uint32_t>(0x1423254E0_g, 0x90C301B0); // BattleNet_IsConnected (patch to mov al,1 retn)

utilities::hook::set<uint8_t>(0x142325210_g, 0xC3); // patch#1 Annoying function crashing game; related to BattleNet (TODO : Needs Further Investigation)
utilities::hook::set<uint8_t>(0x142307B40_g, 0xC3); // patch#2 Annoying function crashing game; related to BattleNet (TODO : Needs Further Investigation)
utilities::hook::set<uint32_t>(0x143D08290_g, 0x90C301B0); // patch#3 BattleNet_IsModeAvailable? (patch to mov al,1 retn)
utilities::hook::set<uint8_t>(0x142323510_g, 0xC3); // patch#1 Annoying function crashing game; related to BattleNet (TODO : Needs Further Investigation)
utilities::hook::set<uint8_t>(0x142305E40_g, 0xC3); // patch#2 Annoying function crashing game; related to BattleNet (TODO : Needs Further Investigation)
utilities::hook::set<uint32_t>(0x143D06440_g, 0x90C301B0); // patch#3 BattleNet_IsModeAvailable? (patch to mov al,1 retn)

utilities::hook::nop(0x1437DA454_g, 13); // begin cross-auth even without platform being initialized [LiveConnect_BeginCrossAuthPlatform]
utilities::hook::set(0x1444D2D60_g, 0xC301B0); // Auth3 Response RSA signature check [bdAuth::validateResponseSignature]
utilities::hook::set(0x1444E34C0_g, 0xC301B0); // Auth3 Response platform extended data check [bdAuthPC::processPlatformData]
utilities::hook::nop(0x1437D8584_g, 13); // begin cross-auth even without platform being initialized [LiveConnect_BeginCrossAuthPlatform]
utilities::hook::set(0x1444D0F10_g, 0xC301B0); // Auth3 Response RSA signature check [bdAuth::validateResponseSignature]
utilities::hook::set(0x1444E1670_g, 0xC301B0); // Auth3 Response platform extended data check [bdAuthPC::processPlatformData]

utilities::hook::nop(0x1438994E9_g, 22); // get live name even without platform being initialized [Live_UserSignedIn]
utilities::hook::nop(0x1438C3476_g, 22); // get live xuid even without platform being initialized [LiveUser_UserGetXuid]
utilities::hook::nop(0x143897619_g, 22); // get live name even without platform being initialized [Live_UserSignedIn]
utilities::hook::nop(0x1438C15A6_g, 22); // get live xuid even without platform being initialized [LiveUser_UserGetXuid]

utilities::hook::jump(0x142325C70_g, bnet_get_username); // detour battlenet username
utilities::hook::jump(0x142325CA0_g, bnet_get_userid); // detour battlenet userid
utilities::hook::jump(0x142323F70_g, bnet_get_username); // detour battlenet username
utilities::hook::jump(0x142323FA0_g, bnet_get_userid); // detour battlenet userid

//PC_TextChat_Print_Hook.create(0x1422D4A20_g, PC_TextChat_Print_Stub); // Disable useless system messages passed into chat box

Expand All @@ -100,4 +100,4 @@ namespace platform
};
}

REGISTER_COMPONENT(platform::component)
REGISTER_COMPONENT(platform::component)
6 changes: 3 additions & 3 deletions source/proxy-dll/component/scheduler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,8 @@ namespace scheduler

void post_unpack() override
{
r_end_frame_hook.create(0x14361E260_g, r_end_frame_stub); // R_EndFrame
main_frame_hook.create(0x14288BAE0_g, main_frame_stub); // Com_Frame
r_end_frame_hook.create(0x14361C390_g, r_end_frame_stub); // R_EndFrame Updated
main_frame_hook.create(0x142889DE0_g, main_frame_stub); // Com_Frame Updated
//g_run_frame_hook.create(0x142D08FC0_g, server_frame_stub); // G_RunFrame
}

Expand All @@ -180,4 +180,4 @@ namespace scheduler
};
}

REGISTER_COMPONENT(scheduler::component)
REGISTER_COMPONENT(scheduler::component)
22 changes: 11 additions & 11 deletions source/proxy-dll/component/unlockall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,20 +149,20 @@ namespace unlockall
public:
void post_unpack() override
{
utilities::hook::jump(0x1438AE2F0_g, return_false); // patch LiveStats data source
utilities::hook::jump(0x1438AC420_g, return_false); // patch LiveStats data source

utilities::hook::jump(0x1437F6ED0_g, liveinventory_getitemquantity); // grant every loot item
utilities::hook::jump(0x1437F5000_g, liveinventory_getitemquantity); // grant every loot item

utilities::hook::jump(0x1406BB410_g, bg_unlockedgetchallengeunlockedforindex);
utilities::hook::jump(0x1406B5530_g, bg_unlockablesitemoptionlocked);
utilities::hook::jump(0x1406B34D0_g, bg_unlockablesisitemattachmentlocked);
utilities::hook::jump(0x1406B3290_g, bg_unlockablesisattachmentslotlocked);
utilities::hook::jump(0x1406AC010_g, bg_unlockablesemblemorbackinglockedbychallenge);
utilities::hook::jump(0x144184D20_g, bg_emblemisentitlementbackgroundgranted);
utilities::hook::jump(0x1406B3AA0_g, bg_unlockablesisitemlocked);
utilities::hook::jump(0x1406ae060_g, bg_unlockablesgetcustomclasscount);
utilities::hook::jump(0x1406BB1A0_g, bg_unlockedgetchallengeunlockedforindex);
utilities::hook::jump(0x1406B52C0_g, bg_unlockablesitemoptionlocked);
utilities::hook::jump(0x1406B3260_g, bg_unlockablesisitemattachmentlocked);
utilities::hook::jump(0x1406B3020_g, bg_unlockablesisattachmentslotlocked);
utilities::hook::jump(0x1406ABDA0_g, bg_unlockablesemblemorbackinglockedbychallenge);
utilities::hook::jump(0x144182ED0_g, bg_emblemisentitlementbackgroundgranted);
utilities::hook::jump(0x1406B3830_g, bg_unlockablesisitemlocked);
utilities::hook::jump(0x1406ADDF0_g, bg_unlockablesgetcustomclasscount);
}
};
}

REGISTER_COMPONENT(unlockall::component)
REGISTER_COMPONENT(unlockall::component)
2 changes: 1 addition & 1 deletion source/proxy-dll/definitions/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ namespace game

void verify_game_version()
{
if (*(int*)0x1449CA7E8_g != 13869365) // BlackOps4 CL(13869365) BEYQBBUILD106 DEV [Wed Feb 22 16:31:32 2023]
if (*(int*)0x1449C86B8_g != 27458377) // BlackOps4 CL(27458377) BEYQBBUILD107 DEV [Mon Jun 08 09:12:27 2026]
{
throw std::runtime_error("Unsupported BlackOps4.exe Version. This DLL Expects Latest BNET Build");
}
Expand Down
Loading