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 base2 = ScriptGlobal(1933768).At(3008);
*base1.At(1).As<int*>() = 100
- (_ApartmentHeistCut1.GetState() + _ApartmentHeistCut2.GetState() + _ApartmentHeistCut3.GetState()
+ _ApartmentHeistCut4.GetState());
*base1.At(2).As<int*>() = _ApartmentHeistCut2.GetState();
*base1.At(3).As<int*>() = _ApartmentHeistCut3.GetState();
*base1.At(4).As<int*>() = _ApartmentHeistCut4.GetState();
*base1.At(0, 1).As<int*>() = 100 - (_ApartmentHeistCut1.GetState() + _ApartmentHeistCut2.GetState() + _ApartmentHeistCut3.GetState() + _ApartmentHeistCut4.GetState());
*base1.At(1, 1).As<int*>() = _ApartmentHeistCut2.GetState();
*base1.At(2, 1).As<int*>() = _ApartmentHeistCut3.GetState();
*base1.At(3, 1).As<int*>() = _ApartmentHeistCut4.GetState();
ScriptMgr::Yield(500ms);
*base2.At(1).As<int*>() =
-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*>();
*base2.At(3).As<int*>() = *base1.At(3).As<int*>();
*base2.At(4).As<int*>() = *base1.At(4).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);
for (int i = 1; i <= 3; i++)
{
*base2.At(i, 1).As<int*>() = *base1.At(i, 1).As<int*>();
}
}
};
@@ -74,9 +73,11 @@ namespace YimMenu::Features
virtual void OnCall() override
{
*ScriptLocal("fm_mission_controller"_J, 12220).At(24).As<int*>() = 7;
*ScriptLocal("fm_mission_controller"_J, 10215).As<int*>() =
*ScriptLocal("fm_mission_controller"_J, 10215).As<int*>() | (1 << 9);
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
{
*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
{
*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
{
Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J));
ScriptMgr::Yield(500ms);
*ScriptLocal("fm_mission_controller"_J, 20391).At(1725).At(1).As<int*>() = 80;
*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;
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
{
Scripts::ForceScriptHost(thread);
ScriptMgr::Yield(500ms);
*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.
}
};
@@ -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<int*>() = 1875000;
*ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As<int*>() = 5;
*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(2686).As<int*>() = 1875000;
*ScriptLocal(thread, 20391).At(1062).As<int*>() = 5;
*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;
}
}
};
@@ -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<int*>() = _CayoPericoHeistCut1.GetState();
*base.At(2).As<int*>() = _CayoPericoHeistCut2.GetState();
*base.At(3).As<int*>() = _CayoPericoHeistCut3.GetState();
*base.At(4).As<int*>() = _CayoPericoHeistCut4.GetState();
*base.At(0, 1).As<int*>() = _CayoPericoHeistCut1.GetState();
*base.At(1, 1).As<int*>() = _CayoPericoHeistCut2.GetState();
*base.At(2, 1).As<int*>() = _CayoPericoHeistCut3.GetState();
*base.At(3, 1).As<int*>() = _CayoPericoHeistCut4.GetState();
}
};
@@ -41,20 +42,36 @@ namespace YimMenu::Features
{
auto base = ScriptGlobal(1976911);
*base.At(0, 27).At(8).At(0).As<int*>() = 1;
*base.At(1, 27).At(8).At(1).As<int*>() = 1;
*base.At(2, 27).At(8).At(2).As<int*>() = 1;
*base.At(3, 27).At(8).At(3).As<int*>() = 1;
for (int i = 0; i <= 3; i++)
{
*base.At(i, 27).At(7).At(i, 1).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 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 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};
class Setup : public Command
@@ -105,7 +122,8 @@ namespace YimMenu::Features
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
{
*ScriptLocal("fm_mission_controller_2020"_J, 58222).At(1357).At(53).As<int*>() =
_CayoPericoHeistSecondaryTakeValue.GetState();
if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
*ScriptLocal(thread, 58222).At(1357).At(53).As<int*>() = _CayoPericoHeistSecondaryTakeValue.GetState();
}
};
@@ -187,7 +205,8 @@ namespace YimMenu::Features
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
{
*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
{
*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
{
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<int*>() = 5;
*ScriptLocal("fm_mission_controller_2020"_J, 31525).As<int*>() = 3;
break;
case 2:
case 4: *ScriptLocal("fm_mission_controller_2020"_J, 31499).As<int*>() = 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<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
{
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<int*>() = 9;
*ScriptLocal("fm_mission_controller_2020"_J, 54763).At(1776).At(1).As<int*>() = 50;
*ScriptLocal(thread, 54763).As<int*>() = 9;
*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);
*base.At(1).As<int*>() = _DiamondCasinoHeistCut1.GetState();
*base.At(2).As<int*>() = _DiamondCasinoHeistCut2.GetState();
*base.At(3).As<int*>() = _DiamondCasinoHeistCut3.GetState();
*base.At(4).As<int*>() = _DiamondCasinoHeistCut4.GetState();
*base.At(0, 1).As<int*>() = _DiamondCasinoHeistCut1.GetState();
*base.At(1, 1).As<int*>() = _DiamondCasinoHeistCut2.GetState();
*base.At(2, 1).As<int*>() = _DiamondCasinoHeistCut3.GetState();
*base.At(3, 1).As<int*>() = _DiamondCasinoHeistCut4.GetState();
}
};
@@ -40,26 +40,71 @@ namespace YimMenu::Features
{
auto base = ScriptGlobal(1973359);
*base.At(0, 68).At(8).At(0).As<int*>() = 1;
*base.At(1, 68).At(8).At(1).As<int*>() = 1;
*base.At(2, 68).At(8).At(2).As<int*>() = 1;
*base.At(3, 68).At(8).At(3).As<int*>() = 1;
for (int i = 0; i <= 3; i++)
{
*base.At(i, 68).At(7).At(i, 1).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 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* _DiamondCasinoHeistGunmanPtr = 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 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
{
@@ -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<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
{
@@ -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<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 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
{
@@ -115,7 +176,14 @@ namespace YimMenu::Features
};
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};
class Setup : public Command
@@ -233,7 +301,8 @@ namespace YimMenu::Features
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
{
*ScriptLocal("fm_mission_controller"_J, 54037).As<int*>() = 5;
*ScriptLocal("fm_mission_controller"_J, 55103).As<int*>() = 5;
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
{
*ScriptLocal(thread, 54037).As<int*>() = 5;
*ScriptLocal(thread, 55103).As<int*>() = 5;
}
}
};
@@ -254,8 +326,8 @@ namespace YimMenu::Features
virtual void OnCall() override
{
*ScriptLocal("fm_mission_controller"_J, 10549).At(7).As<int*>() =
*ScriptLocal("fm_mission_controller"_J, 10549).At(37).As<int*>();
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
*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
{
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<int*>() = 80;
*ScriptLocal("fm_mission_controller"_J, 20391).At(2686).As<int*>() = 4443220;
*ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As<int*>() = 5;
*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(1740).At(0, 1).As<int*>() = 80;
*ScriptLocal(thread, 20391).At(2686).As<int*>() = 4443220;
*ScriptLocal(thread, 20391).At(1062).As<int*>() = 5;
*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;
}
}
};
@@ -23,10 +23,10 @@ namespace YimMenu::Features
{
auto base = ScriptGlobal(1964170).At(812).At(50);
*base.At(1).As<int*>() = _DoomsdayHeistCut1.GetState();
*base.At(2).As<int*>() = _DoomsdayHeistCut2.GetState();
*base.At(3).As<int*>() = _DoomsdayHeistCut3.GetState();
*base.At(4).As<int*>() = _DoomsdayHeistCut4.GetState();
*base.At(0, 1).As<int*>() = _DoomsdayHeistCut1.GetState();
*base.At(1, 1).As<int*>() = _DoomsdayHeistCut2.GetState();
*base.At(2, 1).As<int*>() = _DoomsdayHeistCut3.GetState();
*base.At(3, 1).As<int*>() = _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<int*>() = 1;
*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(3, 201).At(43).At(3).At(4).At(8).As<int*>() = 1;
for (int i = 0; i <= 3; i++)
{
*base.At(i, 201).At(43).At(11).At(i, 1).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};
class Setup : public Command
@@ -76,7 +80,8 @@ namespace YimMenu::Features
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
{
*ScriptLocal("fm_mission_controller"_J, 1540).As<int*>() = 3;
*ScriptLocal("fm_mission_controller"_J, 1571).As<int*>() = 2;
*ScriptLocal("fm_mission_controller"_J, 1296).At(135).As<int*>() = 3;
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
{
*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
{
Scripts::ForceScriptHost(Scripts::FindScriptThread("fm_mission_controller"_J));
ScriptMgr::Yield(500ms);
*ScriptLocal("fm_mission_controller"_J, 20391).At(1725).At(1).As<int*>() = 80;
*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;
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
{
Scripts::ForceScriptHost(thread);
ScriptMgr::Yield(500ms);
*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.
}
};
@@ -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<int*>() = 12;
*ScriptLocal("fm_mission_controller"_J, 20391).At(1740).At(1).As<int*>() = 150;
*ScriptLocal("fm_mission_controller"_J, 20391).At(1062).As<int*>() = 5;
*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).As<int*>() = 12;
*ScriptLocal(thread, 20391).At(1740).At(0, 1).As<int*>() = 150;
*ScriptLocal(thread, 20391).At(1062).As<int*>() = 5;
*ScriptLocal(thread, 29011).At(0, 1).As<int*>() = 99999;
*ScriptLocal(thread, 32467).At(0, 294).At(68).As<int*>() = 99999;
}
}
};
@@ -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<int*>(); // TO-DO: add struct for this?
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 (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<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
{