From 18525cf779f010fd968b9a6113ebf67a210153f1 Mon Sep 17 00:00:00 2001 From: kurumimeow Date: Sun, 22 Jun 2025 05:16:28 +0530 Subject: [PATCH 1/2] update some locals and fix misleading globals and locals declaration (#531) --- .../recovery/Heist/ApartmentHeist.cpp | 67 +++++---- .../recovery/Heist/CayoPericoHeist.cpp | 125 ++++++++++------ .../recovery/Heist/DiamondCasinoHeist.cpp | 141 ++++++++++++++---- .../features/recovery/Heist/DoomsdayHeist.cpp | 67 +++++---- 4 files changed, 264 insertions(+), 136 deletions(-) diff --git a/src/game/features/recovery/Heist/ApartmentHeist.cpp b/src/game/features/recovery/Heist/ApartmentHeist.cpp index 0555ce5..4d40cf4 100644 --- a/src/game/features/recovery/Heist/ApartmentHeist.cpp +++ b/src/game/features/recovery/Heist/ApartmentHeist.cpp @@ -25,20 +25,19 @@ namespace YimMenu::Features auto base1 = ScriptGlobal(1931800).At(1); auto base2 = ScriptGlobal(1933768).At(3008); - *base1.At(1).As() = 100 - - (_ApartmentHeistCut1.GetState() + _ApartmentHeistCut2.GetState() + _ApartmentHeistCut3.GetState() - + _ApartmentHeistCut4.GetState()); - *base1.At(2).As() = _ApartmentHeistCut2.GetState(); - *base1.At(3).As() = _ApartmentHeistCut3.GetState(); - *base1.At(4).As() = _ApartmentHeistCut4.GetState(); + *base1.At(0, 1).As() = 100 - (_ApartmentHeistCut1.GetState() + _ApartmentHeistCut2.GetState() + _ApartmentHeistCut3.GetState() + _ApartmentHeistCut4.GetState()); + *base1.At(1, 1).As() = _ApartmentHeistCut2.GetState(); + *base1.At(2, 1).As() = _ApartmentHeistCut3.GetState(); + *base1.At(3, 1).As() = _ApartmentHeistCut4.GetState(); ScriptMgr::Yield(500ms); - *base2.At(1).As() = - -1 * (*base1.At(1).As() + *base1.At(2).As() + *base1.At(3).As() + *base1.At(4).As() - 100); - *base2.At(2).As() = *base1.At(2).As(); - *base2.At(3).As() = *base1.At(3).As(); - *base2.At(4).As() = *base1.At(4).As(); + *base2.At(0, 1).As() = -1 * (*base1.At(0, 1).As() + *base1.At(1, 1).As() + *base1.At(2, 1).As() + *base1.At(3, 1).As() - 100); + + for (int i = 1; i <= 3; i++) + { + *base2.At(i, 1).As() = *base1.At(i, 1).As(); + } } }; @@ -74,9 +73,11 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller"_J, 12220).At(24).As() = 7; - *ScriptLocal("fm_mission_controller"_J, 10215).As() = - *ScriptLocal("fm_mission_controller"_J, 10215).As() | (1 << 9); + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + *ScriptLocal(thread, 12220).At(24).As() = 7; + *ScriptLocal(thread, 10215).As() = *ScriptLocal(thread, 10215).As() | (1 << 9); + } } }; @@ -86,7 +87,10 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller"_J, 10509).At(11).As() = 100.0f; + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + *ScriptLocal(thread, 10509).At(11).As() = 100.0f; + } } }; @@ -96,14 +100,16 @@ namespace YimMenu::Features virtual void OnCall() override { - Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); - ScriptMgr::Yield(500ms); - - *ScriptLocal("fm_mission_controller"_J, 20391).At(1725).At(1).As() = 80; - *ScriptLocal("fm_mission_controller"_J, 20391).As() = 12; - *ScriptLocal("fm_mission_controller"_J, 29011).At(1).As() = 99999; - *ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As() = 99999; + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + Scripts::ForceScriptHost(thread); + ScriptMgr::Yield(500ms); + *ScriptLocal(thread, 20391).At(1725).At(0, 1).As() = 80; + *ScriptLocal(thread, 20391).As() = 12; + *ScriptLocal(thread, 29011).At(0, 1).As() = 99999; + *ScriptLocal(thread, 32467).At(0, 294).At(68).As() = 99999; + } // TODO: find a way of getting current heist info so that InstantFinishPacific can be implemented here conditionally. } }; @@ -114,14 +120,17 @@ namespace YimMenu::Features virtual void OnCall() override { - Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); - ScriptMgr::Yield(500ms); + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + Scripts::ForceScriptHost(thread); + ScriptMgr::Yield(500ms); - *ScriptLocal("fm_mission_controller"_J, 20391).At(2686).As() = 1875000; - *ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As() = 5; - *ScriptLocal("fm_mission_controller"_J, 20391).As() = 12; - *ScriptLocal("fm_mission_controller"_J, 29011).At(1).As() = 99999; - *ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As() = 99999; + *ScriptLocal(thread, 20391).At(2686).As() = 1875000; + *ScriptLocal(thread, 20391).At(1062).As() = 5; + *ScriptLocal(thread, 20391).As() = 12; + *ScriptLocal(thread, 29011).At(0, 1).As() = 99999; + *ScriptLocal(thread, 32467).At(0, 294).At(68).As() = 99999; + } } }; diff --git a/src/game/features/recovery/Heist/CayoPericoHeist.cpp b/src/game/features/recovery/Heist/CayoPericoHeist.cpp index f1539df..61d6bf4 100644 --- a/src/game/features/recovery/Heist/CayoPericoHeist.cpp +++ b/src/game/features/recovery/Heist/CayoPericoHeist.cpp @@ -8,6 +8,7 @@ #include "game/gta/ScriptLocal.hpp" #include "core/backend/ScriptMgr.hpp" #include "game/backend/Tunables.hpp" +#include "core/backend/FiberPool.hpp" namespace YimMenu::Features { @@ -26,10 +27,10 @@ namespace YimMenu::Features { auto base = ScriptGlobal(1975799).At(831).At(56); - *base.At(1).As() = _CayoPericoHeistCut1.GetState(); - *base.At(2).As() = _CayoPericoHeistCut2.GetState(); - *base.At(3).As() = _CayoPericoHeistCut3.GetState(); - *base.At(4).As() = _CayoPericoHeistCut4.GetState(); + *base.At(0, 1).As() = _CayoPericoHeistCut1.GetState(); + *base.At(1, 1).As() = _CayoPericoHeistCut2.GetState(); + *base.At(2, 1).As() = _CayoPericoHeistCut3.GetState(); + *base.At(3, 1).As() = _CayoPericoHeistCut4.GetState(); } }; @@ -41,20 +42,36 @@ namespace YimMenu::Features { auto base = ScriptGlobal(1976911); - *base.At(0, 27).At(8).At(0).As() = 1; - *base.At(1, 27).At(8).At(1).As() = 1; - *base.At(2, 27).At(8).At(2).As() = 1; - *base.At(3, 27).At(8).At(3).As() = 1; + for (int i = 0; i <= 3; i++) + { + *base.At(i, 27).At(7).At(i, 1).As() = 1; + } } }; - static std::vector> cayoPericoHeistDifficulty = {{126823, "Normal"}, {131055, "Hard"}}; + static std::vector> cayoPericoHeistDifficulty = { + {126823, "Normal"}, + {131055, "Hard"} + }; static ListCommand _CayoPericoHeistDifficulty{"cayopericoheistdifficulty", "Difficulty", "Heist difficulty", cayoPericoHeistDifficulty, 126823}; - static std::vector> cayoPericoHeistPrimaryTarget = {{5, "Panther Statue"}, {3, "Pink Diamond"}, {4, "Madrazo Files"}, {2, "Bearer Bonds"}, {1, "Ruby Necklace"}, {0, "Sinsimito Tequila"}}; + static std::vector> cayoPericoHeistPrimaryTarget = { + {5, "Panther Statue"}, + {3, "Pink Diamond"}, + {4, "Madrazo Files"}, + {2, "Bearer Bonds"}, + {1, "Ruby Necklace"}, + {0, "Sinsimito Tequila"} + }; static ListCommand _CayoPericoHeistPrimaryTarget{"cayopericoheistprimarytarget", "Primary Target", "Primary target", cayoPericoHeistPrimaryTarget, 5}; - static std::vector> cayoPericoHeistWeapon = {{1, "Aggressor"}, {2, "Conspirator"}, {3, "Crack Shot"}, {4, "Saboteur"}, {5, "Marksman"}}; + static std::vector> cayoPericoHeistWeapon = { + {1, "Aggressor"}, + {2, "Conspirator"}, + {3, "Crack Shot"}, + {4, "Saboteur"}, + {5, "Marksman"} + }; static ListCommand _CayoPericoHeistWeapon{"cayopericoheistweapon", "Weapon", "Weapon category", cayoPericoHeistWeapon, 1}; class Setup : public Command @@ -105,7 +122,8 @@ namespace YimMenu::Features ScriptMgr::Yield(500ms); - *ScriptLocal("heist_island_planning"_J, 1566).As() = 2; + if (auto thread = Scripts::FindScriptThread("heist_island_planning"_J)) + *ScriptLocal(thread, 1568).As() = 2; } }; @@ -176,8 +194,8 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller_2020"_J, 58222).At(1357).At(53).As() = - _CayoPericoHeistSecondaryTakeValue.GetState(); + if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J)) + *ScriptLocal(thread, 58222).At(1357).At(53).As() = _CayoPericoHeistSecondaryTakeValue.GetState(); } }; @@ -187,7 +205,8 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller_2020"_J, 25460).As() = 5; + if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J)) + *ScriptLocal(thread, 25460).As() = 5; } }; @@ -197,7 +216,8 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller_2020"_J, 30285).As() = 6; + if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J)) + *ScriptLocal(thread, 30285).As() = 6; } }; @@ -207,7 +227,8 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller_2020"_J, 31525).At(3).As() = 100.0f; + if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J)) + *ScriptLocal(thread, 31525).At(3).As() = 100.0f; } }; @@ -217,34 +238,41 @@ namespace YimMenu::Features virtual void OnCall() override { - auto ped = Self::GetPed(); - - if (!ped) - return; - - auto pos = ped.GetPosition(); - auto heading = ped.GetHeading(); - auto primary_target = Stats::GetInt("MPX_H4CNF_TARGET"); - - TASK::TASK_GO_STRAIGHT_TO_COORD(ped.GetHandle(), 5006.917, -5755.931, 15.484, 1.0, 3, 15, 5); - - switch (primary_target) + if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J)) { - case 0: - case 1: - case 3: - case 5: - *ScriptLocal("fm_mission_controller_2020"_J, 31524).As() = 5; - *ScriptLocal("fm_mission_controller_2020"_J, 31525).As() = 3; - break; - case 2: - case 4: *ScriptLocal("fm_mission_controller_2020"_J, 31499).As() = 7; break; - default: break; + auto ped = Self::GetPed(); + + if (!ped) + return; + + auto pos = ped.GetPosition(); + auto heading = ped.GetHeading(); + auto primary_target = Stats::GetInt("MPX_H4CNF_TARGET"); + + FiberPool::Push([&] { + TASK::TASK_GO_STRAIGHT_TO_COORD(ped.GetHandle(), 5006.917, -5755.931, 15.484, 1.0, 3, 15, 5); + + switch (primary_target) + { + case 0: + case 1: + case 3: + case 5: + *ScriptLocal(thread, 31524).As() = 5; + *ScriptLocal(thread, 31525).As() = 3; + break; + case 2: + case 4: + *ScriptLocal(thread, 31499).As() = 7; + break; + default: break; + } + + ScriptMgr::Yield(4000ms); + + TASK::TASK_GO_STRAIGHT_TO_COORD(ped.GetHandle(), pos.x, pos.y, pos.z, 1.0, 3, heading, 5); + }); } - - ScriptMgr::Yield(4000ms); - - TASK::TASK_GO_STRAIGHT_TO_COORD(ped.GetHandle(), pos.x, pos.y, pos.z, 1.0, 3, heading, 5); } }; @@ -254,11 +282,14 @@ namespace YimMenu::Features virtual void OnCall() override { - Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller_2020"_J)); - ScriptMgr::Yield(500ms); + if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J)) + { + Scripts::ForceScriptHost(thread); + ScriptMgr::Yield(500ms); - *ScriptLocal("fm_mission_controller_2020"_J, 54763).As() = 9; - *ScriptLocal("fm_mission_controller_2020"_J, 54763).At(1776).At(1).As() = 50; + *ScriptLocal(thread, 54763).As() = 9; + *ScriptLocal(thread, 54763).At(1776).At(0, 1).As() = 50; + } } }; diff --git a/src/game/features/recovery/Heist/DiamondCasinoHeist.cpp b/src/game/features/recovery/Heist/DiamondCasinoHeist.cpp index b149e20..980c839 100644 --- a/src/game/features/recovery/Heist/DiamondCasinoHeist.cpp +++ b/src/game/features/recovery/Heist/DiamondCasinoHeist.cpp @@ -25,10 +25,10 @@ namespace YimMenu::Features { auto base = ScriptGlobal(1968996).At(1497).At(736).At(92); - *base.At(1).As() = _DiamondCasinoHeistCut1.GetState(); - *base.At(2).As() = _DiamondCasinoHeistCut2.GetState(); - *base.At(3).As() = _DiamondCasinoHeistCut3.GetState(); - *base.At(4).As() = _DiamondCasinoHeistCut4.GetState(); + *base.At(0, 1).As() = _DiamondCasinoHeistCut1.GetState(); + *base.At(1, 1).As() = _DiamondCasinoHeistCut2.GetState(); + *base.At(2, 1).As() = _DiamondCasinoHeistCut3.GetState(); + *base.At(3, 1).As() = _DiamondCasinoHeistCut4.GetState(); } }; @@ -40,26 +40,71 @@ namespace YimMenu::Features { auto base = ScriptGlobal(1973359); - *base.At(0, 68).At(8).At(0).As() = 1; - *base.At(1, 68).At(8).At(1).As() = 1; - *base.At(2, 68).At(8).At(2).As() = 1; - *base.At(3, 68).At(8).At(3).As() = 1; + for (int i = 0; i <= 3; i++) + { + *base.At(i, 68).At(7).At(i, 1).As() = 1; + } } }; - static std::vector> diamondCasinoHeistDifficulty = {{0, "Normal"}, {1, "Hard"}}; + static std::vector> diamondCasinoHeistDifficulty = { + {0, "Normal"}, + {1, "Hard"} + }; static ListCommand _DiamondCasinoHeistDifficulty{"diamondcasinoheistdifficulty", "Difficulty", "Heist difficulty", diamondCasinoHeistDifficulty, 0}; - static std::vector> diamondCasinoHeistPrimaryTarget = {{3, "Diamonds"}, {1, "Gold"}, {2, "Artwork"}, {0, "Cash"}}; + static std::vector> diamondCasinoHeistPrimaryTarget = { + {3, "Diamonds"}, + {1, "Gold"}, + {2, "Artwork"}, + {0, "Cash"} + }; static ListCommand _DiamondCasinoHeistPrimaryTarget{"diamondcasinoheistprimarytarget", "Primary Target", "Primary target", diamondCasinoHeistPrimaryTarget, 3}; static ListCommand* _DiamondCasinoHeistGunmanPtr = nullptr; static ListCommand* _DiamondCasinoHeistApproachPtr = nullptr; - static std::vector>>> diamondCasinoHeistWeapon = {{{{0, "MK II Shotgun Loadout"}, {1, "MK II Rifle Loadout"}}, {{0, "MK II SMG Loadout"}, {1, "MK II Rifle Loadout"}}, {{0, "MK II Shotgun Loadout"}, {1, "MK II Rifle Loadout"}}}, {{{0, "Rifle Loadout"}, {1, "Shotgun Loadout"}}, {{0, "Rifle Loadout"}, {1, "Shotgun Loadout"}}, {{0, "Rifle Loadout"}, {1, "Shotgun Loadout"}}}, {{{0, "Combat PDW Loadout"}, {1, "Rifle Loadout"}}, {{0, "Shotgun Loadout"}, {1, "Rifle Loadout"}}, {{0, "Shotgun Loadout"}, {1, "Combat MG Loadout"}}}, {{{0, "SMG Loadout"}, {1, "Shotgun Loadout"}}, {{0, "Machine Pistol Loadout"}, {1, "Shotgun Loadout"}}, {{0, "SMG Loadout"}, {1, "Shotgun Loadout"}}}, {{{0, "Micro SMG Loadout"}, {1, "Machine Pistol Loadout"}}, {{0, "Micro SMG Loadout"}, {1, "Shotgun Loadout"}}, {{0, "Shotgun Loadout"}, {1, "Revolver Loadout"}}}, {{{0, " "}, {1, ""}}, {{0, ""}, {1, ""}}, {{0, ""}, {1, ""}}}}; + static std::vector>>> diamondCasinoHeistWeapon = { + { + {{0, "MK II Shotgun Loadout"}, {1, "MK II Rifle Loadout"}}, + {{0, "MK II SMG Loadout"}, {1, "MK II Rifle Loadout"}}, + {{0, "MK II Shotgun Loadout"}, {1, "MK II Rifle Loadout"}} + }, + { + {{0, "Rifle Loadout"}, {1, "Shotgun Loadout"}}, + {{0, "Rifle Loadout"}, {1, "Shotgun Loadout"}}, + {{0, "Rifle Loadout"}, {1, "Shotgun Loadout"}} + }, + { + {{0, "Combat PDW Loadout"}, {1, "Rifle Loadout"}}, + {{0, "Shotgun Loadout"}, {1, "Rifle Loadout"}}, + {{0, "Shotgun Loadout"}, {1, "Combat MG Loadout"}} + }, + { + {{0, "SMG Loadout"}, {1, "Shotgun Loadout"}}, + {{0, "Machine Pistol Loadout"}, {1, "Shotgun Loadout"}}, + {{0, "SMG Loadout"}, {1, "Shotgun Loadout"}} + }, + { + {{0, "Micro SMG Loadout"}, {1, "Machine Pistol Loadout"}}, + {{0, "Micro SMG Loadout"}, {1, "Shotgun Loadout"}}, + {{0, "Shotgun Loadout"}, {1, "Revolver Loadout"}}}, + { + {{0, " "}, {1, ""}}, + {{0, ""}, {1, ""}}, + {{0, ""}, {1, ""}} + } + }; static ListCommand _DiamondCasinoHeistWeapon{"diamondcasinoheistweapon", "Weapon", "Weapon", diamondCasinoHeistWeapon[5][0], 0}; - static std::vector> diamondCasinoHeistGunman = {{0, "Chester McCoy"}, {1, "Gustavo Mota"}, {2, "Patrick McReary"}, {3, "Charlie Reed"}, {4, "Karl Abolaji"}, {5, "Remove Gunman"}}; + static std::vector> diamondCasinoHeistGunman = { + {0, "Chester McCoy"}, + {1, "Gustavo Mota"}, + {2, "Patrick McReary"}, + {3, "Charlie Reed"}, + {4, "Karl Abolaji"}, + {5, "Remove Gunman"} + }; class Gunman : public ListCommand { @@ -67,14 +112,17 @@ namespace YimMenu::Features virtual void OnChange() override { - _DiamondCasinoHeistWeapon.SetList( - diamondCasinoHeistWeapon[this->GetState()][_DiamondCasinoHeistApproachPtr->GetState()]); + _DiamondCasinoHeistWeapon.SetList(diamondCasinoHeistWeapon[this->GetState()][_DiamondCasinoHeistApproachPtr->GetState()]); _DiamondCasinoHeistWeapon.SetState(0); } }; static Gunman _DiamondCasinoHeistGunman{"diamondcasinoheistgunman", "Gunman", "Gunman", diamondCasinoHeistGunman, 5}; - static std::vector> diamondCasinoHeistApproach = {{0, "Silent & Sneaky"}, {1, "The Big Con"}, {2, "Aggressive"}}; + static std::vector> diamondCasinoHeistApproach = { + {0, "Silent & Sneaky"}, + {1, "The Big Con"}, + {2, "Aggressive"} + }; class Approach : public ListCommand { @@ -82,8 +130,7 @@ namespace YimMenu::Features virtual void OnChange() override { - _DiamondCasinoHeistWeapon.SetList( - diamondCasinoHeistWeapon[_DiamondCasinoHeistGunmanPtr->GetState()][this->GetState()]); + _DiamondCasinoHeistWeapon.SetList(diamondCasinoHeistWeapon[_DiamondCasinoHeistGunmanPtr->GetState()][this->GetState()]); _DiamondCasinoHeistWeapon.SetState(0); } }; @@ -98,10 +145,24 @@ namespace YimMenu::Features } } _initPtrs; - static std::vector>> diamondCasinoHeistVehicle = {{{0, "Zhaba"}, {1, "Vagrant"}, {2, "Outlaw"}, {3, "Everon"}}, {{0, "Sultan Classic"}, {1, "Gauntlet Classic"}, {2, "Ellie"}, {3, "Komoda"}}, {{0, "Retinue MK II"}, {1, "Drifty Yosemite"}, {2, "Sugoi"}, {3, "Jugular"}}, {{0, "Manchez"}, {1, "Stryder"}, {2, "Defiler"}, {3, "Lectro"}}, {{0, "Issi Classic"}, {1, "Asbo"}, {2, "Kanjo"}, {3, "Sentinel Classic"}}, {{0, " "}, {1, ""}, {2, ""}, {3, ""}}}; + static std::vector>> diamondCasinoHeistVehicle = { + {{0, "Zhaba"}, {1, "Vagrant"}, {2, "Outlaw"}, {3, "Everon"}}, + {{0, "Sultan Classic"}, {1, "Gauntlet Classic"}, {2, "Ellie"}, {3, "Komoda"}}, + {{0, "Retinue MK II"}, {1, "Drifty Yosemite"}, {2, "Sugoi"}, {3, "Jugular"}}, + {{0, "Manchez"}, {1, "Stryder"}, {2, "Defiler"}, {3, "Lectro"}}, + {{0, "Issi Classic"}, {1, "Asbo"}, {2, "Kanjo"}, {3, "Sentinel Classic"}}, + {{0, " "}, {1, ""}, {2, ""}, {3, ""}} + }; static ListCommand _DiamondCasinoHeistVehicle{"diamondcasinoheistvehicle", "Vehicle", "Vehicle", diamondCasinoHeistVehicle[5], 0}; - static std::vector> diamondCasinoHeistDriver = {{0, "Chester McCoy"}, {1, "Eddie Toh"}, {2, "Taliana Martinez"}, {3, "Zach Nelson"}, {4, "Karim Denz"}, {5, "Remove Driver"}}; + static std::vector> diamondCasinoHeistDriver = { + {0, "Chester McCoy"}, + {1, "Eddie Toh"}, + {2, "Taliana Martinez"}, + {3, "Zach Nelson"}, + {4, "Karim Denz"}, + {5, "Remove Driver"} + }; class Driver : public ListCommand { @@ -115,7 +176,14 @@ namespace YimMenu::Features }; static Driver _DiamondCasinoHeistDriver{"diamondcasinoheistdriver", "Driver", "Driver", diamondCasinoHeistDriver, 5}; - static std::vector> diamondCasinoHeistHacker = {{4, "Avi Schwartzman"}, {5, "Paige Harris"}, {2, "Christian Feltz"}, {3, "Yohan Blair"}, {1, "Rickie Lukens"}, {6, "Remove Hacker"}}; + static std::vector> diamondCasinoHeistHacker = { + {4, "Avi Schwartzman"}, + {5, "Paige Harris"}, + {2, "Christian Feltz"}, + {3, "Yohan Blair"}, + {1, "Rickie Lukens"}, + {6, "Remove Hacker"} + }; static ListCommand _DiamondCasinoHeistHacker{"diamondcasinoheisthacker", "Hacker", "Hacker", diamondCasinoHeistHacker, 6}; class Setup : public Command @@ -233,7 +301,8 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller"_J, 20391).At(2686).As() = _DiamondCasinoHeistActualTake.GetState(); + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + *ScriptLocal(thread, 20391).At(2686).As() = _DiamondCasinoHeistActualTake.GetState(); } }; @@ -243,8 +312,11 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller"_J, 54037).As() = 5; - *ScriptLocal("fm_mission_controller"_J, 55103).As() = 5; + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + *ScriptLocal(thread, 54037).As() = 5; + *ScriptLocal(thread, 55103).As() = 5; + } } }; @@ -254,8 +326,8 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller"_J, 10549).At(7).As() = - *ScriptLocal("fm_mission_controller"_J, 10549).At(37).As(); + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + *ScriptLocal(thread, 10549).At(7).As() = *ScriptLocal(thread, 10549).At(37).As(); } }; @@ -265,15 +337,18 @@ namespace YimMenu::Features virtual void OnCall() override { - Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); - ScriptMgr::Yield(500ms); + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + Scripts::ForceScriptHost(thread); + ScriptMgr::Yield(500ms); - *ScriptLocal("fm_mission_controller"_J, 20391).At(1740).At(1).As() = 80; - *ScriptLocal("fm_mission_controller"_J, 20391).At(2686).As() = 4443220; - *ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As() = 5; - *ScriptLocal("fm_mission_controller"_J, 20391).As() = 12; - *ScriptLocal("fm_mission_controller"_J, 29011).At(1).As() = 99999; - *ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As() = 99999; + *ScriptLocal(thread, 20391).At(1740).At(0, 1).As() = 80; + *ScriptLocal(thread, 20391).At(2686).As() = 4443220; + *ScriptLocal(thread, 20391).At(1062).As() = 5; + *ScriptLocal(thread, 20391).As() = 12; + *ScriptLocal(thread, 29011).At(0, 1).As() = 99999; + *ScriptLocal(thread, 32467).At(0, 294).At(68).As() = 99999; + } } }; diff --git a/src/game/features/recovery/Heist/DoomsdayHeist.cpp b/src/game/features/recovery/Heist/DoomsdayHeist.cpp index 311fd67..ed33013 100644 --- a/src/game/features/recovery/Heist/DoomsdayHeist.cpp +++ b/src/game/features/recovery/Heist/DoomsdayHeist.cpp @@ -23,10 +23,10 @@ namespace YimMenu::Features { auto base = ScriptGlobal(1964170).At(812).At(50); - *base.At(1).As() = _DoomsdayHeistCut1.GetState(); - *base.At(2).As() = _DoomsdayHeistCut2.GetState(); - *base.At(3).As() = _DoomsdayHeistCut3.GetState(); - *base.At(4).As() = _DoomsdayHeistCut4.GetState(); + *base.At(0, 1).As() = _DoomsdayHeistCut1.GetState(); + *base.At(1, 1).As() = _DoomsdayHeistCut2.GetState(); + *base.At(2, 1).As() = _DoomsdayHeistCut3.GetState(); + *base.At(3, 1).As() = _DoomsdayHeistCut4.GetState(); } }; @@ -38,14 +38,18 @@ namespace YimMenu::Features { auto base = ScriptGlobal(1882449); - *base.At(0, 201).At(43).At(0).At(4).At(8).As() = 1; - *base.At(1, 201).At(43).At(1).At(4).At(8).As() = 1; - *base.At(2, 201).At(43).At(2).At(4).At(8).As() = 1; - *base.At(3, 201).At(43).At(3).At(4).At(8).As() = 1; + for (int i = 0; i <= 3; i++) + { + *base.At(i, 201).At(43).At(11).At(i, 1).As() = 1; + } } }; - static std::vector> doomsdayHeistCategory = {{0, "The Data Breaches"}, {1, "The Bogdan Problem"}, {2, "The Doomsday Senario"}}; + static std::vector> doomsdayHeistCategory = { + {0, "The Data Breaches"}, + {1, "The Bogdan Problem"}, + {2, "The Doomsday Senario"} + }; static ListCommand _DoomsdayHeistCategory{"doomsdayheistcategory", "Select Heist", "Heist categories", doomsdayHeistCategory, 0}; class Setup : public Command @@ -76,7 +80,8 @@ namespace YimMenu::Features ScriptMgr::Yield(500ms); - *ScriptLocal("gb_gang_ops_planning"_J, 207).As() = 6; // Reload planning screen + if (auto thread = Scripts::FindScriptThread("gb_gang_ops_planning"_J)) + *ScriptLocal(thread, 209).As() = 6; } }; @@ -86,9 +91,12 @@ namespace YimMenu::Features virtual void OnCall() override { - *ScriptLocal("fm_mission_controller"_J, 1540).As() = 3; - *ScriptLocal("fm_mission_controller"_J, 1571).As() = 2; - *ScriptLocal("fm_mission_controller"_J, 1296).At(135).As() = 3; + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + *ScriptLocal(thread, 1570).As() = 2; + *ScriptLocal(thread, 1539).As() = 3; + *ScriptLocal(thread, 1296).At(135).As() = 3; + } } }; @@ -98,14 +106,16 @@ namespace YimMenu::Features virtual void OnCall() override { - Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); - ScriptMgr::Yield(500ms); - - *ScriptLocal("fm_mission_controller"_J, 20391).At(1725).At(1).As() = 80; - *ScriptLocal("fm_mission_controller"_J, 20391).As() = 12; - *ScriptLocal("fm_mission_controller"_J, 29011).At(1).As() = 99999; - *ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As() = 99999; + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + Scripts::ForceScriptHost(thread); + ScriptMgr::Yield(500ms); + *ScriptLocal(thread, 20391).At(1725).At(0, 1).As() = 80; + *ScriptLocal(thread, 20391).As() = 12; + *ScriptLocal(thread, 29011).At(0, 1).As() = 99999; + *ScriptLocal(thread, 32467).At(0, 294).At(68).As() = 99999; + } // TODO: find a way of getting current heist info so that InstantFinishAct3 can be implemented here conditionally. } }; @@ -116,14 +126,17 @@ namespace YimMenu::Features virtual void OnCall() override { - Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); - ScriptMgr::Yield(500ms); + if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J)) + { + Scripts::ForceScriptHost(thread); + ScriptMgr::Yield(500ms); - *ScriptLocal("fm_mission_controller"_J, 20391).As() = 12; - *ScriptLocal("fm_mission_controller"_J, 20391).At(1740).At(1).As() = 150; - *ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As() = 5; - *ScriptLocal("fm_mission_controller"_J, 29011).At(1).As() = 99999; - *ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As() = 99999; + *ScriptLocal(thread, 20391).As() = 12; + *ScriptLocal(thread, 20391).At(1740).At(0, 1).As() = 150; + *ScriptLocal(thread, 20391).At(1062).As() = 5; + *ScriptLocal(thread, 29011).At(0, 1).As() = 99999; + *ScriptLocal(thread, 32467).At(0, 294).At(68).As() = 99999; + } } }; From 249744560e861f7b10132ead3a606ec87945827d Mon Sep 17 00:00:00 2001 From: Arthur <121949966+ShinyWasabi@users.noreply.github.com> Date: Sun, 22 Jun 2025 18:03:46 +0300 Subject: [PATCH 2/2] fix: Do not kill the vehicle reward script if we didn't start it (#533) --- .../features/vehicle/SavePersonalVehicle.cpp | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/game/features/vehicle/SavePersonalVehicle.cpp b/src/game/features/vehicle/SavePersonalVehicle.cpp index 66e35e6..b5fe633 100644 --- a/src/game/features/vehicle/SavePersonalVehicle.cpp +++ b/src/game/features/vehicle/SavePersonalVehicle.cpp @@ -21,7 +21,7 @@ namespace YimMenu::Features if (!m_ShouldRunScript) continue; - if (!*Pointers.IsSessionStarted || !Self::GetVehicle().IsValid()) + if (!*Pointers.IsSessionStarted || !Self::GetVehicle().IsValid()) // if transition happens or player gets out of vehicle, cleanup immediately { if (m_StartedByUs && m_Thread) { @@ -35,27 +35,35 @@ namespace YimMenu::Features if (!m_Thread) { - int id = Scripts::StartScript("AM_MP_VEHICLE_REWARD"_J, eStackSizes::FRIEND); - m_Thread = Scripts::FindScriptThreadByID(id); - if (m_Thread) + if (Scripts::IsScriptActive("AM_MP_VEHICLE_REWARD"_J)) // This script already runs in freemode, so check if it is active first { - m_Thread->m_Context.m_State = rage::scrThread::State::PAUSED; - m_StartedByUs = true; + m_Thread = Scripts::FindScriptThread("AM_MP_VEHICLE_REWARD"_J); } - else + else // if not (e.g., we are in a mission), start and pause it { - m_ShouldRunScript = false; - continue; + int id = Scripts::StartScript("AM_MP_VEHICLE_REWARD"_J, eStackSizes::FRIEND); + m_Thread = Scripts::FindScriptThreadByID(id); + if (m_Thread) + { + m_Thread->m_Context.m_State = rage::scrThread::State::PAUSED; + m_StartedByUs = true; // mark so we only kill it if started by us + } } } + if (!m_Thread) // if still invalid, exit early + { + m_ShouldRunScript = false; + continue; + } + if (auto VehicleRewardData = VEHICLE_REWARD_DATA::Get(m_Thread)) { auto VehicleMenuData = ScriptLocal(m_Thread, 176).As(); // TO-DO: add struct for this? static ScriptFunction giveVehicleReward("AM_MP_VEHICLE_REWARD"_J, ScriptPointer("GiveVehicleReward", "2D 0C 1E 00 00")); if (giveVehicleReward.Call(Self::GetVehicle().GetHandle(), VehicleMenuData, &VehicleRewardData->TransactionStatus, &VehicleRewardData->Garage, &VehicleRewardData->GarageOffset, &VehicleRewardData->ControlStatus, false, true, true, false, 0, -1)) { - if (VehicleRewardData->ControlStatus != 3) + if (VehicleRewardData->ControlStatus != 3) // success (player either saved the vehicle or exited the menu) { VehicleRewardData->TransactionStatus = 0; VehicleRewardData->Garage = 0; @@ -75,7 +83,7 @@ namespace YimMenu::Features } // Some vehicles cannot be safely acquired using this method, see #443 - static const std::unordered_set s_BlacklistedVehicles = {"rcbandito"_J, "minitank"_J, "thruster"_J, "terbyte"_J, "avenger"_J, "hauler2"_J, "phantom3"_J, "speedo4"_J, "pounder2"_J, "mule4"_J, "kosatka"_J, "policet3"_J, "brickade2"_J}; + static const std::unordered_set s_BlacklistedVehicles = {"rcbandito"_J, "minitank"_J, "thruster"_J, "terbyte"_J, "avenger"_J, "policet3"_J, "brickade2"_J}; class _SavePersonalVehicle : public Command {