SP Support
This commit is contained in:
@ -234,9 +234,9 @@ namespace auth
|
||||
// Patch steam id bit check
|
||||
if (game::environment::is_sp())
|
||||
{
|
||||
utils::hook::jump(0x4FA1B3_b, 0x4FA21A_b);
|
||||
utils::hook::jump(0x4FB272_b, 0x4FB2B7_b);
|
||||
utils::hook::jump(0x4FB781_b, 0x4FB7D3_b);
|
||||
utils::hook::jump(0x4FA1B3_b, 0x4FA21A_b, true);
|
||||
utils::hook::jump(0x4FB272_b, 0x4FB2B7_b, true);
|
||||
utils::hook::jump(0x4FB781_b, 0x4FB7D3_b, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -173,7 +173,7 @@ namespace colors
|
||||
}
|
||||
|
||||
// force new colors
|
||||
utils::hook::jump(SELECT_VALUE(0x0, 0x6C9460_b), rb_lookup_color_stub, true);
|
||||
utils::hook::jump(SELECT_VALUE(0x5B17E0_b, 0x6C9460_b), rb_lookup_color_stub, true);
|
||||
|
||||
// add colors
|
||||
add(0, 0, 0); // 0 - Black
|
||||
|
@ -514,11 +514,11 @@ namespace command
|
||||
else
|
||||
{
|
||||
parse_commandline_hook.create(0x157D50_b, parse_commandline_stub);
|
||||
utils::hook::jump(0x4E9F40_b, dvar_command_stub, true);
|
||||
|
||||
add_commands_mp();
|
||||
}
|
||||
|
||||
utils::hook::jump(SELECT_VALUE(0x3A7C80_b, 0x4E9F40_b), dvar_command_stub, true);
|
||||
|
||||
add_commands_generic();
|
||||
}
|
||||
|
||||
|
@ -538,6 +538,11 @@ namespace demonware
|
||||
|
||||
void post_load() override
|
||||
{
|
||||
if (game::environment::is_sp())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
server_thread = utils::thread::create_named_thread("Demonware", server_main);
|
||||
}
|
||||
|
||||
|
@ -467,21 +467,25 @@ namespace dvars
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
dvar_register_bool_hook.create(SELECT_VALUE(0x0, 0x182340_b), &dvar_register_bool);
|
||||
dvar_register_bool_hashed_hook.create(SELECT_VALUE(0x0, 0x182420_b), &dvar_register_bool_hashed);
|
||||
dvar_register_float_hook.create(SELECT_VALUE(0x0, 0x1827F0_b), &dvar_register_float);
|
||||
dvar_register_float_hashed_hook.create(SELECT_VALUE(0x0, 0x182900_b), &dvar_register_float_hashed);
|
||||
dvar_register_int_hook.create(SELECT_VALUE(0x0, 0x182A10_b), &dvar_register_int);
|
||||
dvar_register_int_hashed_hook.create(SELECT_VALUE(0x0, 0x182AF0_b), &dvar_register_int_hashed);
|
||||
dvar_register_string_hook.create(SELECT_VALUE(0x0, 0x182BD0_b), &dvar_register_string);
|
||||
dvar_register_vector2_hook.create(SELECT_VALUE(0x0, 0x182CB0_b), &dvar_register_vector2);
|
||||
dvar_register_vector3_hook.create(SELECT_VALUE(0x0, 0x182DB0_b), &dvar_register_vector3);
|
||||
dvar_register_bool_hook.create(SELECT_VALUE(0x419220_b, 0x182340_b), &dvar_register_bool);
|
||||
dvar_register_float_hook.create(SELECT_VALUE(0x4195F0_b, 0x1827F0_b), &dvar_register_float);
|
||||
dvar_register_int_hook.create(SELECT_VALUE(0x419700_b, 0x182A10_b), &dvar_register_int);
|
||||
dvar_register_string_hook.create(SELECT_VALUE(0x4197E0_b, 0x182BD0_b), &dvar_register_string);
|
||||
dvar_register_vector2_hook.create(SELECT_VALUE(0x4198C0_b, 0x182CB0_b), &dvar_register_vector2);
|
||||
dvar_register_vector3_hook.create(SELECT_VALUE(0x419A00_b, 0x182DB0_b), &dvar_register_vector3);
|
||||
|
||||
dvar_set_bool_hook.create(SELECT_VALUE(0x0, 0x185520_b), &dvar_set_bool);
|
||||
dvar_set_float_hook.create(SELECT_VALUE(0x0, 0x185AA0_b), &dvar_set_float);
|
||||
dvar_set_int_hook.create(SELECT_VALUE(0x0, 0x185D10_b), &dvar_set_int);
|
||||
dvar_set_string_hook.create(SELECT_VALUE(0x0, 0x186080_b), &dvar_set_string);
|
||||
dvar_set_from_string_hook.create(SELECT_VALUE(0x0, 0x185C60_b), &dvar_set_from_string);
|
||||
if (!game::environment::is_sp())
|
||||
{
|
||||
dvar_register_bool_hashed_hook.create(SELECT_VALUE(0x0, 0x182420_b), &dvar_register_bool_hashed);
|
||||
dvar_register_float_hashed_hook.create(SELECT_VALUE(0x0, 0x182900_b), &dvar_register_float_hashed);
|
||||
dvar_register_int_hashed_hook.create(SELECT_VALUE(0x0, 0x182AF0_b), &dvar_register_int_hashed);
|
||||
}
|
||||
|
||||
dvar_set_bool_hook.create(SELECT_VALUE(0x41B820_b, 0x185520_b), &dvar_set_bool);
|
||||
dvar_set_float_hook.create(SELECT_VALUE(0x41BC60_b, 0x185AA0_b), &dvar_set_float);
|
||||
dvar_set_int_hook.create(SELECT_VALUE(0x41BEE0_b, 0x185D10_b), &dvar_set_int);
|
||||
dvar_set_string_hook.create(SELECT_VALUE(0x41C0F0_b, 0x186080_b), &dvar_set_string);
|
||||
dvar_set_from_string_hook.create(SELECT_VALUE(0x41BE20_b, 0x185C60_b), &dvar_set_from_string);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
@ -15,6 +15,8 @@ namespace fps
|
||||
{
|
||||
namespace
|
||||
{
|
||||
utils::hook::detour sub_5D6810_hook;
|
||||
|
||||
game::dvar_t* cg_drawfps;
|
||||
game::dvar_t* cg_drawping;
|
||||
|
||||
@ -131,6 +133,12 @@ namespace fps
|
||||
cg_drawfps = dvars::register_int("cg_drawFps", 0, 0, 2, game::DVAR_FLAG_SAVED, "Draw frames per second");
|
||||
return cg_drawfps;
|
||||
}
|
||||
|
||||
void sub_5D6810_stub()
|
||||
{
|
||||
perf_update();
|
||||
sub_5D6810_hook.invoke<void>();
|
||||
}
|
||||
}
|
||||
|
||||
int get_fps()
|
||||
@ -153,21 +161,32 @@ namespace fps
|
||||
// fps setup
|
||||
cg_perf.perf_start = std::chrono::high_resolution_clock::now();
|
||||
|
||||
utils::hook::jump(SELECT_VALUE(0, 0x343847_b), utils::hook::assemble([](utils::hook::assembler& a)
|
||||
if (game::environment::is_mp())
|
||||
{
|
||||
a.pushad64();
|
||||
a.call_aligned(perf_update);
|
||||
a.popad64();
|
||||
utils::hook::jump(SELECT_VALUE(0, 0x343847_b), utils::hook::assemble([](utils::hook::assembler& a)
|
||||
{
|
||||
a.pushad64();
|
||||
a.call_aligned(perf_update);
|
||||
a.popad64();
|
||||
|
||||
a.call(0x702250_b);
|
||||
a.mov(edx, 3);
|
||||
a.xor_(ecx, ecx);
|
||||
a.jmp(0x343853_b);
|
||||
}), true);
|
||||
a.call(0x702250_b);
|
||||
a.mov(edx, 3);
|
||||
a.xor_(ecx, ecx);
|
||||
a.jmp(0x343853_b);
|
||||
}), true);
|
||||
|
||||
// Don't register cg_drawfps
|
||||
utils::hook::nop(0x31D74F_b, 0x1C);
|
||||
utils::hook::nop(0x31D76F_b, 0x7);
|
||||
// Don't register cg_drawfps
|
||||
utils::hook::nop(0x31D74F_b, 0x1C);
|
||||
utils::hook::nop(0x31D76F_b, 0x7);
|
||||
}
|
||||
else
|
||||
{
|
||||
sub_5D6810_hook.create(0x5D6810_b, sub_5D6810_stub);
|
||||
|
||||
// Don't register cg_drawfps
|
||||
utils::hook::nop(0x15C97D_b, 0x20);
|
||||
utils::hook::nop(0x15C9A1_b, 0x7);
|
||||
}
|
||||
|
||||
scheduler::loop(cg_draw_fps, scheduler::pipeline::renderer);
|
||||
|
||||
|
@ -207,7 +207,7 @@ namespace logfile
|
||||
a.inc(r14);
|
||||
a.mov(dword_ptr(rbp, 0xA4), r15d);
|
||||
|
||||
a.jmp(SELECT_VALUE(0x0, 0x5111B3_b));
|
||||
a.jmp(SELECT_VALUE(0x3CA153_b, 0x5111B3_b));
|
||||
|
||||
a.bind(replace);
|
||||
|
||||
@ -282,7 +282,7 @@ namespace logfile
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
utils::hook::jump(SELECT_VALUE(0x0, 0x5111A5_b), utils::hook::assemble(vm_execute_stub), true);
|
||||
utils::hook::jump(SELECT_VALUE(0x3CA145_b, 0x5111A5_b), utils::hook::assemble(vm_execute_stub), true);
|
||||
|
||||
if (game::environment::is_sp())
|
||||
{
|
||||
|
@ -125,6 +125,7 @@ namespace scheduler
|
||||
{
|
||||
execute(pipeline::lui);
|
||||
}
|
||||
hks_frame_hook.invoke<bool>();
|
||||
}
|
||||
}
|
||||
|
||||
@ -194,22 +195,22 @@ namespace scheduler
|
||||
|
||||
void post_unpack() override
|
||||
{
|
||||
utils::hook::jump(SELECT_VALUE(0, 0x6A6300_b), utils::hook::assemble([](utils::hook::assembler& a)
|
||||
utils::hook::jump(SELECT_VALUE(0x581FB0_b, 0x6A6300_b), utils::hook::assemble([](utils::hook::assembler& a)
|
||||
{
|
||||
a.pushad64();
|
||||
a.call_aligned(r_end_frame_stub);
|
||||
a.popad64();
|
||||
|
||||
a.sub(rsp, 0x28);
|
||||
a.call(0x6A5C20_b);
|
||||
a.mov(rax, 0xEAB4308_b);
|
||||
a.call(SELECT_VALUE(0x581840_b, 0x6A5C20_b));
|
||||
a.mov(rax, SELECT_VALUE(0x1182A680_b, 0xEAB4308_b));
|
||||
a.mov(rax, qword_ptr(rax));
|
||||
a.jmp(0x6A6310_b);
|
||||
a.jmp(SELECT_VALUE(0x581FC0_b, 0x6A6310_b));
|
||||
}), true);
|
||||
|
||||
g_run_frame_hook.create(SELECT_VALUE(0x0, 0x417940_b), scheduler::server_frame_stub);
|
||||
main_frame_hook.create(SELECT_VALUE(0x0, 0x3438B0_b), scheduler::main_frame_stub);
|
||||
hks_frame_hook.create(SELECT_VALUE(0x0, 0x2792E0_b), scheduler::hks_frame_stub);
|
||||
g_run_frame_hook.create(SELECT_VALUE(0x2992E0_b, 0x417940_b), scheduler::server_frame_stub);
|
||||
main_frame_hook.create(SELECT_VALUE(0x1B1DF0_b, 0x3438B0_b), scheduler::main_frame_stub);
|
||||
hks_frame_hook.create(SELECT_VALUE(0x1028D0_b, 0x2792E0_b), scheduler::hks_frame_stub);
|
||||
}
|
||||
|
||||
void pre_destroy() override
|
||||
|
@ -167,24 +167,24 @@ namespace scripting
|
||||
public:
|
||||
void post_unpack() override
|
||||
{
|
||||
vm_notify_hook.create(SELECT_VALUE(0x0, 0x514560_b), vm_notify_stub);
|
||||
vm_notify_hook.create(SELECT_VALUE(0x3CD500_b, 0x514560_b), vm_notify_stub);
|
||||
|
||||
scr_add_class_field_hook.create(SELECT_VALUE(0x0, 0x50AE20_b), scr_add_class_field_stub);
|
||||
scr_add_class_field_hook.create(SELECT_VALUE(0x3C3CE0_b, 0x50AE20_b), scr_add_class_field_stub);
|
||||
|
||||
scr_set_thread_position_hook.create(SELECT_VALUE(0x0, 0x504870_b), scr_set_thread_position_stub);
|
||||
process_script_hook.create(SELECT_VALUE(0x0, 0x50E340_b), process_script_stub);
|
||||
scr_set_thread_position_hook.create(SELECT_VALUE(0x3BD890_b, 0x504870_b), scr_set_thread_position_stub);
|
||||
process_script_hook.create(SELECT_VALUE(0x3C7200_b, 0x50E340_b), process_script_stub);
|
||||
sl_get_canonical_string_hook.create(game::SL_GetCanonicalString, sl_get_canonical_string_stub);
|
||||
|
||||
if (!game::environment::is_sp())
|
||||
{
|
||||
scr_load_level_hook.create(SELECT_VALUE(0x0, 0x450FC0_b), scr_load_level_stub);
|
||||
scr_load_level_hook.create(0x450FC0_b, scr_load_level_stub);
|
||||
}
|
||||
else
|
||||
{
|
||||
vm_execute_hook.create(SELECT_VALUE(0x0, 0x5110E0_b), vm_execute_stub);
|
||||
vm_execute_hook.create(0x3CA080_b, vm_execute_stub);
|
||||
}
|
||||
|
||||
g_shutdown_game_hook.create(SELECT_VALUE(0x0, 0x422F30_b), g_shutdown_game_stub);
|
||||
g_shutdown_game_hook.create(SELECT_VALUE(0x2A5130_b, 0x422F30_b), g_shutdown_game_stub);
|
||||
|
||||
scheduler::loop([]()
|
||||
{
|
||||
|
@ -30,9 +30,9 @@ namespace splash
|
||||
void post_unpack() override
|
||||
{
|
||||
// Disable native splash screen
|
||||
utils::hook::set<uint8_t>(SELECT_VALUE(0, 0x5BDF20_b), 0xC3);
|
||||
utils::hook::jump(SELECT_VALUE(0, 0x5BE1D0_b), destroy_stub, true);
|
||||
utils::hook::jump(SELECT_VALUE(0, 0x5BE210_b), destroy_stub, true);
|
||||
utils::hook::set<uint8_t>(SELECT_VALUE(0x462B90_b, 0x5BDF20_b), 0xC3);
|
||||
utils::hook::jump(SELECT_VALUE(0x462E40_b, 0x5BE1D0_b), destroy_stub, true);
|
||||
utils::hook::jump(SELECT_VALUE(0x462E80_b, 0x5BE210_b), destroy_stub, true);
|
||||
}
|
||||
|
||||
void pre_destroy() override
|
||||
|
@ -218,7 +218,7 @@ namespace ui_scripting
|
||||
|
||||
setup_functions();
|
||||
|
||||
lua["print"] = function(reinterpret_cast<game::hks::lua_function>(0x209EB0_b));
|
||||
lua["print"] = function(reinterpret_cast<game::hks::lua_function>(SELECT_VALUE(0x93490_b, 0x209EB0_b)));
|
||||
lua["table"]["unpack"] = lua["unpack"];
|
||||
lua["luiglobals"] = lua;
|
||||
|
||||
@ -370,22 +370,22 @@ namespace ui_scripting
|
||||
|
||||
void post_unpack() override
|
||||
{
|
||||
if (!game::environment::is_mp())
|
||||
if (game::environment::is_dedi())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
db_find_xasset_header_hook.create(game::DB_FindXAssetHeader, db_find_xasset_header_stub);
|
||||
hks_load_hook.create(0x22C180_b, hks_load_stub);
|
||||
hks_load_hook.create(SELECT_VALUE(0xB46F0_b, 0x22C180_b), hks_load_stub);
|
||||
|
||||
hks_package_require_hook.create(0x214040_b, hks_package_require_stub);
|
||||
hks_start_hook.create(0x27A790_b, hks_start_stub);
|
||||
hks_shutdown_hook.create(0x2707C0_b, hks_shutdown_stub);
|
||||
hks_package_require_hook.create(SELECT_VALUE(0x90070_b, 0x214040_b), hks_package_require_stub);
|
||||
hks_start_hook.create(SELECT_VALUE(0x103C50_b, 0x27A790_b), hks_start_stub);
|
||||
hks_shutdown_hook.create(SELECT_VALUE(0xFB370_b, 0x2707C0_b), hks_shutdown_stub);
|
||||
|
||||
command::add("lui_restart", []()
|
||||
{
|
||||
utils::hook::invoke<void>(0x2707C0_b);
|
||||
utils::hook::invoke<void>(0x27BEC0_b);
|
||||
utils::hook::invoke<void>(SELECT_VALUE(0xFB370_b, 0x2707C0_b));
|
||||
utils::hook::invoke<void>(SELECT_VALUE(0x1052C0_b, 0x27BEC0_b));
|
||||
});
|
||||
}
|
||||
};
|
||||
|
Reference in New Issue
Block a user