@@ -331,6 +331,7 @@ Memory::Patch *g_floorReportalPatch;
331331Memory::Patch *g_coopLoadingDotsPatch;
332332Memory::Patch *g_autoGrabPatchServer;
333333Memory::Patch *g_autoGrabPatchClient;
334+ Memory::Patch *g_promoFlagsPatch;
334335
335336void Cheats::Init () {
336337 sv_laser_cube_autoaim = Variable (" sv_laser_cube_autoaim" );
@@ -399,6 +400,14 @@ void Cheats::Init() {
399400 g_autoGrabPatchClient->Restore ();
400401 }
401402
403+ g_promoFlagsPatch = new Memory::Patch ();
404+ auto portal2PromoFlags = Memory::Scan (MODULE (" server" ), Offsets::Portal2PromoFlagsSig, Offsets::Portal2PromoFlagsOff);
405+ if (portal2PromoFlags) {
406+ unsigned char promoFlagsByte = 0x00 ;
407+ g_promoFlagsPatch->Execute (Memory::Deref<uintptr_t >(portal2PromoFlags), &promoFlagsByte, 1 ); // Note: Has to be active before map loads.
408+ g_promoFlagsPatch->Restore ();
409+ }
410+
402411 Variable::RegisterAll ();
403412 Command::RegisterAll ();
404413}
@@ -422,6 +431,8 @@ void Cheats::Shutdown() {
422431 SAFE_DELETE (g_autoGrabPatchServer);
423432 g_autoGrabPatchClient->Restore ();
424433 SAFE_DELETE (g_autoGrabPatchClient);
434+ g_promoFlagsPatch->Restore ();
435+ SAFE_DELETE (g_promoFlagsPatch);
425436}
426437
427438
@@ -589,3 +600,37 @@ void Cheats::CheckAutoGrab() {
589600 g_autoGrabPatchClient->Restore ();
590601 }
591602}
603+
604+ DECL_AUTO_COMMAND_COMPLETION (sar_set_promo_items_state, ({" skins" , " helmet" , " antenna" })) // TODO: Add support for autofilling multiple args.
605+ CON_COMMAND_F_COMPLETION(sar_set_promo_items_state, " sar_set_promo_items_state <off|all|skins|helmet|antenna>... - enables coop promotional items on spawn.\n " , FCVAR_CHEAT, AUTOCOMPLETION_FUNCTION(sar_set_promo_items_state)) {
606+ if (!g_promoFlagsPatch || !g_promoFlagsPatch->IsInit ()) {
607+ return console->Print (" sar_set_promo_items_state is not available.\n " );
608+ }
609+
610+ if (args.ArgC () < 2 ) {
611+ return console->Print (sar_set_promo_items_state.ThisPtr ()->m_pszHelpString );
612+ }
613+
614+ unsigned char targetFlags = 0 ;
615+ for (int i = 1 ; i < args.ArgC (); i++) {
616+ if (strcasecmp (args[i], " off" ) == 0 ) {
617+ g_promoFlagsPatch->Restore ();
618+ return ;
619+ }
620+ if (strcasecmp (args[i], " all" ) == 0 ) {
621+ targetFlags = 0b111 ;
622+ break ;
623+ }
624+ if (strcasecmp (args[i], " skins" ) == 0 ) {;
625+ targetFlags |= 0b001 ;
626+ } else if (strcasecmp (args[i], " helmet" ) == 0 ) {
627+ targetFlags |= 0b010 ;
628+ } else if (strcasecmp (args[i], " antenna" ) == 0 ) {
629+ targetFlags |= 0b100 ;
630+ } else {
631+ return console->Print (sar_set_promo_items_state.ThisPtr ()->m_pszHelpString );
632+ }
633+ }
634+ g_promoFlagsPatch->Restore ();
635+ g_promoFlagsPatch->Execute (&targetFlags, 1 );
636+ }
0 commit comments