SP Support

This commit is contained in:
Federico Cecchetto
2022-05-25 23:56:10 +02:00
parent 2a800f449b
commit 545860eb77
15 changed files with 215 additions and 165 deletions

View File

@ -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
{

View File

@ -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

View File

@ -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();
}

View File

@ -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);
}

View File

@ -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);
}
};
}

View File

@ -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);

View File

@ -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())
{

View File

@ -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

View File

@ -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([]()
{

View File

@ -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

View File

@ -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));
});
}
};