mirror of
https://github.com/YimMenu/YimMenuV2.git
synced 2026-10-10 03:43:15 +08:00
@@ -4,7 +4,7 @@ Experimental menu for GTA 5: Enhanced
|
||||
|
||||
## How to use
|
||||
|
||||
1. Download the latest version of FSL from [here](https://www.unknowncheats.me/forum/grand-theft-auto-v/616977-fsl-local-gtao-saves.html) and place version.dll in your GTA V directory. Using FSL is now optional but highly recommended for account safety
|
||||
1. Download the latest version of FSL from [here](https://www.unknowncheats.me/forum/grand-theft-auto-v/616977-fsl-local-gtao-saves.html) and place WINMM.dll in your GTA V directory
|
||||
2. Download YimMenuV2 from [GitHub Releases](https://github.com/YimMenu/YimMenuV2/releases/tag/nightly)
|
||||
3. Download an injector, such as [Xenos](https://www.unknowncheats.me/forum/general-programming-and-reversing/124013-xenos-injector-v2-3-2-a.html)
|
||||
4. Open Rockstar Launcher, select Grand Theft Auto V Enhanced, go to settings, and disable BattlEye. If you are using Steam or Epic Games, you may have to pass the -nobattleye command line parameter as well
|
||||
|
||||
@@ -93,12 +93,18 @@ namespace YimMenu
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LOGF(FATAL, "YimMenu requires FSL to be loaded. Please get it from UnknownCheats.me");
|
||||
}
|
||||
|
||||
if (m_BattlEyeRunning)
|
||||
LOGF(WARNING, "If you are not running an actual BattlEye bypass, exit the game immediately and ensure that BE is properly disabled");
|
||||
|
||||
#if 0
|
||||
if (!m_FSLProvidesBEBypass && !m_BattlEyeRunning)
|
||||
Pointers.BattlEyeStatusUpdatePatch->Apply();
|
||||
#endif
|
||||
|
||||
while (true)
|
||||
{
|
||||
|
||||
@@ -305,7 +305,7 @@ namespace YimMenu
|
||||
auto garageOffset = GetPropertyGarageOffset(propertyIterator);
|
||||
for (int garageSlotIterator = 1; garageSlotIterator <= garageSize; garageSlotIterator++)
|
||||
{
|
||||
auto itemInSlot = *ScriptGlobal(1944744).At(garageOffset).At(garageSlotIterator).As<int*>() - 1;
|
||||
auto itemInSlot = *ScriptGlobal(1945138).At(garageOffset).At(garageSlotIterator).As<int*>() - 1;
|
||||
if (itemInSlot == m_Id)
|
||||
{
|
||||
auto staticPropertyString = GetStaticPropertyName(propertyIterator, garageSlotIterator);
|
||||
@@ -380,7 +380,7 @@ namespace YimMenu
|
||||
|
||||
ScriptMgr::Yield(100ms);
|
||||
|
||||
*ScriptLocal("freemode"_J, 19633).At(176).As<int*>() = 0;
|
||||
*ScriptLocal("freemode"_J, 19672).At(176).As<int*>() = 0;
|
||||
|
||||
if (bring)
|
||||
{
|
||||
|
||||
@@ -10,10 +10,10 @@ namespace YimMenu::Features
|
||||
|
||||
virtual void OnTick() override
|
||||
{
|
||||
constexpr auto is_incoming_call = ScriptGlobal(23010);
|
||||
constexpr auto is_phone_call_in_progress = ScriptGlobal(23006);
|
||||
constexpr auto phone_call_state = ScriptGlobal(23000);
|
||||
constexpr auto calling_character = ScriptGlobal(8779);
|
||||
constexpr auto is_incoming_call = ScriptGlobal(23050);
|
||||
constexpr auto is_phone_call_in_progress = ScriptGlobal(23046);
|
||||
constexpr auto phone_call_state = ScriptGlobal(23040);
|
||||
constexpr auto calling_character = ScriptGlobal(8818);
|
||||
|
||||
if (*Pointers.IsSessionStarted)
|
||||
{
|
||||
|
||||
@@ -43,21 +43,21 @@ namespace YimMenu::Features
|
||||
NativeHooks::AddHook(NativeHooks::ALL_SCRIPTS, NativeIndex::GET_EVER_HAD_BAD_PACK_ORDER, &PackOrderHook);
|
||||
|
||||
constexpr std::array<std::uint32_t, 16> validHashes = {
|
||||
1222354255, // 0
|
||||
1017, // 1
|
||||
2008403316, // 2
|
||||
3086857943, // 0
|
||||
1029, // 1
|
||||
578942327, // 2
|
||||
472, // 3
|
||||
0, // 4
|
||||
0, // 5
|
||||
2683527064, // 6
|
||||
3471586599, // 6
|
||||
0, // 7
|
||||
0, // 8
|
||||
1731098795, // 9
|
||||
234493012, // 10
|
||||
19919, // 11
|
||||
4002619495, // 12
|
||||
19987, // 11
|
||||
1949347533, // 12
|
||||
307143837, // 13
|
||||
2653292054, // 14
|
||||
2738033789, // 14
|
||||
200299391, // 15
|
||||
};
|
||||
if (auto hashes = Pointers.GameDataHash)
|
||||
@@ -93,7 +93,7 @@ namespace YimMenu::Hooks
|
||||
uint32_t Network::GetDLCHash(void* manager, uint32_t seed)
|
||||
{
|
||||
if (YimMenu::Features::_SpoofDataHash.GetState())
|
||||
return 2784221708;
|
||||
return 1631480001;
|
||||
|
||||
return BaseHook::Get<Network::GetDLCHash, DetourHook<decltype(&Network::GetDLCHash)>>()->Original()(manager, seed);
|
||||
}
|
||||
|
||||
@@ -16,9 +16,9 @@ namespace YimMenu::Features
|
||||
{
|
||||
using LoopedCommand::LoopedCommand;
|
||||
|
||||
int slots_random_results_table = 1350;
|
||||
int slots_random_results_table = 1357; // Static_1381.f_1[][]
|
||||
std::set<int> slots_blacklist = {9, 21, 22, 87, 152};
|
||||
int spin_state_var = 1668;
|
||||
int spin_state_var = 1675;
|
||||
std::set<int> spin_state_whitelist = {8, 14};
|
||||
|
||||
virtual void OnTick() override
|
||||
|
||||
@@ -43,43 +43,43 @@ namespace YimMenu::Features
|
||||
case eAppVinewoodMenuSafe::NIGHTCLUB:
|
||||
{
|
||||
if (GPBD_FM::Get()->Entries[Self::GetPlayer().GetId()].PropertyData.NightclubData.SafeCashValue > 0)
|
||||
*ScriptGlobal(2708832).As<BOOL*>() = TRUE;
|
||||
*ScriptGlobal(2708943).As<BOOL*>() = TRUE;
|
||||
break;
|
||||
}
|
||||
case eAppVinewoodMenuSafe::ARCADE:
|
||||
{
|
||||
if (GPBD_FM::Get()->Entries[Self::GetPlayer().GetId()].PropertyData.ArcadeData.SafeCashValue > 0)
|
||||
*ScriptGlobal(2708841).As<BOOL*>() = TRUE;
|
||||
*ScriptGlobal(2708952).As<BOOL*>() = TRUE;
|
||||
break;
|
||||
}
|
||||
case eAppVinewoodMenuSafe::AGENCY:
|
||||
{
|
||||
if (GPBD_FM::Get()->Entries[Self::GetPlayer().GetId()].PropertyData.FixerHQData.SafeCashValue > 0)
|
||||
*ScriptGlobal(2708850).As<BOOL*>() = TRUE;
|
||||
*ScriptGlobal(2708961).As<BOOL*>() = TRUE;
|
||||
break;
|
||||
}
|
||||
case eAppVinewoodMenuSafe::SALVAGE_YARD:
|
||||
{
|
||||
if (GPBD_FM::Get()->Entries[Self::GetPlayer().GetId()].PropertyData.SalvageYardData.TotalEarnings > 0)
|
||||
*ScriptGlobal(2708859).As<BOOL*>() = TRUE;
|
||||
*ScriptGlobal(2708970).As<BOOL*>() = TRUE;
|
||||
break;
|
||||
}
|
||||
case eAppVinewoodMenuSafe::BAIL_OFFICE:
|
||||
{
|
||||
if (GPBD_FM::Get()->Entries[Self::GetPlayer().GetId()].PropertyData.BailShopData.SafeCashValue > 0)
|
||||
*ScriptGlobal(2708868).As<BOOL*>() = TRUE;
|
||||
*ScriptGlobal(2708979).As<BOOL*>() = TRUE;
|
||||
break;
|
||||
}
|
||||
case eAppVinewoodMenuSafe::GARMENT_FACTORY:
|
||||
{
|
||||
if (GPBD_FM::Get()->Entries[Self::GetPlayer().GetId()].PropertyData.HackerDenData.SafeCashValue > 0)
|
||||
*ScriptGlobal(2708883).As<BOOL*>() = TRUE;
|
||||
*ScriptGlobal(2708994).As<BOOL*>() = TRUE;
|
||||
break;
|
||||
}
|
||||
case eAppVinewoodMenuSafe::HANDS_ON_CAR_WASH:
|
||||
{
|
||||
if (GPBD_FM_2::Get()->Entries[Self::GetPlayer().GetId()].SYVehSaleData.HOWCData.SafeCashValue > 0)
|
||||
*ScriptGlobal(2708890).As<BOOL*>() = TRUE;
|
||||
*ScriptGlobal(2709001).As<BOOL*>() = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,13 +166,13 @@ namespace YimMenu::Features
|
||||
|
||||
static joaat_t GetNextExoticExportsVehicleHash()
|
||||
{
|
||||
constexpr ScriptGlobal order(1950369);
|
||||
constexpr ScriptGlobal order(1950873);
|
||||
for (int i = 1; i <= 10; i++)
|
||||
{
|
||||
auto offset = *order.At(i).As<int*>();
|
||||
if (!GPBD_Flow::Get()->Entries[Self::GetPlayer().GetId()].TunerCBVDeliveredFlags.IsSet(offset))
|
||||
{
|
||||
auto hash = *ScriptGlobal(1950358 + (offset + 1)).As<joaat_t*>();
|
||||
auto hash = *ScriptGlobal(1950862 + (offset + 1)).As<joaat_t*>();
|
||||
return hash;
|
||||
}
|
||||
}
|
||||
@@ -205,7 +205,7 @@ namespace YimMenu::Features
|
||||
}
|
||||
}
|
||||
|
||||
auto streetDealerData = ScriptLocal(m_Thread, 258).At(12);
|
||||
auto streetDealerData = ScriptLocal(m_Thread, 265).At(12);
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
@@ -528,13 +528,13 @@ namespace YimMenu::Features
|
||||
bool partime = Stats::GetPackedInt(34838 + (index * 4)) == location;
|
||||
bool landing = Stats::GetPackedInt(34839 + (index * 4)) == location;
|
||||
|
||||
*ScriptGlobal(1979961).As<int*>() = 1;
|
||||
*ScriptGlobal(1979961).At(1).As<int*>() = 1;
|
||||
*ScriptGlobal(1979961).At(3).As<int*>() = 5;
|
||||
*ScriptGlobal(1979961).At(4).As<int*>() = location + 1;
|
||||
*ScriptGlobal(1979961).At(8).At(1).As<int*>() = checkpointReward.Get<int>() / (1 + (checkpoints * 9));
|
||||
*ScriptGlobal(1979961).At(8).At(2).As<int*>() = parTimeReward.Get<int>() / (1 + (partime * 9));
|
||||
*ScriptGlobal(1979961).At(8).At(3).As<int*>() = landingReward.Get<int>() / (1 + (landing * 9));
|
||||
*ScriptGlobal(1980496).As<int*>() = 1;
|
||||
*ScriptGlobal(1980496).At(1).As<int*>() = 1;
|
||||
*ScriptGlobal(1980496).At(3).As<int*>() = 5;
|
||||
*ScriptGlobal(1980496).At(4).As<int*>() = location + 1;
|
||||
*ScriptGlobal(1980496).At(8).At(1).As<int*>() = checkpointReward.Get<int>() / (1 + (checkpoints * 9));
|
||||
*ScriptGlobal(1980496).At(8).At(2).As<int*>() = parTimeReward.Get<int>() / (1 + (partime * 9));
|
||||
*ScriptGlobal(1980496).At(8).At(3).As<int*>() = landingReward.Get<int>() / (1 + (landing * 9));
|
||||
|
||||
SET_SKYDIVE_COMPLETED data;
|
||||
data.SkydiveIndex = index;
|
||||
@@ -544,7 +544,7 @@ namespace YimMenu::Features
|
||||
data.AccurateLanding = TRUE;
|
||||
data.Send();
|
||||
|
||||
ScriptGlobal(1983930).At(4).As<SCR_BITSET<uint64_t>*>()->Clear(3);
|
||||
ScriptGlobal(1984467).At(4).As<SCR_BITSET<uint64_t>*>()->Clear(3);
|
||||
}
|
||||
};
|
||||
|
||||
@@ -656,8 +656,8 @@ namespace YimMenu::Features
|
||||
{
|
||||
thread->m_Context.m_State = rage::scrThread::State::PAUSED;
|
||||
|
||||
*ScriptLocal(thread, 3103).At(131).At(1).As<int*>() = FreemodeGeneral::Get()->DailyReset.Seed % 14; // if we don't init this, the par time duration function will return 0 and the COMPLETED stat will be set to 0, which is bad
|
||||
*ScriptLocal(thread, 146).At(4).As<int*>() = 0;
|
||||
*ScriptLocal(thread, 3135).At(131).At(1).As<int*>() = FreemodeGeneral::Get()->DailyReset.Seed % 14; // if we don't init this, the par time duration function will return 0 and the COMPLETED stat will be set to 0, which is bad
|
||||
*ScriptLocal(thread, 153).At(4).As<int*>() = 0;
|
||||
static ScriptFunction onBTTEnd("fm_content_bicycle_time_trial"_J,
|
||||
ScriptPointer("OnBTTEnd", "64 ? ? ? 5D ? ? ? 75 77").Add(1).Rip());
|
||||
onBTTEnd.Call<void>();
|
||||
@@ -712,7 +712,7 @@ namespace YimMenu::Features
|
||||
}*/
|
||||
|
||||
auto hash = GetNextExoticExportsVehicleHash();
|
||||
static ScriptFunction onFreemodeDeliveryEnd("freemode"_J, ScriptPointer("OnFreemodeDeliveryEnd", "2D 0C 2A 00 00"));
|
||||
static ScriptFunction onFreemodeDeliveryEnd("freemode"_J, ScriptPointer("OnFreemodeDeliveryEnd", "2D 0C 2B 00"));
|
||||
onFreemodeDeliveryEnd.Call<void>(0, Self::GetPlayer().GetId(), 0, 0, 0, 0, 0, 0, 0, 0, hash, 273);
|
||||
//FreemodeDelivery::Get()->DeliveryCooldown1.Reset();
|
||||
}
|
||||
@@ -796,8 +796,8 @@ namespace YimMenu::Features
|
||||
{
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
int combination = *ScriptLocal(thread, 146).At(22).At(i, 2).At(1).As<int*>();
|
||||
*ScriptLocal(thread, 146).At(22).At(i, 2).As<float*>() = combination;
|
||||
int combination = *ScriptLocal(thread, 153).At(22).At(i, 2).At(1).As<int*>();
|
||||
*ScriptLocal(thread, 153).At(22).At(i, 2).As<float*>() = combination;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -915,7 +915,7 @@ namespace YimMenu::Features
|
||||
|
||||
if (auto thread = Scripts::FindScriptThread("fm_content_daily_bounty"_J))
|
||||
{
|
||||
if (auto coords = *ScriptLocal(thread, 243).At(434).At(1).At(0, 4).As<Vector3*>())
|
||||
if (auto coords = *ScriptLocal(thread, 250).At(434).At(1).At(0, 4).As<Vector3*>())
|
||||
{
|
||||
Self::GetPed().TeleportTo(coords);
|
||||
}
|
||||
@@ -962,9 +962,9 @@ namespace YimMenu::Features
|
||||
if (index < 0 || index >= wildlifePhotographyAnimalHashes.size())
|
||||
return;
|
||||
|
||||
ScriptGlobal(2709409).At(545).As<SCR_BITSET<uint64_t>*>()->Set(6);
|
||||
*ScriptGlobal(2709409).At(549).As<joaat_t*>() = wildlifePhotographyAnimalHashes[index];
|
||||
*ScriptGlobal(2709409).At(550).As<int*>() = *Pointers.GameTimer - 1; // bypass 2 sec delay
|
||||
ScriptGlobal(2709520).At(545).As<SCR_BITSET<uint64_t>*>()->Set(6);
|
||||
*ScriptGlobal(2709520).At(549).As<joaat_t*>() = wildlifePhotographyAnimalHashes[index];
|
||||
*ScriptGlobal(2709520).At(550).As<int*>() = *Pointers.GameTimer - 1; // bypass 2 sec delay
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "game/gta/ScriptLocal.hpp"
|
||||
#include "core/backend/ScriptMgr.hpp"
|
||||
#include "types/script/globals/GlobalPlayerBD.hpp"
|
||||
#include "game/backend/Self.hpp"
|
||||
|
||||
namespace YimMenu::Features
|
||||
{
|
||||
@@ -22,8 +23,8 @@ namespace YimMenu::Features
|
||||
|
||||
virtual void OnCall() override
|
||||
{
|
||||
auto base1 = ScriptGlobal(1936013).At(1);
|
||||
auto base2 = ScriptGlobal(1937981).At(3008);
|
||||
auto base1 = ScriptGlobal(1936406).At(1);
|
||||
auto base2 = ScriptGlobal(1938374).At(3008);
|
||||
|
||||
*base1.At(0, 1).As<int*>() = 100 - (_ApartmentHeistCut1.GetState() + _ApartmentHeistCut2.GetState() + _ApartmentHeistCut3.GetState() + _ApartmentHeistCut4.GetState());
|
||||
*base1.At(1, 1).As<int*>() = _ApartmentHeistCut2.GetState();
|
||||
@@ -75,8 +76,8 @@ namespace YimMenu::Features
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
|
||||
{
|
||||
*ScriptLocal(thread, 12223).At(24).As<int*>() = 7;
|
||||
*ScriptLocal(thread, 10217).As<int*>() = *ScriptLocal(thread, 10217).As<int*>() | (1 << 9);
|
||||
*ScriptLocal(thread, 12239).At(24).As<int*>() = 7;
|
||||
*ScriptLocal(thread, 10233).As<int*>() = *ScriptLocal(thread, 10233).As<int*>() | (1 << 9);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -89,7 +90,7 @@ namespace YimMenu::Features
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
|
||||
{
|
||||
*ScriptLocal(thread, 10511).At(11).As<float*>() = 100.0f;
|
||||
*ScriptLocal(thread, 10527).At(11).As<float*>() = 100.0f;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -102,8 +103,8 @@ namespace YimMenu::Features
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
|
||||
{
|
||||
*ScriptLocal(thread, 32616).As<int*>() = 8;
|
||||
*ScriptLocal(thread, 63640).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 32785).At(Self::GetPlayer().GetId(), 294).At(143).As<int*>() = 8;
|
||||
*ScriptLocal(thread, 64655).As<int*>() = 5;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -119,10 +120,10 @@ namespace YimMenu::Features
|
||||
Scripts::ForceScriptHost(thread);
|
||||
ScriptMgr::Yield(500ms);
|
||||
|
||||
*ScriptLocal(thread, 20395).At(1725).At(0, 1).As<int*>() = 80;
|
||||
*ScriptLocal(thread, 20395).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 29016).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32472).At(0, 294).At(68).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 20412).At(1725).At(0, 1).As<int*>() = 80;
|
||||
*ScriptLocal(thread, 20412).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 29326).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32785).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.
|
||||
}
|
||||
@@ -139,11 +140,11 @@ namespace YimMenu::Features
|
||||
Scripts::ForceScriptHost(thread);
|
||||
ScriptMgr::Yield(500ms);
|
||||
|
||||
*ScriptLocal(thread, 20395).At(2686).As<int*>() = 1875000;
|
||||
*ScriptLocal(thread, 20395).At(1062).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 20395).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 29016).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32472).At(0, 294).At(68).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 20412).At(2686).As<int*>() = 1875000;
|
||||
*ScriptLocal(thread, 20412).At(1062).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 20412).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 29326).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32785).At(0, 294).At(68).As<int*>() = 99999;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -25,7 +25,7 @@ namespace YimMenu::Features
|
||||
|
||||
virtual void OnCall() override
|
||||
{
|
||||
auto base = ScriptGlobal(1980035).At(831).At(56);
|
||||
auto base = ScriptGlobal(1980570).At(831).At(56);
|
||||
|
||||
*base.At(0, 1).As<int*>() = _CayoPericoHeistCut1.GetState();
|
||||
*base.At(1, 1).As<int*>() = _CayoPericoHeistCut2.GetState();
|
||||
@@ -40,7 +40,7 @@ namespace YimMenu::Features
|
||||
|
||||
virtual void OnCall() override
|
||||
{
|
||||
auto base = ScriptGlobal(1981146);
|
||||
auto base = ScriptGlobal(1973762);
|
||||
|
||||
for (int i = 0; i <= 3; i++)
|
||||
{
|
||||
@@ -123,7 +123,7 @@ namespace YimMenu::Features
|
||||
ScriptMgr::Yield(500ms);
|
||||
|
||||
if (auto thread = Scripts::FindScriptThread("heist_island_planning"_J))
|
||||
*ScriptLocal(thread, 1570).As<int*>() = 2;
|
||||
*ScriptLocal(thread, 1580).As<int*>() = 2;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -195,7 +195,7 @@ namespace YimMenu::Features
|
||||
virtual void OnCall() override
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
|
||||
*ScriptLocal(thread, 59705).At(1376).At(53).As<int*>() = _CayoPericoHeistSecondaryTakeValue.GetState();
|
||||
*ScriptLocal(thread, 59986).At(1376).At(53).As<int*>() = _CayoPericoHeistSecondaryTakeValue.GetState();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -206,7 +206,7 @@ namespace YimMenu::Features
|
||||
virtual void OnCall() override
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
|
||||
*ScriptLocal(thread, 26486).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 26619).As<int*>() = 5;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -217,7 +217,7 @@ namespace YimMenu::Features
|
||||
virtual void OnCall() override
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
|
||||
*ScriptLocal(thread, 31349).As<int*>() = 6;
|
||||
*ScriptLocal(thread, 31511).As<int*>() = 6;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -228,7 +228,7 @@ namespace YimMenu::Features
|
||||
virtual void OnCall() override
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller_2020"_J))
|
||||
*ScriptLocal(thread, 32589).At(3).As<float*>() = 100.0f;
|
||||
*ScriptLocal(thread, 32751).At(3).As<float*>() = 100.0f;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -258,12 +258,12 @@ namespace YimMenu::Features
|
||||
case 1:
|
||||
case 3:
|
||||
case 5:
|
||||
*ScriptLocal(thread, 32588).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 32589).As<int*>() = 3;
|
||||
*ScriptLocal(thread, 32750).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 32751).As<int*>() = 3;
|
||||
break;
|
||||
case 2:
|
||||
case 4:
|
||||
*ScriptLocal(thread, 32563).As<int*>() = 7;
|
||||
*ScriptLocal(thread, 32725).As<int*>() = 7;
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
@@ -287,8 +287,8 @@ namespace YimMenu::Features
|
||||
Scripts::ForceScriptHost(thread);
|
||||
ScriptMgr::Yield(500ms);
|
||||
|
||||
*ScriptLocal(thread, 56223).As<int*>() = 9;
|
||||
*ScriptLocal(thread, 56223).At(1776).At(0, 1).As<int*>() = 50;
|
||||
*ScriptLocal(thread, 56504).As<int*>() = 9;
|
||||
*ScriptLocal(thread, 56504).At(1776).At(0, 1).As<int*>() = 50;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include "game/gta/ScriptLocal.hpp"
|
||||
#include "core/backend/ScriptMgr.hpp"
|
||||
#include "game/backend/Tunables.hpp"
|
||||
#include "game/backend/Self.hpp"
|
||||
|
||||
namespace YimMenu::Features
|
||||
{
|
||||
@@ -23,7 +24,7 @@ namespace YimMenu::Features
|
||||
|
||||
virtual void OnCall() override
|
||||
{
|
||||
auto base = ScriptGlobal(1973231).At(1497).At(736).At(92);
|
||||
auto base = ScriptGlobal(1973762).At(1497).At(736).At(92);
|
||||
|
||||
*base.At(0, 1).As<int*>() = _DiamondCasinoHeistCut1.GetState();
|
||||
*base.At(1, 1).As<int*>() = _DiamondCasinoHeistCut2.GetState();
|
||||
@@ -38,7 +39,7 @@ namespace YimMenu::Features
|
||||
|
||||
virtual void OnCall() override
|
||||
{
|
||||
auto base = ScriptGlobal(1977594);
|
||||
auto base = ScriptGlobal(1978125);
|
||||
|
||||
for (int i = 0; i <= 3; i++)
|
||||
{
|
||||
@@ -302,7 +303,7 @@ namespace YimMenu::Features
|
||||
virtual void OnCall() override
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
|
||||
*ScriptLocal(thread, 20395).At(2686).As<int*>() = _DiamondCasinoHeistActualTake.GetState();
|
||||
*ScriptLocal(thread, 20412).At(2686).As<int*>() = _DiamondCasinoHeistActualTake.GetState();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -314,8 +315,8 @@ namespace YimMenu::Features
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
|
||||
{
|
||||
*ScriptLocal(thread, 54042).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 55108).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 55028).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 56098).As<int*>() = 5;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -327,7 +328,7 @@ namespace YimMenu::Features
|
||||
virtual void OnCall() override
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
|
||||
*ScriptLocal(thread, 10551).At(7).As<int*>() = *ScriptLocal(thread, 10551).At(37).As<int*>();
|
||||
*ScriptLocal(thread, 10567).At(7).As<int*>() = *ScriptLocal(thread, 10567).At(37).As<int*>();
|
||||
}
|
||||
};
|
||||
|
||||
@@ -339,7 +340,7 @@ namespace YimMenu::Features
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
|
||||
{
|
||||
*ScriptLocal(thread, 32616).As<int*>() = 8;
|
||||
*ScriptLocal(thread, 32785).At(Self::GetPlayer().GetId(), 294).At(143).As<int*>() = 8;
|
||||
*ScriptLocal(thread, 63640).As<int*>() = 5;
|
||||
}
|
||||
}
|
||||
@@ -356,12 +357,12 @@ namespace YimMenu::Features
|
||||
Scripts::ForceScriptHost(thread);
|
||||
ScriptMgr::Yield(500ms);
|
||||
|
||||
*ScriptLocal(thread, 20395).At(1740).At(0, 1).As<int*>() = 80;
|
||||
*ScriptLocal(thread, 20395).At(2686).As<int*>() = 4443220;
|
||||
*ScriptLocal(thread, 20395).At(1062).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 20395).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 29016).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32472).At(0, 294).At(68).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 20412).At(1740).At(0, 1).As<int*>() = 80;
|
||||
*ScriptLocal(thread, 20412).At(2686).As<int*>() = 4443220;
|
||||
*ScriptLocal(thread, 20412).At(1062).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 20412).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 29326).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32785).At(0, 294).At(68).As<int*>() = 99999;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace YimMenu::Features
|
||||
|
||||
virtual void OnCall() override
|
||||
{
|
||||
auto base = ScriptGlobal(1968543).At(812).At(50);
|
||||
auto base = ScriptGlobal(1969071).At(812).At(50);
|
||||
|
||||
*base.At(0, 1).As<int*>() = _DoomsdayHeistCut1.GetState();
|
||||
*base.At(1, 1).As<int*>() = _DoomsdayHeistCut2.GetState();
|
||||
@@ -83,7 +83,7 @@ namespace YimMenu::Features
|
||||
ScriptMgr::Yield(500ms);
|
||||
|
||||
if (auto thread = Scripts::FindScriptThread("gb_gang_ops_planning"_J))
|
||||
*ScriptLocal(thread, 211).As<int*>() = 6;
|
||||
*ScriptLocal(thread, 218).As<int*>() = 6;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -95,9 +95,9 @@ namespace YimMenu::Features
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("fm_mission_controller"_J))
|
||||
{
|
||||
*ScriptLocal(thread, 1572).As<int*>() = 2;
|
||||
*ScriptLocal(thread, 1541).As<int*>() = 3;
|
||||
*ScriptLocal(thread, 1298).At(135).As<int*>() = 3;
|
||||
*ScriptLocal(thread, 1588).As<int*>() = 2;
|
||||
*ScriptLocal(thread, 1557).As<int*>() = 3;
|
||||
*ScriptLocal(thread, 1314).At(135).As<int*>() = 3;
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -113,10 +113,10 @@ namespace YimMenu::Features
|
||||
Scripts::ForceScriptHost(thread);
|
||||
ScriptMgr::Yield(500ms);
|
||||
|
||||
*ScriptLocal(thread, 20395).At(1725).At(0, 1).As<int*>() = 80;
|
||||
*ScriptLocal(thread, 20395).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 29016).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32472).At(0, 294).At(68).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 20412).At(1725).At(0, 1).As<int*>() = 80;
|
||||
*ScriptLocal(thread, 20412).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 29326).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32785).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.
|
||||
}
|
||||
@@ -133,11 +133,11 @@ namespace YimMenu::Features
|
||||
Scripts::ForceScriptHost(thread);
|
||||
ScriptMgr::Yield(500ms);
|
||||
|
||||
*ScriptLocal(thread, 20395).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 20395).At(1740).At(0, 1).As<int*>() = 150;
|
||||
*ScriptLocal(thread, 20395).At(1062).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 29016).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32472).At(0, 294).At(68).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 20412).As<int*>() = 12;
|
||||
*ScriptLocal(thread, 20412).At(1740).At(0, 1).As<int*>() = 150;
|
||||
*ScriptLocal(thread, 20412).At(1062).As<int*>() = 5;
|
||||
*ScriptLocal(thread, 29326).At(0, 1).As<int*>() = 99999;
|
||||
*ScriptLocal(thread, 32785).At(0, 294).At(68).As<int*>() = 99999;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -18,8 +18,8 @@ namespace YimMenu::Features
|
||||
virtual void OnTick() override
|
||||
{
|
||||
*Pointers.HasGTAPlus = true;
|
||||
*ScriptGlobal(1970058).As<bool*>() = true;
|
||||
*ScriptGlobal(1970058).At(3).As<int*>() = (1 << 3) | (1 << 1);
|
||||
*ScriptGlobal(1970586).As<bool*>() = true;
|
||||
*ScriptGlobal(1970586).At(3).As<int*>() = (1 << 3) | (1 << 1);
|
||||
}
|
||||
|
||||
virtual void OnDisable() override
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#include "core/commands/LoopedCommand.hpp"
|
||||
#include "game/backend/Self.hpp"
|
||||
#include "game/gta/Scripts.hpp"
|
||||
#include "game/gta/ScriptGlobal.hpp"
|
||||
#include "game/pointers/Pointers.hpp"
|
||||
#include "types/script/globals/GlobalPlayerBD.hpp"
|
||||
|
||||
namespace YimMenu::Features
|
||||
@@ -12,7 +14,10 @@ namespace YimMenu::Features
|
||||
virtual void OnTick() override
|
||||
{
|
||||
if (auto gpbd = GlobalPlayerBD::Get(); gpbd && Scripts::SafeToModifyFreemodeBroadcastGlobals())
|
||||
{
|
||||
*ScriptGlobal(2673276).At(58).As<int*>() = *Pointers.NetworkTime;
|
||||
gpbd->Entries[Self::GetPlayer().GetId()].OffRadarActive = true;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void OnDisable() override
|
||||
|
||||
@@ -45,7 +45,7 @@ namespace YimMenu::Features
|
||||
}
|
||||
|
||||
static ScriptFunction runGunLockerMenu("AM_MP_AUTO_SHOP"_J, ScriptPointer("RunGunLockerMenu", "2D 06 08 00 00 38 03 5D ? ? ? 57 03 00"));
|
||||
auto gunLockerData = ScriptLocal(m_Thread, 294).At(584);
|
||||
auto gunLockerData = ScriptLocal(m_Thread, 301).At(568);
|
||||
|
||||
int unused;
|
||||
runGunLockerMenu.Call<void>(gunLockerData.As<void*>(), &unused, eSimpleInteriorIndex::SIMPLE_INTERIOR_AUTO_SHOP_MISSION_ROW, Self::GetPlayer().GetId(), false, true);
|
||||
|
||||
@@ -70,7 +70,7 @@ namespace YimMenu::Features
|
||||
|
||||
if (!isItemLockedByStatPatch1)
|
||||
{
|
||||
isItemLockedByStatPatch1 = ScriptPatches::AddPatch("wardrobe_mp"_J, ScriptPointer("IsItemLockedByStatPatch1", "38 00 65 02 F7 B6 C6 31 09 00 31 46 A9 B0 28 04"), {0x71, 0x2E, 0x03, 0x01});
|
||||
isItemLockedByStatPatch1 = ScriptPatches::AddPatch("wardrobe_mp"_J, ScriptPointer("IsItemLockedByStatPatch1", "38 00 65 02 F7"), {0x71, 0x2E, 0x03, 0x01});
|
||||
}
|
||||
isItemLockedByStatPatch1->Enable();
|
||||
|
||||
@@ -105,7 +105,7 @@ namespace YimMenu::Features
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThread("wardrobe_mp"_J))
|
||||
{
|
||||
if (*ScriptLocal(thread, 191).At(46).At(9).As<int*>() == 4)
|
||||
if (*ScriptLocal(thread, 198).At(46).At(9).As<int*>() == 4)
|
||||
{
|
||||
shouldCleanupWardrobePatch->Disable();
|
||||
isWardrobeOpenedPatch->Disable();
|
||||
|
||||
@@ -24,8 +24,8 @@ namespace YimMenu::Features
|
||||
|
||||
if (auto freemode = Scripts::FindScriptThread("freemode"_J))
|
||||
{
|
||||
auto data = ScriptLocal(freemode, 8819);
|
||||
*data.At(3).As<int*>() = 230;
|
||||
auto data = ScriptLocal(freemode, 8854);
|
||||
*data.At(3).As<int*>() = 235;
|
||||
*data.At(3).At(16).As<int*>() = Self::GetPlayer().GetId();
|
||||
*data.At(3).At(1).As<int*>() = 89;
|
||||
*data.At(2).As<int*>() = "AM_CONTACT_REQUESTS"_J;
|
||||
@@ -35,8 +35,8 @@ namespace YimMenu::Features
|
||||
{
|
||||
if (auto thread = Scripts::FindScriptThreadByID(id))
|
||||
{
|
||||
*ScriptLocal(thread, 528).As<int*>() = 1;
|
||||
ScriptGlobal(2686095).At(4357).At(260).At(7, 2).As<TIMER*>()->Destroy();
|
||||
*ScriptLocal(thread, 535).As<int*>() = 1;
|
||||
ScriptGlobal(2686124).At(4373).At(260).At(7, 2).As<TIMER*>()->Destroy();
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -59,7 +59,7 @@ namespace YimMenu::Features
|
||||
|
||||
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, 195).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))
|
||||
{
|
||||
|
||||
@@ -93,8 +93,8 @@ namespace YimMenu::Submenus
|
||||
{
|
||||
if (event == ARMOURED_TRUCK) // It doesn't have tunables
|
||||
{
|
||||
setCooldown = *ScriptGlobal(262145).At(33807).As<int*>();
|
||||
setAvailability = *ScriptGlobal(262145).At(33808).As<int*>();
|
||||
setCooldown = *ScriptGlobal(262145).At(33808).As<int*>();
|
||||
setAvailability = *ScriptGlobal(262145).At(33809).As<int*>();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace YimMenu::Network
|
||||
void LaunchJoinType(JoinType to_launch)
|
||||
{
|
||||
static ScriptFunction sendToClouds("shop_controller"_J, ScriptPointer("SendToClouds", "2D 00 02 00 00 72 5D ? ? ? 72"));
|
||||
static ScriptGlobal join_type_global(1575044);
|
||||
static ScriptGlobal join_type_global(1575048);
|
||||
|
||||
sendToClouds.Call<void>();
|
||||
*join_type_global.As<JoinType*>() = to_launch;
|
||||
|
||||
@@ -325,7 +325,7 @@ namespace YimMenu::Scripts
|
||||
rand_int_2 ^= (random_int ^ -2024791401); // TODO: this is a pretty ghetto way to create random numbers
|
||||
rand_int_2 ^= (random_int ^ 917391583);
|
||||
|
||||
auto bypass_global = ScriptGlobal(1990823); // this global will bypass the new checks added this update
|
||||
auto bypass_global = ScriptGlobal(1991386); // this global will bypass the new checks added this update
|
||||
auto old_val = *bypass_global.As<int*>();
|
||||
*bypass_global.As<int*>() = rand_int_2 ^ rand() ^ time(0);
|
||||
|
||||
|
||||
@@ -230,6 +230,11 @@ namespace YimMenu
|
||||
"fm_content_survival_grouping"_J,
|
||||
"fm_content_valentine_cheater"_J,
|
||||
"fm_content_survival"_J,
|
||||
"fm_content_kortz_scoping"_J,
|
||||
"fm_content_kortz_entry"_J,
|
||||
"fm_content_kortz_equipment"_J,
|
||||
"fm_content_kortz_disruption"_J,
|
||||
"fm_content_kortz_task"_J,
|
||||
"AM_BOAT_TAXI"_J,
|
||||
"AM_HELI_TAXI"_J,
|
||||
"fm_hold_up_tut"_J,
|
||||
@@ -258,7 +263,7 @@ namespace YimMenu
|
||||
"fm_Bj_race_controler"_J,
|
||||
"fm_deathmatch_controler"_J,
|
||||
"fm_hideout_controler"_J,
|
||||
"fm_mission_controller_2020"_J, // Public_Mission_Controller, fm_mission_controller
|
||||
"fm_mission_controller_v3"_J, // Public_Mission_Controller/fm_mission_controller/fm_mission_controller_2020
|
||||
"FM_Race_Controler"_J,
|
||||
"FM_Horde_Controler"_J, // FM_Survival_Controller
|
||||
"dont_cross_the_line"_J,
|
||||
|
||||
@@ -403,6 +403,7 @@ namespace YimMenu
|
||||
"csb_englishdave",
|
||||
"csb_englishdave_02",
|
||||
"csb_faber_02",
|
||||
"csb_faber_03",
|
||||
"csb_fos_rep",
|
||||
"csb_g",
|
||||
"csb_georginacheng",
|
||||
@@ -456,7 +457,9 @@ namespace YimMenu
|
||||
"csb_porndudes",
|
||||
"csb_prologuedriver",
|
||||
"csb_prolsec",
|
||||
"csb_rae",
|
||||
"csb_rafdeangelis",
|
||||
"csb_rafdeangelis_02",
|
||||
"csb_ramp_gang",
|
||||
"csb_ramp_hic",
|
||||
"csb_ramp_hipster",
|
||||
@@ -564,6 +567,7 @@ namespace YimMenu
|
||||
"ig_agent_02",
|
||||
"ig_agent14_02",
|
||||
"ig_ahronward",
|
||||
"ig_alec",
|
||||
"ig_amandatownley",
|
||||
"ig_amandatownley_02",
|
||||
"ig_andreas",
|
||||
@@ -638,6 +642,7 @@ namespace YimMenu
|
||||
"ig_entourage_a",
|
||||
"ig_entourage_b",
|
||||
"ig_faber_02",
|
||||
"ig_faber_03",
|
||||
"ig_fabien",
|
||||
"ig_fbisuit_01",
|
||||
"ig_fibleader_01",
|
||||
@@ -752,12 +757,15 @@ namespace YimMenu
|
||||
"ig_patricia",
|
||||
"ig_patricia_02",
|
||||
"ig_pernell_moss",
|
||||
"ig_pernell_moss_02",
|
||||
"ig_pilot",
|
||||
"ig_pilot_02",
|
||||
"ig_popov",
|
||||
"ig_priest",
|
||||
"ig_prolsec_02",
|
||||
"ig_rae",
|
||||
"ig_rafdeangelis",
|
||||
"ig_rafdeangelis_02",
|
||||
"ig_ramp_gang",
|
||||
"ig_ramp_hic",
|
||||
"ig_ramp_hipster",
|
||||
@@ -927,6 +935,7 @@ namespace YimMenu
|
||||
"s_m_m_highsec_05",
|
||||
"s_m_m_highsec_06",
|
||||
"s_m_m_janitor",
|
||||
"s_m_m_kortzsecurity_01",
|
||||
"s_m_m_lathandy_01",
|
||||
"s_m_m_lifeinvad_01",
|
||||
"s_m_m_linecook",
|
||||
|
||||
@@ -126,6 +126,7 @@ namespace YimMenu
|
||||
"am_mp_island",
|
||||
"am_mp_juggalo_hideout",
|
||||
"am_mp_mansion",
|
||||
"am_mp_mansion_art_workshop",
|
||||
"am_mp_mansion_driveway",
|
||||
"am_mp_mansion_garage",
|
||||
"am_mp_multistorey_garage",
|
||||
@@ -437,6 +438,7 @@ namespace YimMenu
|
||||
"flow_help",
|
||||
"flyunderbridges",
|
||||
"fmmc_contentquicklauncher",
|
||||
"fmmc_lasers",
|
||||
"fmmc_launcher",
|
||||
"fmmc_playlist_controller",
|
||||
"fm_bj_race_controler",
|
||||
@@ -493,6 +495,11 @@ namespace YimMenu
|
||||
"fm_content_hsw_time_trial",
|
||||
"fm_content_island_dj",
|
||||
"fm_content_island_heist",
|
||||
"fm_content_kortz_disruption",
|
||||
"fm_content_kortz_entry",
|
||||
"fm_content_kortz_equipment",
|
||||
"fm_content_kortz_scoping",
|
||||
"fm_content_kortz_task",
|
||||
"fm_content_metal_detector",
|
||||
"fm_content_movie_props",
|
||||
"fm_content_mp_intro",
|
||||
@@ -552,6 +559,7 @@ namespace YimMenu
|
||||
"fm_main_menu",
|
||||
"fm_mission_controller",
|
||||
"fm_mission_controller_2020",
|
||||
"fm_mission_controller_v3",
|
||||
"fm_mission_creator",
|
||||
"fm_race_controler",
|
||||
"fm_race_creator",
|
||||
@@ -716,6 +724,7 @@ namespace YimMenu
|
||||
"josh4",
|
||||
"juggalo_hideout_carmod",
|
||||
"juggalo_hideout_seating",
|
||||
"kortz_planning",
|
||||
"lamar1",
|
||||
"landing_pre_startup",
|
||||
"laptop_trigger",
|
||||
@@ -765,6 +774,7 @@ namespace YimMenu
|
||||
"maintransition",
|
||||
"main_install",
|
||||
"main_persistent",
|
||||
"mansion_art_workshop_seating",
|
||||
"mansion_basement_seating",
|
||||
"mansion_carmod",
|
||||
"mansion_club_bar",
|
||||
@@ -818,6 +828,7 @@ namespace YimMenu
|
||||
"mp_registration",
|
||||
"mp_save_game_global_block",
|
||||
"mp_skycam_stuck_wiggler",
|
||||
"mp_strand_f9",
|
||||
"mp_unlocks",
|
||||
"mp_weapons",
|
||||
"mrsphilips1",
|
||||
|
||||
@@ -29,7 +29,7 @@ namespace YimMenu
|
||||
INGAMEHUD = 4600,
|
||||
TRANSITION = 8032,
|
||||
FMMC_LAUNCHER = 28000,
|
||||
MULTIPLAYER_FREEMODE = 89500,
|
||||
MULTIPLAYER_FREEMODE = 92500,
|
||||
MISSION = 64500,
|
||||
MP_LAUNCH_SCRIPT = 35250
|
||||
};
|
||||
|
||||
@@ -161,6 +161,7 @@ namespace YimMenu
|
||||
"camper"_J,
|
||||
"caracara"_J,
|
||||
"caracara2"_J,
|
||||
"caracara3"_J,
|
||||
"carbonizzare"_J,
|
||||
"carbonrs"_J,
|
||||
"cargobob"_J,
|
||||
@@ -170,6 +171,7 @@ namespace YimMenu
|
||||
"cargobob5"_J,
|
||||
"cargoplane"_J,
|
||||
"cargoplane2"_J,
|
||||
"cartuccia"_J,
|
||||
"casco"_J,
|
||||
"castigator"_J,
|
||||
"cavalcade"_J,
|
||||
@@ -262,9 +264,12 @@ namespace YimMenu
|
||||
"draugur"_J,
|
||||
"driftchavosv6"_J,
|
||||
"driftcheburek"_J,
|
||||
"driftcoquette"_J,
|
||||
"driftcypher"_J,
|
||||
"driftdominator10"_J,
|
||||
"driftdominator8"_J,
|
||||
"driftdominator9"_J,
|
||||
"driftelegy"_J,
|
||||
"drifteuros"_J,
|
||||
"driftfr36"_J,
|
||||
"driftfuto"_J,
|
||||
@@ -312,6 +317,7 @@ namespace YimMenu
|
||||
"entityxf"_J,
|
||||
"envisage"_J,
|
||||
"esskey"_J,
|
||||
"estride"_J,
|
||||
"eudora"_J,
|
||||
"euros"_J,
|
||||
"eurosx32"_J,
|
||||
@@ -400,6 +406,7 @@ namespace YimMenu
|
||||
"hellion"_J,
|
||||
"hermes"_J,
|
||||
"hexer"_J,
|
||||
"horus"_J,
|
||||
"hotknife"_J,
|
||||
"hotring"_J,
|
||||
"howard"_J,
|
||||
@@ -472,6 +479,7 @@ namespace YimMenu
|
||||
"l352"_J,
|
||||
"landstalker"_J,
|
||||
"landstalker2"_J,
|
||||
"laufer"_J,
|
||||
"lazer"_J,
|
||||
"le7b"_J,
|
||||
"lectro"_J,
|
||||
@@ -480,6 +488,7 @@ namespace YimMenu
|
||||
"lm87"_J,
|
||||
"locust"_J,
|
||||
"longfin"_J,
|
||||
"lrcgt"_J,
|
||||
"luiva"_J,
|
||||
"lurcher"_J,
|
||||
"luxor"_J,
|
||||
@@ -499,6 +508,7 @@ namespace YimMenu
|
||||
"maverick"_J,
|
||||
"maverick2"_J,
|
||||
"menacer"_J,
|
||||
"merula"_J,
|
||||
"mesa"_J,
|
||||
"mesa2"_J,
|
||||
"mesa3"_J,
|
||||
@@ -604,6 +614,7 @@ namespace YimMenu
|
||||
"policeold2"_J,
|
||||
"policet"_J,
|
||||
"policet3"_J,
|
||||
"polignus"_J,
|
||||
"polimpaler5"_J,
|
||||
"polimpaler6"_J,
|
||||
"polmav"_J,
|
||||
@@ -850,6 +861,7 @@ namespace YimMenu
|
||||
"trash"_J,
|
||||
"trash2"_J,
|
||||
"trflat"_J,
|
||||
"trflat2"_J,
|
||||
"tribike"_J,
|
||||
"tribike2"_J,
|
||||
"tribike3"_J,
|
||||
@@ -881,6 +893,7 @@ namespace YimMenu
|
||||
"valkyrie2"_J,
|
||||
"vamos"_J,
|
||||
"vectre"_J,
|
||||
"velenogt"_J,
|
||||
"velum"_J,
|
||||
"velum2"_J,
|
||||
"verlierer2"_J,
|
||||
@@ -911,6 +924,7 @@ namespace YimMenu
|
||||
"vorschlaghammer"_J,
|
||||
"vortex"_J,
|
||||
"vstr"_J,
|
||||
"warden"_J,
|
||||
"warrener"_J,
|
||||
"warrener2"_J,
|
||||
"washington"_J,
|
||||
|
||||
@@ -107,9 +107,9 @@ namespace YimMenu
|
||||
ScriptGlobals = ptr.Add(7).Add(3).Rip().As<std::int64_t**>();
|
||||
});
|
||||
|
||||
constexpr auto sendNetworkDamagePtrn = Pattern<"0F B6 41 28 04 FE 3C 03 0F 87 EA">("SendNetworkDamage");
|
||||
scanner.Add(sendNetworkDamagePtrn, [this](PointerCalculator ptr) {
|
||||
TriggerWeaponDamageEvent = ptr.Sub(0x51).As<Functions::TriggerWeaponDamageEvent>();
|
||||
constexpr auto triggerWeaponDamageEventPtrn = Pattern<"E8 ? ? ? ? 66 90 FF C5">("TriggerWeaponDamageEvent");
|
||||
scanner.Add(triggerWeaponDamageEventPtrn, [this](PointerCalculator ptr) {
|
||||
TriggerWeaponDamageEvent = ptr.Add(1).Rip().As<Functions::TriggerWeaponDamageEvent>();
|
||||
});
|
||||
|
||||
constexpr auto scriptProgramsPtrn = Pattern<"48 C7 84 C8 D8 00 00 00 00 00 00 00">("ScriptPrograms");
|
||||
@@ -199,10 +199,10 @@ namespace YimMenu
|
||||
NetEventMgr = ptr.Add(3).Rip().As<rage::netEventMgr**>();
|
||||
});
|
||||
|
||||
constexpr auto sendEventAckPtrn = Pattern<"84 C0 75 ? 89 EE 49 8D AD">("SendEventAck");
|
||||
constexpr auto sendEventAckPtrn = Pattern<"E8 ? ? ? ? 84 C0 75 ? 44 89 F5">("SendEventAck");
|
||||
scanner.Add(sendEventAckPtrn, [this](PointerCalculator ptr) {
|
||||
EventAck = ptr.Sub(4).Rip().As<Functions::EventAck>();
|
||||
SendEventAck = ptr.Add(0x13).Add(1).Rip().As<Functions::SendEventAck>();
|
||||
EventAck = ptr.Add(1).Rip().As<Functions::EventAck>();
|
||||
SendEventAck = ptr.Add(0x1A).Add(1).Rip().As<Functions::SendEventAck>();
|
||||
});
|
||||
|
||||
constexpr auto queueDependencyPtrn = Pattern<"0F 29 46 50 48 8D 05">("QueueDependency&SigScanMemory");
|
||||
@@ -216,9 +216,9 @@ namespace YimMenu
|
||||
ScriptVM = ptr.Sub(0x24).As<Functions::ScriptVM>();
|
||||
});
|
||||
|
||||
constexpr auto prepareMetricForSendingPtrn = Pattern<"48 89 F9 FF 50 20 48 8D 15">("PrepareMetricForSending");
|
||||
constexpr auto prepareMetricForSendingPtrn = Pattern<"41 56 56 57 55 53 48 83 EC ? 4C 89 CB 4C 89 C6">("PrepareMetricForSending");
|
||||
scanner.Add(prepareMetricForSendingPtrn, [this](PointerCalculator ptr) {
|
||||
PrepareMetricForSending = ptr.Sub(0x26).As<PVOID>();
|
||||
PrepareMetricForSending = ptr.As<PVOID>();
|
||||
});
|
||||
|
||||
constexpr auto beDataPtrn = Pattern<"48 C7 05 ? ? ? ? 00 00 00 00 E8 ? ? ? ? 48 89 C1 E8 ? ? ? ? E8 ? ? ? ? BD 0A 00 00 00">("BEData");
|
||||
@@ -228,7 +228,8 @@ namespace YimMenu
|
||||
IsBEBanned = ptr.Add(3).Rip().Add(8).Add(4).Add(8).Add(4).As<bool*>();
|
||||
});
|
||||
|
||||
constexpr auto battlEyeStatusUpdatePatchPtrn = Pattern<"80 B9 92 0A 00 00 01">("BattlEyeStatusUpdatePatch");
|
||||
#if 0
|
||||
constexpr auto battlEyeStatusUpdatePatchPtrn = Pattern<"80 B9 92 0A 00 00 01 48 81 D1 90 0A 00 00">("BattlEyeStatusUpdatePatch");
|
||||
scanner.Add(battlEyeStatusUpdatePatchPtrn, [this](PointerCalculator ptr) {
|
||||
BattlEyeStatusUpdatePatch = BytePatches::Add(ptr.As<void*>(),
|
||||
// since arxan obfuscated this subroutine, return mid-function instead
|
||||
@@ -241,6 +242,7 @@ namespace YimMenu
|
||||
})
|
||||
);
|
||||
});
|
||||
#endif
|
||||
|
||||
constexpr auto writeNetArrayDataPtrn = Pattern<"0F 84 06 03 00 00 0F B6 83">("WriteNetArrayData");
|
||||
scanner.Add(writeNetArrayDataPtrn, [this](PointerCalculator ptr) {
|
||||
@@ -304,9 +306,9 @@ namespace YimMenu
|
||||
NetworkSession = ptr.Add(0x17).Add(3).Rip().As<CNetworkSession**>();
|
||||
});
|
||||
|
||||
constexpr auto joinSessionByInfoPtrn = Pattern<"B0 01 40 84 E9 0F 85 32 FD FF FF 48 89 F1">("JoinSessionByInfo");
|
||||
constexpr auto joinSessionByInfoPtrn = Pattern<"E8 ? ? ? ? 0F 10 87 ? ? ? ? 0F 11 86 ? ? ? ? 88 86 ? ? ? ? 84 C0">("JoinSessionByInfo");
|
||||
scanner.Add(joinSessionByInfoPtrn, [this](PointerCalculator ptr) {
|
||||
JoinSessionByInfo = ptr.Sub(0x7).Add(1).Rip().As<Functions::JoinSessionByInfo>();
|
||||
JoinSessionByInfo = ptr.Add(1).Rip().As<Functions::JoinSessionByInfo>();
|
||||
});
|
||||
|
||||
constexpr auto getSessionByGamerHandle = Pattern<"48 C7 84 24 80 00 00 00 10 00 00 08">("GetSessionByGamerHandle");
|
||||
@@ -370,7 +372,7 @@ namespace YimMenu
|
||||
SetJoinRequestPoolTypePatch = BytePatches::Add(ptr.Sub(5).As<std::uint8_t*>(), std::to_array<std::uint8_t>({0xB8, 0x00, 0x00, 0x00, 0x00}));
|
||||
});
|
||||
|
||||
constexpr auto handleJoinRequestIgnorePoolPatchPtrn = Pattern<"41 83 FF 05 74 ? 42 8B 84 F5">("HandleJoinRequestIgnorePoolPatch");
|
||||
constexpr auto handleJoinRequestIgnorePoolPatchPtrn = Pattern<"41 83 FF ? 74 ? 41 83 FF ? 0F 84 ? ? ? ? 45 85 FF 75">("HandleJoinRequestIgnorePoolPatch");
|
||||
scanner.Add(handleJoinRequestIgnorePoolPatchPtrn, [this](PointerCalculator ptr) {
|
||||
HandleJoinRequestIgnorePoolPatch = BytePatches::Add(ptr.As<void*>(), std::to_array<std::uint8_t>({0x39, 0xC9, 0x90, 0x90}));
|
||||
});
|
||||
|
||||
@@ -12,14 +12,14 @@ static_assert(sizeof(DeliveryPosData) == 6 * 8);
|
||||
struct FreemodeDelivery
|
||||
{
|
||||
SCR_INT DeliveryFlags; // 0
|
||||
SCR_ARRAY<DeliveryPosData, 1008> DeliveryPosData; // 1
|
||||
SCR_BOOL DeliveryInVehicle; // 6050
|
||||
SCR_BOOL DeliveryNotInVehicle; // 6051
|
||||
TIMER DeliveryCooldown1; // 6052
|
||||
SCR_INT CooldownFrameCount1; // 6054
|
||||
TIMER DeliveryCooldown2; // 6055
|
||||
SCR_INT CooldownFrameCount2; // 6057
|
||||
SCR_ARRAY<DeliveryPosData, 1011> DeliveryPosData; // 1
|
||||
SCR_BOOL DeliveryInVehicle; // 6068
|
||||
SCR_BOOL DeliveryNotInVehicle; // 6069
|
||||
TIMER DeliveryCooldown1; // 6070
|
||||
SCR_INT CooldownFrameCount1; // 6072
|
||||
TIMER DeliveryCooldown2; // 6073
|
||||
SCR_INT CooldownFrameCount2; // 6075
|
||||
|
||||
static FreemodeDelivery* Get();
|
||||
};
|
||||
//static_assert(sizeof(FreemodeDelivery) == 6260 * 8);
|
||||
//static_assert(sizeof(FreemodeDelivery) == 6278 * 8);
|
||||
@@ -70,8 +70,9 @@ struct FreemodeGeneral
|
||||
STREET_DEALERS StreetDealers; // 5635
|
||||
uint64_t PAD_5659[107];
|
||||
DAILY_RESET_DATA DailyReset; // 5766
|
||||
FREEMODE_DELIVERY_DATA DeliveryData; // 5770
|
||||
uint64_t PAD_5670[4];
|
||||
FREEMODE_DELIVERY_DATA DeliveryData; // 5774
|
||||
|
||||
static FreemodeGeneral* Get();
|
||||
};
|
||||
//static_assert(sizeof(FreemodeGeneral) == 6073 * 8);
|
||||
//static_assert(sizeof(FreemodeGeneral) == 6077 * 8);
|
||||
@@ -687,8 +687,9 @@ struct GPBD_FM_Entry
|
||||
// int64_t PAD_0861[2]; removed b889g9
|
||||
SCR_INT ApartmentEnterFlags;
|
||||
// SCR_VEC3 AvengerMissionStartPosition; removed b889g9
|
||||
SCR_INT UnkCutsceneState; // added b1158.13g9, used in fmmc_launcher
|
||||
};
|
||||
static_assert(sizeof(GPBD_FM_Entry) == 883 * 8);
|
||||
static_assert(sizeof(GPBD_FM_Entry) == 884 * 8);
|
||||
|
||||
struct GPBD_FM
|
||||
{
|
||||
@@ -696,4 +697,4 @@ struct GPBD_FM
|
||||
|
||||
static GPBD_FM* Get();
|
||||
};
|
||||
static_assert(sizeof(GPBD_FM) == 28257 * 8);
|
||||
static_assert(sizeof(GPBD_FM) == 28289 * 8);
|
||||
@@ -85,9 +85,9 @@ struct SALVAGE_YARD_VEHICLE_SALE_DATA
|
||||
{
|
||||
uint64_t PAD_0000[27];
|
||||
HOCW_DATA HOWCData; // 27
|
||||
uint64_t PAD_0043[9];
|
||||
uint64_t PAD_0043[115];
|
||||
};
|
||||
static_assert(sizeof(SALVAGE_YARD_VEHICLE_SALE_DATA) == 52 * 8);
|
||||
static_assert(sizeof(SALVAGE_YARD_VEHICLE_SALE_DATA) == 158 * 8);
|
||||
|
||||
struct GPBD_FM_2_Entry
|
||||
{
|
||||
@@ -125,9 +125,10 @@ struct GPBD_FM_2_Entry
|
||||
GANGOPS_DATA GangopsData; // 43
|
||||
RANDOM_EVENTS_CLIENT_DATA RandomEventsClientData; // 82
|
||||
SALVAGE_YARD_VEHICLE_SALE_DATA SYVehSaleData; // 158 added b889g9
|
||||
uint64_t PAD_0210[105];
|
||||
SCR_INT GangopsFlowMissionProg; // 316
|
||||
SCR_ARRAY<uint64_t, 3> TrickOrTreatFlags; // 317 96-bit flag bitset for effects
|
||||
};
|
||||
static_assert(sizeof(GPBD_FM_2_Entry) == 315 * 8);
|
||||
static_assert(sizeof(GPBD_FM_2_Entry) == 321 * 8);
|
||||
|
||||
struct GPBD_FM_2
|
||||
{
|
||||
@@ -135,4 +136,4 @@ struct GPBD_FM_2
|
||||
|
||||
static GPBD_FM_2* Get();
|
||||
};
|
||||
static_assert(sizeof(GPBD_FM_2) == 10081 * 8);
|
||||
static_assert(sizeof(GPBD_FM_2) == 10273 * 8);
|
||||
@@ -57,8 +57,9 @@ struct RANDOM_EVENTS_TARGET_DATA
|
||||
{
|
||||
PLAYER_INDEX PhantomCarTarget; // 0
|
||||
PLAYER_INDEX XMASMuggerTarget; // 1
|
||||
PLAYER_INDEX CommunityOutreachTarget; // 2
|
||||
};
|
||||
static_assert(sizeof(RANDOM_EVENTS_TARGET_DATA) == 2 * 8);
|
||||
static_assert(sizeof(RANDOM_EVENTS_TARGET_DATA) == 3 * 8);
|
||||
|
||||
struct GSBD_RandomEvents
|
||||
{
|
||||
@@ -69,4 +70,4 @@ struct GSBD_RandomEvents
|
||||
|
||||
static GSBD_RandomEvents* Get();
|
||||
};
|
||||
static_assert(sizeof(GSBD_RandomEvents) == 366 * 8);
|
||||
static_assert(sizeof(GSBD_RandomEvents) == 367 * 8);
|
||||
@@ -31,25 +31,25 @@
|
||||
return glb.As<str*>(); \
|
||||
}
|
||||
|
||||
DEFINE_GLOBAL_ACCESSOR(GlobalPlayerBD, 2658294);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_FM, 1845299);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_FM_2, 1882717);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_FM_3, 1892798);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_Flow, 1984461);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_Kicking, 1874069);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_MissionName, 1873556);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD, 2649162);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_BlockB, 2650426);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_FM, 1835559);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_FM_Events, 1922750);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_Kicking, 1877270);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_PropertyInstances, 1943919);
|
||||
DEFINE_GLOBAL_ACCESSOR(g_AMC_playerBD, 2700188);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_RandomEvents, 1882265);
|
||||
DEFINE_GLOBAL_ACCESSOR(MPSV, 1583772);
|
||||
DEFINE_GLOBAL_ACCESSOR(GlobalPlayerBD, 2658296);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_FM, 1845347);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_FM_2, 1882797);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_FM_3, 1893070);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_Flow, 1985024);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_Kicking, 1874149);
|
||||
DEFINE_GLOBAL_ACCESSOR(GPBD_MissionName, 1873636);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD, 2649164);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_BlockB, 2650428);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_FM, 1835603);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_FM_Events, 1923118);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_Kicking, 1877350);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_PropertyInstances, 1944313);
|
||||
DEFINE_GLOBAL_ACCESSOR(g_AMC_playerBD, 2700299);
|
||||
DEFINE_GLOBAL_ACCESSOR(GSBD_RandomEvents, 1882345);
|
||||
DEFINE_GLOBAL_ACCESSOR(MPSV, 1583778);
|
||||
DEFINE_GLOBAL_ACCESSOR(g_SavedMPGlobals, 2359296);
|
||||
DEFINE_GLOBAL_ACCESSOR(FreemodeGeneral, 2733138);
|
||||
DEFINE_GLOBAL_ACCESSOR(DailyObjectivesState, 1574745);
|
||||
DEFINE_GLOBAL_ACCESSOR(WeeklyChallenge, 2732069);
|
||||
DEFINE_GLOBAL_ACCESSOR(FreemodeDelivery, 1957402);
|
||||
DEFINE_GLOBAL_ACCESSOR(LauncherServerData, 2700002);
|
||||
DEFINE_GLOBAL_ACCESSOR(FreemodeGeneral, 2733326);
|
||||
DEFINE_GLOBAL_ACCESSOR(DailyObjectivesState, 1574746);
|
||||
DEFINE_GLOBAL_ACCESSOR(WeeklyChallenge, 2732247);
|
||||
DEFINE_GLOBAL_ACCESSOR(FreemodeDelivery, 1957909);
|
||||
DEFINE_GLOBAL_ACCESSOR(LauncherServerData, 2700113);
|
||||
@@ -16,12 +16,12 @@
|
||||
return lcl.As<str*>(); \
|
||||
}
|
||||
|
||||
DEFINE_LOCAL_ACCESSOR(VEHICLE_REWARD_DATA, 129);
|
||||
DEFINE_LOCAL_ACCESSOR(RANDOM_EVENTS_FREEMODE_DATA, 16162);
|
||||
DEFINE_LOCAL_ACCESSOR(StandardTimeTrialData, 14739);
|
||||
DEFINE_LOCAL_ACCESSOR(RCBanditoTimeTrialData, 14789);
|
||||
DEFINE_LOCAL_ACCESSOR(HSWTimeTrialData, 14833);
|
||||
DEFINE_LOCAL_ACCESSOR(BikeTimeTrialData, 15630);
|
||||
DEFINE_LOCAL_ACCESSOR(VEHICLE_REWARD_DATA, 148);
|
||||
DEFINE_LOCAL_ACCESSOR(RANDOM_EVENTS_FREEMODE_DATA, 16199);
|
||||
DEFINE_LOCAL_ACCESSOR(StandardTimeTrialData, 14774);
|
||||
DEFINE_LOCAL_ACCESSOR(RCBanditoTimeTrialData, 14824);
|
||||
DEFINE_LOCAL_ACCESSOR(HSWTimeTrialData, 14868);
|
||||
DEFINE_LOCAL_ACCESSOR(BikeTimeTrialData, 15667);
|
||||
|
||||
// am_launcher
|
||||
DEFINE_LOCAL_ACCESSOR(LauncherClientData, 247);
|
||||
DEFINE_LOCAL_ACCESSOR(LauncherClientData, 270);
|
||||
Reference in New Issue
Block a user