Merge branch 'enhanced' of https://github.com/YimMenu/YimMenuV2 into enhanced

This commit is contained in:
maybegreat48
2025-06-22 15:38:03 -04:00
5 changed files with 283 additions and 147 deletions
@@ -25,20 +25,19 @@ namespace YimMenu::Features
auto base1 = ScriptGlobal(1931800).At(1); auto base1 = ScriptGlobal(1931800).At(1);
auto base2 = ScriptGlobal(1933768).At(3008); auto base2 = ScriptGlobal(1933768).At(3008);
*base1.At(1).As<int*>() = 100 *base1.At(0, 1).As<int*>() = 100 - (_ApartmentHeistCut1.GetState() + _ApartmentHeistCut2.GetState() + _ApartmentHeistCut3.GetState() + _ApartmentHeistCut4.GetState());
- (_ApartmentHeistCut1.GetState() + _ApartmentHeistCut2.GetState() + _ApartmentHeistCut3.GetState() *base1.At(1, 1).As<int*>() = _ApartmentHeistCut2.GetState();
+ _ApartmentHeistCut4.GetState()); *base1.At(2, 1).As<int*>() = _ApartmentHeistCut3.GetState();
*base1.At(2).As<int*>() = _ApartmentHeistCut2.GetState(); *base1.At(3, 1).As<int*>() = _ApartmentHeistCut4.GetState();
*base1.At(3).As<int*>() = _ApartmentHeistCut3.GetState();
*base1.At(4).As<int*>() = _ApartmentHeistCut4.GetState();
ScriptMgr::Yield(500ms); ScriptMgr::Yield(500ms);
*base2.At(1).As<int*>() = *base2.At(0, 1).As<int*>() = -1 * (*base1.At(0, 1).As<int*>() + *base1.At(1, 1).As<int*>() + *base1.At(2, 1).As<int*>() + *base1.At(3, 1).As<int*>() - 100);
-1 * (*base1.At(1).As<int*>() + *base1.At(2).As<int*>() + *base1.At(3).As<int*>() + *base1.At(4).As<int*>() - 100);
*base2.At(2).As<int*>() = *base1.At(2).As<int*>(); for (int i = 1; i <= 3; i++)
*base2.At(3).As<int*>() = *base1.At(3).As<int*>(); {
*base2.At(4).As<int*>() = *base1.At(4).As<int*>(); *base2.At(i, 1).As<int*>() = *base1.At(i, 1).As<int*>();
}
} }
}; };
@@ -74,9 +73,11 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller"_J, 12220).At(24).As<int*>() = 7; if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
*ScriptLocal("fm_mission_controller"_J, 10215).As<int*>() = {
*ScriptLocal("fm_mission_controller"_J, 10215).As<int*>() | (1 << 9); *ScriptLocal(thread, 12220).At(24).As<int*>() = 7;
*ScriptLocal(thread, 10215).As<int*>() = *ScriptLocal(thread, 10215).As<int*>() | (1 << 9);
}
} }
}; };
@@ -86,7 +87,10 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller"_J, 10509).At(11).As<float*>() = 100.0f; if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
{
*ScriptLocal(thread, 10509).At(11).As<float*>() = 100.0f;
}
} }
}; };
@@ -96,14 +100,16 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
ScriptMgr::Yield(500ms); {
Scripts::ForceScriptHost(thread);
*ScriptLocal("fm_mission_controller"_J, 20391).At(1725).At(1).As<int*>() = 80; ScriptMgr::Yield(500ms);
*ScriptLocal("fm_mission_controller"_J, 20391).As<int*>() = 12;
*ScriptLocal("fm_mission_controller"_J, 29011).At(1).As<int*>() = 99999;
*ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As<int*>() = 99999;
*ScriptLocal(thread, 20391).At(1725).At(0, 1).As<int*>() = 80;
*ScriptLocal(thread, 20391).As<int*>() = 12;
*ScriptLocal(thread, 29011).At(0, 1).As<int*>() = 99999;
*ScriptLocal(thread, 32467).At(0, 294).At(68).As<int*>() = 99999;
}
// TODO: find a way of getting current heist info so that InstantFinishPacific can be implemented here conditionally. // 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 virtual void OnCall() override
{ {
Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
ScriptMgr::Yield(500ms); {
Scripts::ForceScriptHost(thread);
ScriptMgr::Yield(500ms);
*ScriptLocal("fm_mission_controller"_J, 20391).At(2686).As<int*>() = 1875000; *ScriptLocal(thread, 20391).At(2686).As<int*>() = 1875000;
*ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As<int*>() = 5; *ScriptLocal(thread, 20391).At(1062).As<int*>() = 5;
*ScriptLocal("fm_mission_controller"_J, 20391).As<int*>() = 12; *ScriptLocal(thread, 20391).As<int*>() = 12;
*ScriptLocal("fm_mission_controller"_J, 29011).At(1).As<int*>() = 99999; *ScriptLocal(thread, 29011).At(0, 1).As<int*>() = 99999;
*ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As<int*>() = 99999; *ScriptLocal(thread, 32467).At(0, 294).At(68).As<int*>() = 99999;
}
} }
}; };
@@ -8,6 +8,7 @@
#include "game/gta/ScriptLocal.hpp" #include "game/gta/ScriptLocal.hpp"
#include "core/backend/ScriptMgr.hpp" #include "core/backend/ScriptMgr.hpp"
#include "game/backend/Tunables.hpp" #include "game/backend/Tunables.hpp"
#include "core/backend/FiberPool.hpp"
namespace YimMenu::Features namespace YimMenu::Features
{ {
@@ -26,10 +27,10 @@ namespace YimMenu::Features
{ {
auto base = ScriptGlobal(1975799).At(831).At(56); auto base = ScriptGlobal(1975799).At(831).At(56);
*base.At(1).As<int*>() = _CayoPericoHeistCut1.GetState(); *base.At(0, 1).As<int*>() = _CayoPericoHeistCut1.GetState();
*base.At(2).As<int*>() = _CayoPericoHeistCut2.GetState(); *base.At(1, 1).As<int*>() = _CayoPericoHeistCut2.GetState();
*base.At(3).As<int*>() = _CayoPericoHeistCut3.GetState(); *base.At(2, 1).As<int*>() = _CayoPericoHeistCut3.GetState();
*base.At(4).As<int*>() = _CayoPericoHeistCut4.GetState(); *base.At(3, 1).As<int*>() = _CayoPericoHeistCut4.GetState();
} }
}; };
@@ -41,20 +42,36 @@ namespace YimMenu::Features
{ {
auto base = ScriptGlobal(1976911); auto base = ScriptGlobal(1976911);
*base.At(0, 27).At(8).At(0).As<int*>() = 1; for (int i = 0; i <= 3; i++)
*base.At(1, 27).At(8).At(1).As<int*>() = 1; {
*base.At(2, 27).At(8).At(2).As<int*>() = 1; *base.At(i, 27).At(7).At(i, 1).As<int*>() = 1;
*base.At(3, 27).At(8).At(3).As<int*>() = 1; }
} }
}; };
static std::vector<std::pair<int, const char*>> cayoPericoHeistDifficulty = {{126823, "Normal"}, {131055, "Hard"}}; static std::vector<std::pair<int, const char*>> cayoPericoHeistDifficulty = {
{126823, "Normal"},
{131055, "Hard"}
};
static ListCommand _CayoPericoHeistDifficulty{"cayopericoheistdifficulty", "Difficulty", "Heist difficulty", cayoPericoHeistDifficulty, 126823}; static ListCommand _CayoPericoHeistDifficulty{"cayopericoheistdifficulty", "Difficulty", "Heist difficulty", cayoPericoHeistDifficulty, 126823};
static std::vector<std::pair<int, const char*>> cayoPericoHeistPrimaryTarget = {{5, "Panther Statue"}, {3, "Pink Diamond"}, {4, "Madrazo Files"}, {2, "Bearer Bonds"}, {1, "Ruby Necklace"}, {0, "Sinsimito Tequila"}}; static std::vector<std::pair<int, const char*>> 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 ListCommand _CayoPericoHeistPrimaryTarget{"cayopericoheistprimarytarget", "Primary Target", "Primary target", cayoPericoHeistPrimaryTarget, 5};
static std::vector<std::pair<int, const char*>> cayoPericoHeistWeapon = {{1, "Aggressor"}, {2, "Conspirator"}, {3, "Crack Shot"}, {4, "Saboteur"}, {5, "Marksman"}}; static std::vector<std::pair<int, const char*>> cayoPericoHeistWeapon = {
{1, "Aggressor"},
{2, "Conspirator"},
{3, "Crack Shot"},
{4, "Saboteur"},
{5, "Marksman"}
};
static ListCommand _CayoPericoHeistWeapon{"cayopericoheistweapon", "Weapon", "Weapon category", cayoPericoHeistWeapon, 1}; static ListCommand _CayoPericoHeistWeapon{"cayopericoheistweapon", "Weapon", "Weapon category", cayoPericoHeistWeapon, 1};
class Setup : public Command class Setup : public Command
@@ -105,7 +122,8 @@ namespace YimMenu::Features
ScriptMgr::Yield(500ms); ScriptMgr::Yield(500ms);
*ScriptLocal("heist_island_planning"_J, 1566).As<int*>() = 2; if (auto thread = Scripts::FindScriptThread("heist_island_planning"_J))
*ScriptLocal(thread, 1568).As<int*>() = 2;
} }
}; };
@@ -176,8 +194,8 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller_2020"_J, 58222).At(1357).At(53).As<int*>() = if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
_CayoPericoHeistSecondaryTakeValue.GetState(); *ScriptLocal(thread, 58222).At(1357).At(53).As<int*>() = _CayoPericoHeistSecondaryTakeValue.GetState();
} }
}; };
@@ -187,7 +205,8 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller_2020"_J, 25460).As<int*>() = 5; if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
*ScriptLocal(thread, 25460).As<int*>() = 5;
} }
}; };
@@ -197,7 +216,8 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller_2020"_J, 30285).As<int*>() = 6; if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
*ScriptLocal(thread, 30285).As<int*>() = 6;
} }
}; };
@@ -207,7 +227,8 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller_2020"_J, 31525).At(3).As<float*>() = 100.0f; if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
*ScriptLocal(thread, 31525).At(3).As<float*>() = 100.0f;
} }
}; };
@@ -217,34 +238,41 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
auto ped = Self::GetPed(); if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
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)
{ {
case 0: auto ped = Self::GetPed();
case 1:
case 3: if (!ped)
case 5: return;
*ScriptLocal("fm_mission_controller_2020"_J, 31524).As<int*>() = 5;
*ScriptLocal("fm_mission_controller_2020"_J, 31525).As<int*>() = 3; auto pos = ped.GetPosition();
break; auto heading = ped.GetHeading();
case 2: auto primary_target = Stats::GetInt("MPX_H4CNF_TARGET");
case 4: *ScriptLocal("fm_mission_controller_2020"_J, 31499).As<int*>() = 7; break;
default: break; 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<int*>() = 5;
*ScriptLocal(thread, 31525).As<int*>() = 3;
break;
case 2:
case 4:
*ScriptLocal(thread, 31499).As<int*>() = 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 virtual void OnCall() override
{ {
Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller_2020"_J)); if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
ScriptMgr::Yield(500ms); {
Scripts::ForceScriptHost(thread);
ScriptMgr::Yield(500ms);
*ScriptLocal("fm_mission_controller_2020"_J, 54763).As<int*>() = 9; *ScriptLocal(thread, 54763).As<int*>() = 9;
*ScriptLocal("fm_mission_controller_2020"_J, 54763).At(1776).At(1).As<int*>() = 50; *ScriptLocal(thread, 54763).At(1776).At(0, 1).As<int*>() = 50;
}
} }
}; };
@@ -25,10 +25,10 @@ namespace YimMenu::Features
{ {
auto base = ScriptGlobal(1968996).At(1497).At(736).At(92); auto base = ScriptGlobal(1968996).At(1497).At(736).At(92);
*base.At(1).As<int*>() = _DiamondCasinoHeistCut1.GetState(); *base.At(0, 1).As<int*>() = _DiamondCasinoHeistCut1.GetState();
*base.At(2).As<int*>() = _DiamondCasinoHeistCut2.GetState(); *base.At(1, 1).As<int*>() = _DiamondCasinoHeistCut2.GetState();
*base.At(3).As<int*>() = _DiamondCasinoHeistCut3.GetState(); *base.At(2, 1).As<int*>() = _DiamondCasinoHeistCut3.GetState();
*base.At(4).As<int*>() = _DiamondCasinoHeistCut4.GetState(); *base.At(3, 1).As<int*>() = _DiamondCasinoHeistCut4.GetState();
} }
}; };
@@ -40,26 +40,71 @@ namespace YimMenu::Features
{ {
auto base = ScriptGlobal(1973359); auto base = ScriptGlobal(1973359);
*base.At(0, 68).At(8).At(0).As<int*>() = 1; for (int i = 0; i <= 3; i++)
*base.At(1, 68).At(8).At(1).As<int*>() = 1; {
*base.At(2, 68).At(8).At(2).As<int*>() = 1; *base.At(i, 68).At(7).At(i, 1).As<int*>() = 1;
*base.At(3, 68).At(8).At(3).As<int*>() = 1; }
} }
}; };
static std::vector<std::pair<int, const char*>> diamondCasinoHeistDifficulty = {{0, "Normal"}, {1, "Hard"}}; static std::vector<std::pair<int, const char*>> diamondCasinoHeistDifficulty = {
{0, "Normal"},
{1, "Hard"}
};
static ListCommand _DiamondCasinoHeistDifficulty{"diamondcasinoheistdifficulty", "Difficulty", "Heist difficulty", diamondCasinoHeistDifficulty, 0}; static ListCommand _DiamondCasinoHeistDifficulty{"diamondcasinoheistdifficulty", "Difficulty", "Heist difficulty", diamondCasinoHeistDifficulty, 0};
static std::vector<std::pair<int, const char*>> diamondCasinoHeistPrimaryTarget = {{3, "Diamonds"}, {1, "Gold"}, {2, "Artwork"}, {0, "Cash"}}; static std::vector<std::pair<int, const char*>> diamondCasinoHeistPrimaryTarget = {
{3, "Diamonds"},
{1, "Gold"},
{2, "Artwork"},
{0, "Cash"}
};
static ListCommand _DiamondCasinoHeistPrimaryTarget{"diamondcasinoheistprimarytarget", "Primary Target", "Primary target", diamondCasinoHeistPrimaryTarget, 3}; static ListCommand _DiamondCasinoHeistPrimaryTarget{"diamondcasinoheistprimarytarget", "Primary Target", "Primary target", diamondCasinoHeistPrimaryTarget, 3};
static ListCommand* _DiamondCasinoHeistGunmanPtr = nullptr; static ListCommand* _DiamondCasinoHeistGunmanPtr = nullptr;
static ListCommand* _DiamondCasinoHeistApproachPtr = nullptr; static ListCommand* _DiamondCasinoHeistApproachPtr = nullptr;
static std::vector<std::vector<std::vector<std::pair<int, const char*>>>> 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<std::vector<std::vector<std::pair<int, const char*>>>> 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 ListCommand _DiamondCasinoHeistWeapon{"diamondcasinoheistweapon", "Weapon", "Weapon", diamondCasinoHeistWeapon[5][0], 0};
static std::vector<std::pair<int, const char*>> diamondCasinoHeistGunman = {{0, "Chester McCoy"}, {1, "Gustavo Mota"}, {2, "Patrick McReary"}, {3, "Charlie Reed"}, {4, "Karl Abolaji"}, {5, "Remove Gunman"}}; static std::vector<std::pair<int, const char*>> diamondCasinoHeistGunman = {
{0, "Chester McCoy"},
{1, "Gustavo Mota"},
{2, "Patrick McReary"},
{3, "Charlie Reed"},
{4, "Karl Abolaji"},
{5, "Remove Gunman"}
};
class Gunman : public ListCommand class Gunman : public ListCommand
{ {
@@ -67,14 +112,17 @@ namespace YimMenu::Features
virtual void OnChange() override virtual void OnChange() override
{ {
_DiamondCasinoHeistWeapon.SetList( _DiamondCasinoHeistWeapon.SetList(diamondCasinoHeistWeapon[this->GetState()][_DiamondCasinoHeistApproachPtr->GetState()]);
diamondCasinoHeistWeapon[this->GetState()][_DiamondCasinoHeistApproachPtr->GetState()]);
_DiamondCasinoHeistWeapon.SetState(0); _DiamondCasinoHeistWeapon.SetState(0);
} }
}; };
static Gunman _DiamondCasinoHeistGunman{"diamondcasinoheistgunman", "Gunman", "Gunman", diamondCasinoHeistGunman, 5}; static Gunman _DiamondCasinoHeistGunman{"diamondcasinoheistgunman", "Gunman", "Gunman", diamondCasinoHeistGunman, 5};
static std::vector<std::pair<int, const char*>> diamondCasinoHeistApproach = {{0, "Silent & Sneaky"}, {1, "The Big Con"}, {2, "Aggressive"}}; static std::vector<std::pair<int, const char*>> diamondCasinoHeistApproach = {
{0, "Silent & Sneaky"},
{1, "The Big Con"},
{2, "Aggressive"}
};
class Approach : public ListCommand class Approach : public ListCommand
{ {
@@ -82,8 +130,7 @@ namespace YimMenu::Features
virtual void OnChange() override virtual void OnChange() override
{ {
_DiamondCasinoHeistWeapon.SetList( _DiamondCasinoHeistWeapon.SetList(diamondCasinoHeistWeapon[_DiamondCasinoHeistGunmanPtr->GetState()][this->GetState()]);
diamondCasinoHeistWeapon[_DiamondCasinoHeistGunmanPtr->GetState()][this->GetState()]);
_DiamondCasinoHeistWeapon.SetState(0); _DiamondCasinoHeistWeapon.SetState(0);
} }
}; };
@@ -98,10 +145,24 @@ namespace YimMenu::Features
} }
} _initPtrs; } _initPtrs;
static std::vector<std::vector<std::pair<int, const char*>>> 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<std::vector<std::pair<int, const char*>>> 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 ListCommand _DiamondCasinoHeistVehicle{"diamondcasinoheistvehicle", "Vehicle", "Vehicle", diamondCasinoHeistVehicle[5], 0};
static std::vector<std::pair<int, const char*>> diamondCasinoHeistDriver = {{0, "Chester McCoy"}, {1, "Eddie Toh"}, {2, "Taliana Martinez"}, {3, "Zach Nelson"}, {4, "Karim Denz"}, {5, "Remove Driver"}}; static std::vector<std::pair<int, const char*>> diamondCasinoHeistDriver = {
{0, "Chester McCoy"},
{1, "Eddie Toh"},
{2, "Taliana Martinez"},
{3, "Zach Nelson"},
{4, "Karim Denz"},
{5, "Remove Driver"}
};
class Driver : public ListCommand class Driver : public ListCommand
{ {
@@ -115,7 +176,14 @@ namespace YimMenu::Features
}; };
static Driver _DiamondCasinoHeistDriver{"diamondcasinoheistdriver", "Driver", "Driver", diamondCasinoHeistDriver, 5}; static Driver _DiamondCasinoHeistDriver{"diamondcasinoheistdriver", "Driver", "Driver", diamondCasinoHeistDriver, 5};
static std::vector<std::pair<int, const char*>> diamondCasinoHeistHacker = {{4, "Avi Schwartzman"}, {5, "Paige Harris"}, {2, "Christian Feltz"}, {3, "Yohan Blair"}, {1, "Rickie Lukens"}, {6, "Remove Hacker"}}; static std::vector<std::pair<int, const char*>> 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}; static ListCommand _DiamondCasinoHeistHacker{"diamondcasinoheisthacker", "Hacker", "Hacker", diamondCasinoHeistHacker, 6};
class Setup : public Command class Setup : public Command
@@ -233,7 +301,8 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller"_J, 20391).At(2686).As<int*>() = _DiamondCasinoHeistActualTake.GetState(); if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
*ScriptLocal(thread, 20391).At(2686).As<int*>() = _DiamondCasinoHeistActualTake.GetState();
} }
}; };
@@ -243,8 +312,11 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller"_J, 54037).As<int*>() = 5; if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
*ScriptLocal("fm_mission_controller"_J, 55103).As<int*>() = 5; {
*ScriptLocal(thread, 54037).As<int*>() = 5;
*ScriptLocal(thread, 55103).As<int*>() = 5;
}
} }
}; };
@@ -254,8 +326,8 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller"_J, 10549).At(7).As<int*>() = if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
*ScriptLocal("fm_mission_controller"_J, 10549).At(37).As<int*>(); *ScriptLocal(thread, 10549).At(7).As<int*>() = *ScriptLocal(thread, 10549).At(37).As<int*>();
} }
}; };
@@ -265,15 +337,18 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
ScriptMgr::Yield(500ms); {
Scripts::ForceScriptHost(thread);
ScriptMgr::Yield(500ms);
*ScriptLocal("fm_mission_controller"_J, 20391).At(1740).At(1).As<int*>() = 80; *ScriptLocal(thread, 20391).At(1740).At(0, 1).As<int*>() = 80;
*ScriptLocal("fm_mission_controller"_J, 20391).At(2686).As<int*>() = 4443220; *ScriptLocal(thread, 20391).At(2686).As<int*>() = 4443220;
*ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As<int*>() = 5; *ScriptLocal(thread, 20391).At(1062).As<int*>() = 5;
*ScriptLocal("fm_mission_controller"_J, 20391).As<int*>() = 12; *ScriptLocal(thread, 20391).As<int*>() = 12;
*ScriptLocal("fm_mission_controller"_J, 29011).At(1).As<int*>() = 99999; *ScriptLocal(thread, 29011).At(0, 1).As<int*>() = 99999;
*ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As<int*>() = 99999; *ScriptLocal(thread, 32467).At(0, 294).At(68).As<int*>() = 99999;
}
} }
}; };
@@ -23,10 +23,10 @@ namespace YimMenu::Features
{ {
auto base = ScriptGlobal(1964170).At(812).At(50); auto base = ScriptGlobal(1964170).At(812).At(50);
*base.At(1).As<int*>() = _DoomsdayHeistCut1.GetState(); *base.At(0, 1).As<int*>() = _DoomsdayHeistCut1.GetState();
*base.At(2).As<int*>() = _DoomsdayHeistCut2.GetState(); *base.At(1, 1).As<int*>() = _DoomsdayHeistCut2.GetState();
*base.At(3).As<int*>() = _DoomsdayHeistCut3.GetState(); *base.At(2, 1).As<int*>() = _DoomsdayHeistCut3.GetState();
*base.At(4).As<int*>() = _DoomsdayHeistCut4.GetState(); *base.At(3, 1).As<int*>() = _DoomsdayHeistCut4.GetState();
} }
}; };
@@ -38,14 +38,18 @@ namespace YimMenu::Features
{ {
auto base = ScriptGlobal(1882449); auto base = ScriptGlobal(1882449);
*base.At(0, 201).At(43).At(0).At(4).At(8).As<int*>() = 1; for (int i = 0; i <= 3; i++)
*base.At(1, 201).At(43).At(1).At(4).At(8).As<int*>() = 1; {
*base.At(2, 201).At(43).At(2).At(4).At(8).As<int*>() = 1; *base.At(i, 201).At(43).At(11).At(i, 1).As<int*>() = 1;
*base.At(3, 201).At(43).At(3).At(4).At(8).As<int*>() = 1; }
} }
}; };
static std::vector<std::pair<int, const char*>> doomsdayHeistCategory = {{0, "The Data Breaches"}, {1, "The Bogdan Problem"}, {2, "The Doomsday Senario"}}; static std::vector<std::pair<int, const char*>> doomsdayHeistCategory = {
{0, "The Data Breaches"},
{1, "The Bogdan Problem"},
{2, "The Doomsday Senario"}
};
static ListCommand _DoomsdayHeistCategory{"doomsdayheistcategory", "Select Heist", "Heist categories", doomsdayHeistCategory, 0}; static ListCommand _DoomsdayHeistCategory{"doomsdayheistcategory", "Select Heist", "Heist categories", doomsdayHeistCategory, 0};
class Setup : public Command class Setup : public Command
@@ -76,7 +80,8 @@ namespace YimMenu::Features
ScriptMgr::Yield(500ms); ScriptMgr::Yield(500ms);
*ScriptLocal("gb_gang_ops_planning"_J, 207).As<int*>() = 6; // Reload planning screen if (auto thread = Scripts::FindScriptThread("gb_gang_ops_planning"_J))
*ScriptLocal(thread, 209).As<int*>() = 6;
} }
}; };
@@ -86,9 +91,12 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
*ScriptLocal("fm_mission_controller"_J, 1540).As<int*>() = 3; if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
*ScriptLocal("fm_mission_controller"_J, 1571).As<int*>() = 2; {
*ScriptLocal("fm_mission_controller"_J, 1296).At(135).As<int*>() = 3; *ScriptLocal(thread, 1570).As<int*>() = 2;
*ScriptLocal(thread, 1539).As<int*>() = 3;
*ScriptLocal(thread, 1296).At(135).As<int*>() = 3;
}
} }
}; };
@@ -98,14 +106,16 @@ namespace YimMenu::Features
virtual void OnCall() override virtual void OnCall() override
{ {
Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
ScriptMgr::Yield(500ms); {
Scripts::ForceScriptHost(thread);
*ScriptLocal("fm_mission_controller"_J, 20391).At(1725).At(1).As<int*>() = 80; ScriptMgr::Yield(500ms);
*ScriptLocal("fm_mission_controller"_J, 20391).As<int*>() = 12;
*ScriptLocal("fm_mission_controller"_J, 29011).At(1).As<int*>() = 99999;
*ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As<int*>() = 99999;
*ScriptLocal(thread, 20391).At(1725).At(0, 1).As<int*>() = 80;
*ScriptLocal(thread, 20391).As<int*>() = 12;
*ScriptLocal(thread, 29011).At(0, 1).As<int*>() = 99999;
*ScriptLocal(thread, 32467).At(0, 294).At(68).As<int*>() = 99999;
}
// TODO: find a way of getting current heist info so that InstantFinishAct3 can be implemented here conditionally. // 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 virtual void OnCall() override
{ {
Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J)); if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
ScriptMgr::Yield(500ms); {
Scripts::ForceScriptHost(thread);
ScriptMgr::Yield(500ms);
*ScriptLocal("fm_mission_controller"_J, 20391).As<int*>() = 12; *ScriptLocal(thread, 20391).As<int*>() = 12;
*ScriptLocal("fm_mission_controller"_J, 20391).At(1740).At(1).As<int*>() = 150; *ScriptLocal(thread, 20391).At(1740).At(0, 1).As<int*>() = 150;
*ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As<int*>() = 5; *ScriptLocal(thread, 20391).At(1062).As<int*>() = 5;
*ScriptLocal("fm_mission_controller"_J, 29011).At(1).As<int*>() = 99999; *ScriptLocal(thread, 29011).At(0, 1).As<int*>() = 99999;
*ScriptLocal("fm_mission_controller"_J, 32467).At(1).At(68).As<int*>() = 99999; *ScriptLocal(thread, 32467).At(0, 294).At(68).As<int*>() = 99999;
}
} }
}; };
@@ -21,7 +21,7 @@ namespace YimMenu::Features
if (!m_ShouldRunScript) if (!m_ShouldRunScript)
continue; 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) if (m_StartedByUs && m_Thread)
{ {
@@ -35,27 +35,35 @@ namespace YimMenu::Features
if (!m_Thread) if (!m_Thread)
{ {
int id = Scripts::StartScript("AM_MP_VEHICLE_REWARD"_J, eStackSizes::FRIEND); if (Scripts::IsScriptActive("AM_MP_VEHICLE_REWARD"_J)) // This script already runs in freemode, so check if it is active first
m_Thread = Scripts::FindScriptThreadByID(id);
if (m_Thread)
{ {
m_Thread->m_Context.m_State = rage::scrThread::State::PAUSED; m_Thread = Scripts::FindScriptThread("AM_MP_VEHICLE_REWARD"_J);
m_StartedByUs = true;
} }
else else // if not (e.g., we are in a mission), start and pause it
{ {
m_ShouldRunScript = false; int id = Scripts::StartScript("AM_MP_VEHICLE_REWARD"_J, eStackSizes::FRIEND);
continue; 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)) if (auto VehicleRewardData = VEHICLE_REWARD_DATA::Get(m_Thread))
{ {
auto VehicleMenuData = ScriptLocal(m_Thread, 176).As<int*>(); // TO-DO: add struct for this? auto VehicleMenuData = ScriptLocal(m_Thread, 176).As<int*>(); // TO-DO: add struct for this?
static ScriptFunction giveVehicleReward("AM_MP_VEHICLE_REWARD"_J, ScriptPointer("GiveVehicleReward", "2D 0C 1E 00 00")); static ScriptFunction giveVehicleReward("AM_MP_VEHICLE_REWARD"_J, ScriptPointer("GiveVehicleReward", "2D 0C 1E 00 00"));
if (giveVehicleReward.Call<bool>(Self::GetVehicle().GetHandle(), VehicleMenuData, &VehicleRewardData->TransactionStatus, &VehicleRewardData->Garage, &VehicleRewardData->GarageOffset, &VehicleRewardData->ControlStatus, false, true, true, false, 0, -1)) if (giveVehicleReward.Call<bool>(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->TransactionStatus = 0;
VehicleRewardData->Garage = 0; VehicleRewardData->Garage = 0;
@@ -75,7 +83,7 @@ namespace YimMenu::Features
} }
// Some vehicles cannot be safely acquired using this method, see #443 // Some vehicles cannot be safely acquired using this method, see #443
static const std::unordered_set<std::uint32_t> 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<std::uint32_t> s_BlacklistedVehicles = {"rcbandito"_J, "minitank"_J, "thruster"_J, "terbyte"_J, "avenger"_J, "policet3"_J, "brickade2"_J};
class _SavePersonalVehicle : public Command class _SavePersonalVehicle : public Command
{ {