mirror of
https://github.com/YimMenu/YimMenuV2.git
synced 2026-10-10 03:43:15 +08:00
Merge branch 'enhanced' of https://github.com/YimMenu/YimMenuV2 into enhanced
This commit is contained in:
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user