@@ -52,6 +52,7 @@ Variable sar_disable_weapon_sway("sar_disable_weapon_sway", "0", 0, 1, "Disables
5252Variable sar_disable_viewmodel_shadows (" sar_disable_viewmodel_shadows" , " 0" , 0 , 1 , " Disables the shadows on the viewmodel.\n " );
5353Variable sar_floor_reportals (" sar_floor_reportals" , " 0" , " Toggles floor reportals. Requires cheats.\n " , FCVAR_CHEAT);
5454Variable sar_loads_coop_dots (" sar_loads_coop_dots" , " 0" , " Toggles the loading screen dots during map transitions in coop.\n " );
55+ Variable sar_patch_autograb (" sar_patch_autograb" , " 0" , 0 , 1 , " Patches the auto-grab in coop. Requires host to enable it for everyone that also enables it.\n " );
5556
5657Variable sv_laser_cube_autoaim;
5758Variable ui_loadingscreen_transition_time;
@@ -323,6 +324,8 @@ CON_COMMAND_F(sar_challenge_autosubmit_reload_api_key, "sar_challenge_autosubmit
323324
324325Memory::Patch *g_floorReportalPatch;
325326Memory::Patch *g_coopLoadingDotsPatch;
327+ Memory::Patch *g_autoGrabPatchServer;
328+ Memory::Patch *g_autoGrabPatchClient;
326329
327330void Cheats::Init () {
328331 sv_laser_cube_autoaim = Variable (" sv_laser_cube_autoaim" );
@@ -379,6 +382,18 @@ void Cheats::Init() {
379382 g_coopLoadingDotsPatch->Restore ();
380383 }
381384
385+ g_autoGrabPatchServer = new Memory::Patch ();
386+ g_autoGrabPatchClient = new Memory::Patch ();
387+ auto autoGrabServerBranch = Memory::Scan (MODULE (" server" ), Offsets::CPortal_Player__PollForUseEntity_CheckMP);
388+ auto autoGrabClientBranch = Memory::Scan (MODULE (" client" ), Offsets::CPortal_Player__PollForUseEntity_CheckMP); // Note: Same signature as the server.
389+ if (autoGrabServerBranch && autoGrabClientBranch) {
390+ unsigned char autoGrabBranchByte = 0xEB ;
391+ g_autoGrabPatchServer->Execute (autoGrabServerBranch, &autoGrabBranchByte, 1 );
392+ g_autoGrabPatchServer->Restore ();
393+ g_autoGrabPatchClient->Execute (autoGrabClientBranch, &autoGrabBranchByte, 1 );
394+ g_autoGrabPatchClient->Restore ();
395+ }
396+
382397 Variable::RegisterAll ();
383398 Command::RegisterAll ();
384399}
@@ -398,6 +413,10 @@ void Cheats::Shutdown() {
398413 SAFE_DELETE (g_floorReportalPatch);
399414 g_coopLoadingDotsPatch->Restore ();
400415 SAFE_DELETE (g_coopLoadingDotsPatch);
416+ g_autoGrabPatchServer->Restore ();
417+ SAFE_DELETE (g_autoGrabPatchServer);
418+ g_autoGrabPatchClient->Restore ();
419+ SAFE_DELETE (g_autoGrabPatchClient);
401420}
402421
403422
@@ -534,3 +553,34 @@ void Cheats::CheckUICoopDots() {
534553 g_coopLoadingDotsPatch->Restore ();
535554 }
536555}
556+
557+ void Cheats::CheckAutoGrab () {
558+ bool enabled = sar_patch_autograb.GetBool ();
559+ if (enabled && (!g_autoGrabPatchServer || !g_autoGrabPatchServer->IsInit ())) {
560+ console->Print (" sar_patch_autograb is not available (Server).\n " );
561+ sar_patch_autograb.SetValue (0 );
562+ return ;
563+ }
564+ if (enabled && (!g_autoGrabPatchClient || !g_autoGrabPatchClient->IsInit ())) {
565+ console->Print (" sar_patch_autograb is not available (Client).\n " );
566+ sar_patch_autograb.SetValue (0 );
567+ return ;
568+ }
569+ if (!sv_cheats.GetBool () && enabled) {
570+ console->Print (" sar_patch_autograb requires sv_cheats 1.\n " );
571+ sar_patch_autograb.SetValue (0 );
572+ enabled = false ;
573+ }
574+
575+ if (enabled == g_autoGrabPatchServer->IsPatched () && enabled == g_autoGrabPatchClient->IsPatched ()) {
576+ return ;
577+ }
578+
579+ if (enabled) {
580+ g_autoGrabPatchServer->Execute ();
581+ g_autoGrabPatchClient->Execute ();
582+ } else {
583+ g_autoGrabPatchServer->Restore ();
584+ g_autoGrabPatchClient->Restore ();
585+ }
586+ }
0 commit comments