This commit is contained in:
maybegreat48
2025-05-17 21:26:41 -04:00
41 changed files with 662 additions and 92 deletions
+1
View File
@@ -1,2 +1,3 @@
build/
.cache
.vs
+2 -3
View File
@@ -33,9 +33,8 @@ message(STATUS "Setting up include directories.")
target_include_directories(${PROJECT_NAME} PRIVATE
"${SRC_DIR}"
"${imgui_SOURCE_DIR}"
"${minhook_SOURCE_DIR}/include"
"${minhook_SOURCE_DIR}/src/hde"
"${gtav_classes_SOURCE_DIR}"
"${minhook_SOURCE_DIR}/include"
"${minhook_SOURCE_DIR}/src/hde"
)
message(STATUS "Setting up linked libraries")
+6 -5
View File
@@ -8,11 +8,8 @@ if(USE_GCC OR USE_CLANG)
set(TOOLCHAIN_PREFIX "x86_64-w64-mingw32" CACHE STRING "Set toolchain. Default: x86_64-w64-mingw32")
message(STATUS "Using ${TOOLCHAIN_PREFIX} toolchain")
set(CMAKE_FIND_ROOT_PATH /usr/x86_64-w64-mingw32)
set(CMAKE_SYSTEM_NAME "Windows")
set(CMAKE_ASM_MASM_COMPILER "uasm")
set(CMAKE_C_COMPILER_TARGET x86_64-windows-gnu)
set(CMAKE_CXX_COMPILER_TARGET x86_64-windows-gnu)
set(CMAKE_Fortran_COMPILER ${TOOLCHAIN_PREFIX}-gfortran)
set(CMAKE_RC_COMPILER ${TOOLCHAIN_PREFIX}-windres)
@@ -30,16 +27,20 @@ if(USE_GCC OR USE_CLANG)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-fpermissive;-fno-rtti${CXX_FLAGS}>")
set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc)
set(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}-g++)
set(CMAKE_C_COMPILER_TARGET x86_64-windows-gnu)
set(CMAKE_CXX_COMPILER_TARGET x86_64-windows-gnu)
endif()
if(USE_CLANG)
message(STATUS "Using clang compiler.")
set(CMAKE_C_COMPILER clang)
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_C_COMPILER_TARGET x86_64-windows-msvc)
set(CMAKE_CXX_COMPILER_TARGET x86_64-windows-msvc)
# Disable RTTI to work around libstdc++ issue https://stackoverflow.com/a/77025827
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-fuse-ld=lld;-femulated-tls;-fno-rtti${CXX_FLAGS}>")
add_link_options(-fuse-ld=lld -femulated-tls -fno-rtti)
add_compile_options("$<$<COMPILE_LANGUAGE:CXX>:-fuse-ld=lld;-fno-rtti${CXX_FLAGS}>")
add_link_options(-fuse-ld=lld -fno-rtti)
endif()
endif()
+1 -1
View File
@@ -1,6 +1,6 @@
include(FetchContent)
message(STATUS "Setting up nlohmann::json")
FetchContent_Declare(json GIT_REPOSITORY "https://github.com/nlohmann/json/" GIT_TAG v3.11.2 GIT_SHALLOW TRUE)
FetchContent_Declare(json GIT_REPOSITORY "https://github.com/nlohmann/json/" GIT_TAG v3.12.0 GIT_SHALLOW TRUE)
option(JSON_MultipleHeaders "Disable nlohmann JSON multi header default." OFF)
FetchContent_MakeAvailable(json)
+1 -1
View File
@@ -6,7 +6,7 @@ message(STATUS "Setting up ${LIB_NAME}")
FetchContent_Declare(
${LIB_NAME}
GIT_REPOSITORY https://github.com/TsudaKageyu/minhook.git
GIT_TAG 98b74f1fc12d00313d91f10450e5b3e0036175e3
GIT_TAG 2b003bb063d66f016cc1aef7d63951350ce60f35
GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable(${LIB_NAME})
+1 -1
View File
@@ -57,7 +57,7 @@ namespace YimMenu
template<typename T>
T GetOriginal()
{
return static_cast<T>(m_OriginalFunction);
return reinterpret_cast<T>(m_OriginalFunction);
}
};
+2
View File
@@ -35,6 +35,8 @@ namespace YimMenu
BaseHook::Add<Hooks::Spoofing::WriteNetArrayData>(new DetourHook("WriteNetArrayData", Pointers.WriteNetArrayData, Hooks::Spoofing::WriteNetArrayData));
BaseHook::Add<Hooks::Spoofing::WriteNodeData>(new DetourHook("WriteNodeData", Pointers.WriteNodeData, Hooks::Spoofing::WriteNodeData));
BaseHook::Add<Hooks::Spoofing::WriteSyncTree>(new DetourHook("WriteSyncTree", Pointers.WriteSyncTree, Hooks::Spoofing::WriteSyncTree));
BaseHook::Add<Hooks::Features::OpenPauseMenu>(new DetourHook("OpenPauseMenu", Pointers.OpenPauseMenu, Hooks::Features::OpenPauseMenu));
}
Hooking::~Hooking()
+31
View File
@@ -6,6 +6,11 @@
#include "game/backend/NativeHooks.hpp"
#include "game/gta/Natives.hpp"
using FnGetVersion = int(*)();
using FnLocalSaves = bool(*)();
using FnBattlEyeBypass = bool(*)();
namespace YimMenu
{
static bool CheckForFSL()
@@ -43,6 +48,32 @@ namespace YimMenu
LOGF(VERBOSE, "Anticheat bypass mode: {}", mode);
if (m_IsFSLLoaded)
{
HMODULE hFSL = GetModuleHandleA("WINMM.dll");
if (hFSL)
{
auto LawnchairGetVersion = reinterpret_cast<FnGetVersion>(GetProcAddress(hFSL, "LawnchairGetVersion"));
auto LawnchairIsProvidingLocalSaves = reinterpret_cast<FnLocalSaves>(GetProcAddress(hFSL, "LawnchairIsProvidingLocalSaves"));
auto LawnchairIsProvidingBattlEyeBypass = reinterpret_cast<FnBattlEyeBypass>(GetProcAddress(hFSL, "LawnchairIsProvidingBattlEyeBypass"));
if (LawnchairGetVersion && LawnchairIsProvidingLocalSaves && LawnchairIsProvidingBattlEyeBypass)
{
m_FSLVersion = LawnchairGetVersion();
m_ProvidesLocalSaves = LawnchairIsProvidingLocalSaves();
m_ProvidesBEBYPASS = LawnchairIsProvidingBattlEyeBypass();
LOGF(VERBOSE, "FSL Version: {}", m_FSLVersion);
LOGF(VERBOSE, "FSL Local Saves: {}", m_ProvidesLocalSaves ? "Enabled" : "Disabled");
LOGF(VERBOSE, "FSL BE Bypass: {}", m_ProvidesBEBYPASS ? "Enabled" : "Disabled");
}
else
{
LOGF(WARNING, "FSL detected but required exports were missing.");
}
}
}
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");
+18
View File
@@ -15,6 +15,9 @@ namespace YimMenu
bool m_IsFSLLoaded = false;
bool m_BattlEyeRunning = false;
int m_FSLVersion = -1;
bool m_ProvidesLocalSaves = false;
bool m_ProvidesBEBYPASS = false;
public:
static void RunScript()
@@ -32,5 +35,20 @@ namespace YimMenu
{
return GetInstance().m_BattlEyeRunning;
}
static int GetFSLVersion()
{
return GetInstance().m_FSLVersion;
}
static bool ProvidesLocalSaves()
{
return GetInstance().m_ProvidesLocalSaves;
}
static bool ProvidesBattlEyeBypass()
{
return GetInstance().m_ProvidesBEBYPASS;
}
};
}
+35
View File
@@ -0,0 +1,35 @@
#include "core/commands/BoolCommand.hpp"
#include "core/hooking/DetourHook.hpp"
#include "game/hooks/Hooks.hpp"
#include "game/pointers/Pointers.hpp"
namespace YimMenu::Features
{
class PauseGame : public BoolCommand
{
using BoolCommand::BoolCommand;
virtual void OnEnable() override
{
Pointers.AllowPausingInSessionPatch->Apply();
}
virtual void OnDisable() override
{
Pointers.AllowPausingInSessionPatch->Restore();
}
};
static PauseGame _PauseGame{"pausegame", "Pause Game", "Allows you to pause the game in online (local only)."};
}
namespace YimMenu::Hooks
{
void Features::OpenPauseMenu(uint32_t menuHash, bool pause, uint32_t unk1, bool unk2)
{
if (YimMenu::Features::_PauseGame.GetState() && menuHash == 0xBA33ADB3)
pause = true;
BaseHook::Get<Features::OpenPauseMenu, DetourHook<decltype(&Features::OpenPauseMenu)>>()->Original()(menuHash, pause, unk1, unk2);
}
}
@@ -0,0 +1,18 @@
#include "game/commands/PlayerCommand.hpp"
#include "game/backend/NativeHooks.hpp"
#include "game/gta/Natives.hpp"
namespace YimMenu::Features
{
class HostKick : public PlayerCommand
{
using PlayerCommand::PlayerCommand;
virtual void OnCall(Player player) override
{
NETWORK::NETWORK_SESSION_KICK_PLAYER(player.GetId());
}
};
static HostKick _HostKick{"HKick", "Host Kick", "Only available as host and the target is unblockable"};
}
@@ -43,8 +43,8 @@ namespace YimMenu::Features
*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;
*base.At(2, 27).At(8).At(2).As<int*>() = 1;
*base.At(3, 27).At(8).At(3).As<int*>() = 1;
}
};
@@ -80,46 +80,46 @@ namespace YimMenu::Features
virtual void OnCall() override
{
Stats::SetInt("MPX_H4CNF_TARGET", _CayoPericoHeistPrimaryTarget.GetState()); // Primary target
Stats::SetInt("MPX_H4LOOT_CASH_I", 2359448);
Stats::SetInt("MPX_H4LOOT_CASH_I_SCOPED", 2359448);
Stats::SetInt("MPX_H4LOOT_CASH_C", 0);
Stats::SetInt("MPX_H4LOOT_CASH_C_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_COKE_I", 4901222);
Stats::SetInt("MPX_H4LOOT_COKE_I_SCOPED", 4901222);
Stats::SetInt("MPX_H4LOOT_COKE_C", 0);
Stats::SetInt("MPX_H4LOOT_COKE_C_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_GOLD_I", 0);
Stats::SetInt("MPX_H4LOOT_GOLD_I_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_GOLD_C", 255);
Stats::SetInt("MPX_H4LOOT_GOLD_C_SCOPED", 255);
Stats::SetInt("MPX_H4LOOT_WEED_I", 0);
Stats::SetInt("MPX_H4LOOT_WEED_I_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_WEED_C", 0);
Stats::SetInt("MPX_H4LOOT_WEED_C_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_PAINT", 127);
Stats::SetInt("MPX_H4LOOT_PAINT_SCOPED", 127);
Stats::SetInt("MPX_H4LOOT_CASH_V", 599431);
Stats::SetInt("MPX_H4LOOT_COKE_V", 1198863);
Stats::SetInt("MPX_H4LOOT_GOLD_V", 1598484);
Stats::SetInt("MPX_H4LOOT_PAINT_V", 1198863);
Stats::SetInt("MPX_H4LOOT_WEED_V", 0);
Stats::SetInt("MPX_H4LOOT_CASH_I", 16711680);
Stats::SetInt("MPX_H4LOOT_CASH_I_SCOPED", 16711680);
Stats::SetInt("MPX_H4LOOT_CASH_C", 0);
Stats::SetInt("MPX_H4LOOT_CASH_C_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_COKE_I", 255);
Stats::SetInt("MPX_H4LOOT_COKE_I_SCOPED", 255);
Stats::SetInt("MPX_H4LOOT_COKE_C", 0);
Stats::SetInt("MPX_H4LOOT_COKE_C_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_GOLD_I", 0);
Stats::SetInt("MPX_H4LOOT_GOLD_I_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_GOLD_C", 255);
Stats::SetInt("MPX_H4LOOT_GOLD_C_SCOPED", 255);
Stats::SetInt("MPX_H4LOOT_WEED_I", 65280);
Stats::SetInt("MPX_H4LOOT_WEED_I_SCOPED", 65280);
Stats::SetInt("MPX_H4LOOT_WEED_C", 0);
Stats::SetInt("MPX_H4LOOT_WEED_C_SCOPED", 0);
Stats::SetInt("MPX_H4LOOT_PAINT", 127);
Stats::SetInt("MPX_H4LOOT_PAINT_SCOPED", 127);
Stats::SetInt("MPX_H4LOOT_CASH_V", 83250);
Stats::SetInt("MPX_H4LOOT_COKE_V", 202500);
Stats::SetInt("MPX_H4LOOT_GOLD_V", 333333);
Stats::SetInt("MPX_H4LOOT_WEED_V", 135000);
Stats::SetInt("MPX_H4LOOT_PAINT_V", 180000);
Stats::SetInt("MPX_H4_PROGRESS", _CayoPericoHeistDifficulty.GetState()); // Difficulty
Stats::SetInt("MPX_H4CNF_BS_GEN", 262143);
Stats::SetInt("MPX_H4CNF_BS_ENTR", 63);
Stats::SetInt("MPX_H4CNF_BS_ABIL", 63);
Stats::SetInt("MPX_H4CNF_WEP_DISRP", 3);
Stats::SetInt("MPX_H4CNF_ARM_DISRP", 3);
Stats::SetInt("MPX_H4CNF_HEL_DISRP", 3);
Stats::SetInt("MPX_H4CNF_APPROACH", -1);
Stats::SetInt("MPX_H4CNF_BOLTCUT", 4424);
Stats::SetInt("MPX_H4CNF_UNIFORM", 5256);
Stats::SetInt("MPX_H4CNF_GRAPPEL", 5156);
Stats::SetInt("MPX_H4_MISSIONS", -1);
Stats::SetInt("MPX_H4CNF_BS_GEN", 262143);
Stats::SetInt("MPX_H4CNF_BS_ENTR", 63);
Stats::SetInt("MPX_H4CNF_BS_ABIL", 63);
Stats::SetInt("MPX_H4CNF_WEP_DISRP", 3);
Stats::SetInt("MPX_H4CNF_ARM_DISRP", 3);
Stats::SetInt("MPX_H4CNF_HEL_DISRP", 3);
Stats::SetInt("MPX_H4CNF_APPROACH", -1);
Stats::SetInt("MPX_H4CNF_BOLTCUT", 4424);
Stats::SetInt("MPX_H4CNF_UNIFORM", 5256);
Stats::SetInt("MPX_H4CNF_GRAPPEL", 5156);
Stats::SetInt("MPX_H4_MISSIONS", -1);
Stats::SetInt("MPX_H4CNF_WEAPONS", _CayoPericoHeistWeapon.GetState()); // Weapon
Stats::SetInt("MPX_H4CNF_TROJAN", 5);
Stats::SetInt("MPX_H4CNF_TROJAN", 5);
Stats::SetInt("MPX_H4_PLAYTHROUGH_STATUS", 100);
ScriptMgr::Yield(500ms);
ScriptMgr::Yield(500ms);
*ScriptLocal("heist_island_planning"_J, 1566).As<int*>() = 2;
}
@@ -42,8 +42,8 @@ namespace YimMenu::Features
*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;
*base.At(2, 68).At(8).At(2).As<int*>() = 1;
*base.At(3, 68).At(8).At(3).As<int*>() = 1;
}
};
@@ -66,9 +66,9 @@ namespace YimMenu::Features
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, "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"}},
@@ -81,17 +81,17 @@ namespace YimMenu::Features
{{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, "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, "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, ""}},
{{0, ""}, {1, ""}}
}
@@ -152,7 +152,7 @@ namespace YimMenu::Features
{{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, ""}}
{{0, " "}, {1, ""}, {2, ""}, {3, ""}}
};
static ListCommand _DiamondCasinoHeistVehicle{"diamondcasinoheistvehicle", "Vehicle", "Vehicle", diamondCasinoHeistVehicle[5], 0};
@@ -179,11 +179,11 @@ namespace YimMenu::Features
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"}
{5, "Paige Harris"},
{2, "Christian Feltz"},
{3, "Yohan Blair"},
{1, "Rickie Lukens"},
{6, "Remove Hacker"}
};
static ListCommand _DiamondCasinoHeistHacker{"diamondcasinoheisthacker", "Hacker", "Hacker", diamondCasinoHeistHacker, 6};
@@ -242,7 +242,7 @@ namespace YimMenu::Features
Stats::SetInt("MPX_H3OPT_BITSET0", rand() % (INT_MAX)); // Refresh board
Stats::SetInt("MPX_H3OPT_BITSET1", rand() % (INT_MAX)); // Refresh board
ScriptMgr::Yield(500ms);
ScriptMgr::Yield(500ms);
Stats::SetInt("MPX_H3OPT_BITSET0", -1); // Refresh board
Stats::SetInt("MPX_H3OPT_BITSET1", -1); // Refresh board
@@ -40,7 +40,7 @@ namespace YimMenu::Features
*base.At(0, 149).At(43).At(0).At(4).At(8).As<int*>() = 1;
*base.At(1, 149).At(43).At(1).At(4).At(8).As<int*>() = 1;
*base.At(2, 149).At(43).At(2).At(4).At(8).As<int*>() = 1;
*base.At(2, 149).At(43).At(2).At(4).At(8).As<int*>() = 1;
*base.At(3, 149).At(43).At(3).At(4).At(8).As<int*>() = 1;
}
};
+32
View File
@@ -20,5 +20,37 @@ namespace YimMenu::Features
}
};
class AimbotAimForHead : BoolCommand
{
using BoolCommand::BoolCommand;
virtual void OnEnable() override
{
Pointers.GetLockOnPosPatch->Apply();
}
virtual void OnDisable() override
{
Pointers.GetLockOnPosPatch->Restore();
}
};
class AimbotTargetDrivers : BoolCommand
{
using BoolCommand::BoolCommand;
virtual void OnEnable() override
{
Pointers.ShouldAllowDriverLockOnPatch->Apply();
}
virtual void OnDisable() override
{
Pointers.ShouldAllowDriverLockOnPatch->Restore();
}
};
static Aimbot _Aimbot{"aimbot", "Aimbot", "Locks on to enemies and other players"};
static AimbotAimForHead _AimbotAimForHead{"aimbotaimforhead", "Aim For Head", "Targets the head when locking on to enemies and other players"};
static AimbotTargetDrivers _AimbotTargetDrivers{"aimbottargetdrivers", "Target Drivers", "Allows aimbot to lock on to enemies and other players in vehicles"};
}
+21
View File
@@ -0,0 +1,21 @@
#include "core/commands/LoopedCommand.hpp"
#include "game/backend/Self.hpp"
#include "game/gta/Pools.hpp"
#include <game/gta/Natives.hpp>
namespace YimMenu::Features
{
class ExplosiveAmmo : public LoopedCommand
{
using LoopedCommand::LoopedCommand;
virtual void OnTick() override
{
MISC::SET_EXPLOSIVE_AMMO_THIS_FRAME(Self::GetPlayer().GetId());
}
};
static ExplosiveAmmo _ExplosiveAmmo{"ExplosiveAmmo", "Explosive Ammo", "Every bullet you shoot explodes."};
}
+2 -2
View File
@@ -19,12 +19,12 @@ namespace YimMenu::Features
{
if (!formatIntCaller1Hook)
{
formatIntCaller1Hook = CallSiteHook::AddHook(Pointers.FormatIntCaller1, FormatIntHook);
formatIntCaller1Hook = CallSiteHook::AddHook(Pointers.FormatIntCaller1, reinterpret_cast<void*>(FormatIntHook));
}
formatIntCaller1Hook->Enable();
if (!formatIntCaller2Hook)
{
formatIntCaller2Hook = CallSiteHook::AddHook(Pointers.FormatIntCaller2, FormatIntHook);
formatIntCaller2Hook = CallSiteHook::AddHook(Pointers.FormatIntCaller2, reinterpret_cast<void*>(FormatIntHook));
}
formatIntCaller2Hook->Enable();
NativeHooks::AddHook("shop_controller"_J, NativeIndex::SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT, &ScaleformAddIntHook);
@@ -0,0 +1,20 @@
#include "core/commands/LoopedCommand.hpp"
#include "game/backend/Self.hpp"
namespace YimMenu::Features
{
class KeepPlayerClean : public LoopedCommand
{
using LoopedCommand::LoopedCommand;
virtual void OnTick() override
{
if (!Self::GetPed())
return;
Self::GetPed().ClearDamage();
}
};
static KeepPlayerClean _KeepPlayerClean{"keepplayerclean", "Keep Player Clean", "Keeps the player clean from any blood, dirt, water."};
}
@@ -0,0 +1,18 @@
#include "core/commands/Command.hpp"
#include "game/backend/Self.hpp"
#include <game/gta/Natives.hpp>
namespace YimMenu::Features
{
class SkipConversation : Command
{
using Command::Command;
virtual void OnCall() override
{
AUDIO::SKIP_TO_NEXT_SCRIPTED_CONVERSATION_LINE();
}
};
static SkipConversation _SkipConversation{"skipconversation", "Skip Conversation", "Skips current conversation in the phone."};
}
+25
View File
@@ -0,0 +1,25 @@
#include "core/commands/LoopedCommand.hpp"
#include "game/backend/Self.hpp"
#include "game/gta/Pools.hpp"
#include <game/gta/Natives.hpp>
namespace YimMenu::Features
{
class CopsDispatch : public LoopedCommand
{
using LoopedCommand::LoopedCommand;
virtual void OnTick() override
{
PLAYER::SET_DISPATCH_COPS_FOR_PLAYER(Self::GetPlayer().GetId(), FALSE);
}
virtual void OnDisable() override
{
PLAYER::SET_DISPATCH_COPS_FOR_PLAYER(Self::GetPlayer().GetId(), TRUE);
}
};
static CopsDispatch _CopsDispatch{"CopsDispatch", "Cops Dispatch", "When you are wanted, no police will be spawned."};
}
+30
View File
@@ -0,0 +1,30 @@
#include "core/commands/LoopedCommand.hpp"
#include "game/gta/Pools.hpp"
#include "game/backend/Self.hpp"
#include <game/gta/Natives.hpp>
namespace YimMenu::Features
{
class PedIgnore : public LoopedCommand
{
using LoopedCommand::LoopedCommand;
virtual void OnTick() override
{
PLAYER::SET_EVERYONE_IGNORE_PLAYER(Self::GetPlayer().GetId(), TRUE);
PLAYER::SET_POLICE_IGNORE_PLAYER(Self::GetPlayer().GetId(), TRUE);
PED::SET_BLOCKING_OF_NON_TEMPORARY_EVENTS_FOR_AMBIENT_PEDS_THIS_FRAME(TRUE);
PED::SET_PED_RESET_FLAG(Self::GetPed().GetHandle(), 124, true);
}
virtual void OnDisable() override
{
PLAYER::SET_EVERYONE_IGNORE_PLAYER(Self::GetPlayer().GetId(), FALSE);
PLAYER::SET_POLICE_IGNORE_PLAYER(Self::GetPlayer().GetId(), FALSE);
}
};
static PedIgnore _PedIgnore{"pedsignore", "Peds Ignore", "Nearby peds will ignore you and become oblivious to your actions."};
}
+25
View File
@@ -0,0 +1,25 @@
#include "core/commands/LoopedCommand.hpp"
#include "game/backend/Self.hpp"
#include "game/gta/Pools.hpp"
#include <game/gta/Natives.hpp>
namespace YimMenu::Features
{
class PedRiotMode : public LoopedCommand
{
using LoopedCommand::LoopedCommand;
virtual void OnTick() override
{
MISC::SET_RIOT_MODE_ENABLED(TRUE);
}
virtual void OnDisable() override
{
MISC::SET_RIOT_MODE_ENABLED(FALSE);
}
};
static PedRiotMode _PedRiotMode{"PedRiotMode", "Riot Mode", "All PEDs attack each other."};
}
+2 -1
View File
@@ -4,7 +4,7 @@
#include "game/frontend/items/Items.hpp"
#include "game/frontend/submenus/Network/SavedPlayers.hpp"
#include "game/gta/Network.hpp"
#include "game/frontend/submenus/Network/RandomEvents.hpp"
#include "game/frontend/submenus/network/RandomEvents.hpp"
namespace YimMenu::Submenus
{
@@ -79,6 +79,7 @@ namespace YimMenu::Submenus
enhancements->AddItem(std::make_shared<BoolCommandItem>("despawnbypass"_J)); // move this somewhere else?
enhancements->AddItem(std::make_shared<BoolCommandItem>("bypasscasinogeoblock"_J));
enhancements->AddItem(std::make_shared<BoolCommandItem>("forcescripthost"_J));
enhancements->AddItem(std::make_shared<BoolCommandItem>("pausegame"_J));
session->AddItem(joinGroup);
session->AddItem(bountyGroup);
+232
View File
@@ -0,0 +1,232 @@
#include "OutfitEditor.hpp"
#include "core/frontend/manager/UIManager.hpp"
#include "game/backend/Self.hpp"
#include "game/frontend/items/Items.hpp"
#include "game/gta/Natives.hpp"
#include "imgui.h"
#include <format>
#include <random>
namespace YimMenu
{
int GetMaxDrawable(int slot)
{
auto ped = Self::GetPed();
return PED::GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(static_cast<int>(ped.GetHandle()), slot);
}
int GetMaxTexture(int slot, int drawable)
{
auto ped = Self::GetPed();
return PED::GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(static_cast<int>(ped.GetHandle()), slot, drawable);
}
int GetMaxPropDrawable(int slot)
{
auto ped = Self::GetPed();
return PED::GET_NUMBER_OF_PED_PROP_DRAWABLE_VARIATIONS(static_cast<int>(ped.GetHandle()), slot);
}
int GetMaxPropTexture(int slot, int drawable)
{
auto ped = Self::GetPed();
return PED::GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(static_cast<int>(ped.GetHandle()), slot, drawable);
}
void GetOutfitSlot(int slot, int& drawable, int& texture)
{
auto ped = Self::GetPed();
drawable = PED::GET_PED_DRAWABLE_VARIATION(static_cast<int>(ped.GetHandle()), slot);
texture = PED::GET_PED_TEXTURE_VARIATION(static_cast<int>(ped.GetHandle()), slot);
}
void GetPropSlot(int slot, int& drawable, int& texture)
{
auto ped = Self::GetPed();
drawable = PED::GET_PED_PROP_INDEX(static_cast<int>(ped.GetHandle()), slot, 0);
if (drawable == -1)
{
drawable = 0;
texture = 0;
return;
}
texture = PED::GET_PED_PROP_TEXTURE_INDEX(static_cast<int>(ped.GetHandle()), slot);
}
void SetOutfitSlot(int slot, int drawable, int texture)
{
auto ped = Self::GetPed();
if (!ENTITY::DOES_ENTITY_EXIST(static_cast<int>(ped.GetHandle())))
return;
int maxDrawable = GetMaxDrawable(slot);
int maxTexture = GetMaxTexture(slot, drawable);
if (drawable < 0 || drawable >= maxDrawable || texture < 0 || texture >= maxTexture)
return;
PED::SET_PED_COMPONENT_VARIATION(static_cast<int>(ped.GetHandle()), slot, drawable, texture, 0);
}
void SetPropSlot(int slot, int drawable, int texture)
{
auto ped = Self::GetPed();
if (!ENTITY::DOES_ENTITY_EXIST(static_cast<int>(ped.GetHandle())))
return;
int maxDrawable = GetMaxPropDrawable(slot);
int maxTexture = GetMaxPropTexture(slot, drawable);
if (drawable < 0 || drawable >= maxDrawable || texture < 0 || texture >= maxTexture)
return;
PED::SET_PED_PROP_INDEX(static_cast<int>(ped.GetHandle()), slot, drawable, texture, true, 0);
}
// Helper function for underlined text
static void TextUnderlined(const char* text)
{
ImGui::Text("%s", text);
ImVec2 min = ImGui::GetItemRectMin();
ImVec2 max = ImGui::GetItemRectMax();
min.y = max.y;
ImGui::GetWindowDrawList()->AddLine(min, max, ImGui::GetColorU32(ImGui::GetStyle().Colors[ImGuiCol_Text]));
}
std::shared_ptr<Category> CreateOutfitsMenu()
{
auto category = std::make_shared<Category>("Outfit Editor");
category->AddItem(std::make_shared<ImGuiItem>([] {
auto ped = Self::GetPed();
if (!ENTITY::DOES_ENTITY_EXIST(static_cast<int>(ped.GetHandle())))
{
ImGui::TextDisabled("Error: Player not found");
return;
}
if (ImGui::Button("Randomize Outfit"))
{
std::random_device rd;
std::mt19937 gen(rd());
// Randomize components
for (int i = 0; i < 12; ++i)
{
int maxDrawable = GetMaxDrawable(i);
if (maxDrawable > 0)
{
int drawable = std::uniform_int_distribution<>(0, maxDrawable - 1)(gen);
int maxTexture = GetMaxTexture(i, drawable);
int texture = maxTexture > 0 ? std::uniform_int_distribution<>(0, maxTexture - 1)(gen) : 0;
SetOutfitSlot(i, drawable, texture);
}
}
// Randomize props
for (int i : {0, 1, 2, 6, 7})
{
int maxDrawable = GetMaxPropDrawable(i);
if (maxDrawable > 0)
{
int drawable = std::uniform_int_distribution<>(0, maxDrawable - 1)(gen);
int maxTexture = GetMaxPropTexture(i, drawable);
int texture = maxTexture > 0 ? std::uniform_int_distribution<>(0, maxTexture - 1)(gen) : 0;
SetPropSlot(i, drawable, texture);
}
}
}
// Create two columns layout
const float windowWidth = ImGui::GetContentRegionAvail().x;
const float columnWidth = windowWidth * 0.5f;
const float inputWidth = 80.0f; // Minimal width for number input
ImGui::Columns(2, "OutfitColumns", false);
ImGui::SetColumnWidth(0, columnWidth);
// Components section (Left column)
TextUnderlined("Components");
ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 1.0f, 1.0f, 1.0f)); // White text color
const struct
{
const char* name;
int slot;
} componentSlots[] = {{"Top", 11}, {"Undershirt", 8}, {"Legs", 4}, {"Feet", 6}, {"Accessories", 7}, {"Bags", 5}, {"Mask", 1}, {"Gloves", 3}, {"Decals", 10}, {"Armor", 9}};
for (const auto& component : componentSlots)
{
int drawable, texture;
GetOutfitSlot(component.slot, drawable, texture);
ImGui::Text("%s", component.name);
ImGui::SameLine();
ImGui::SetCursorPosX(columnWidth - inputWidth * 2 - 10);
ImGui::PushItemWidth(inputWidth);
if (ImGui::InputInt(std::format("##{}Drawable", component.name).c_str(), &drawable, 0, 0))
{
drawable = std::clamp(drawable, 0, GetMaxDrawable(component.slot) - 1);
SetOutfitSlot(component.slot, drawable, texture);
}
ImGui::SameLine();
ImGui::PushItemWidth(inputWidth);
if (ImGui::InputInt(std::format("##{}Texture", component.name).c_str(), &texture, 0, 0))
{
texture = std::clamp(texture, 0, GetMaxTexture(component.slot, drawable) - 1);
SetOutfitSlot(component.slot, drawable, texture);
}
ImGui::PopItemWidth();
ImGui::PopItemWidth();
}
// Props section (Right column)
ImGui::NextColumn();
TextUnderlined("Props");
const struct
{
const char* name;
int slot;
} propSlots[] = {{"Hats", 0}, {"Glasses", 1}, {"Ears", 2}, {"Watches", 6}};
for (const auto& prop : propSlots)
{
int drawable, texture;
GetPropSlot(prop.slot, drawable, texture);
ImGui::Text("%s", prop.name);
ImGui::SameLine();
ImGui::SetCursorPosX(columnWidth + (columnWidth - inputWidth * 2 - 10));
ImGui::PushItemWidth(inputWidth);
if (ImGui::InputInt(std::format("##{}Drawable", prop.name).c_str(), &drawable, 0, 0))
{
drawable = std::clamp(drawable, 0, GetMaxPropDrawable(prop.slot) - 1);
SetPropSlot(prop.slot, drawable, texture);
}
ImGui::SameLine();
ImGui::PushItemWidth(inputWidth);
if (ImGui::InputInt(std::format("##{}Texture", prop.name).c_str(), &texture, 0, 0))
{
texture = std::clamp(texture, 0, GetMaxPropTexture(prop.slot, drawable) - 1);
SetPropSlot(prop.slot, drawable, texture);
}
ImGui::PopItemWidth();
ImGui::PopItemWidth();
}
ImGui::PopStyleColor();
ImGui::Columns(1);
}));
return category;
}
}
@@ -0,0 +1,7 @@
#pragma once
#include "core/frontend/manager/Category.hpp"
namespace YimMenu
{
std::shared_ptr<Category> CreateOutfitsMenu();
}
@@ -7,6 +7,7 @@ namespace YimMenu::Submenus
auto menu = std::make_shared<Category>("Kick");
auto kicks = std::make_shared<Group>("Kicks");
kicks->AddItem(std::make_shared<PlayerCommandItem>("hkick"_J));
kicks->AddItem(std::make_shared<PlayerCommandItem>("shkick"_J));
kicks->AddItem(std::make_shared<PlayerCommandItem>("endkick"_J));
kicks->AddItem(std::make_shared<PlayerCommandItem>("nfkick"_J));
@@ -27,12 +27,12 @@ namespace YimMenu::Submenus
loots->AddItem(std::make_shared<ImGuiItem>([] {
ImGui::SameLine();
}));
loots->AddItem(std::make_shared<CommandItem>("cayopericoheistsetprimarytargetvalue"_J));
loots->AddItem(std::make_shared<CommandItem>("cayopericoheistsetprimarytargetvalue"_J, "Set##primarytargetvalue"));
loots->AddItem(std::make_shared<IntCommandItem>("cayopericoheistsecondarytakevalue"_J));
loots->AddItem(std::make_shared<ImGuiItem>([] {
ImGui::SameLine();
}));
loots->AddItem(std::make_shared<CommandItem>("cayopericoheistsetsecondarytakevalue"_J));
loots->AddItem(std::make_shared<CommandItem>("cayopericoheistsetsecondarytakevalue"_J, "Set##secondarytakevalue"));
misc->AddItem(std::make_shared<CommandItem>("cayopericoheistskiphacking"_J));
misc->AddItem(std::make_shared<CommandItem>("cayopericoheistcutsewer"_J));
@@ -39,12 +39,12 @@ namespace YimMenu::Submenus
loots->AddItem(std::make_shared<ImGuiItem>([] {
ImGui::SameLine();
}));
loots->AddItem(std::make_shared<CommandItem>("diamondcasinoheistsetpotentialtake"_J));
loots->AddItem(std::make_shared<CommandItem>("diamondcasinoheistsetpotentialtake"_J, "Set##potentialtake"));
loots->AddItem(std::make_shared<IntCommandItem>("diamondcasinoheistactualtake"_J));
loots->AddItem(std::make_shared<ImGuiItem>([] {
ImGui::SameLine();
}));
loots->AddItem(std::make_shared<CommandItem>("diamondcasinoheistsetactualtake"_J));
loots->AddItem(std::make_shared<CommandItem>("diamondcasinoheistsetactualtake"_J, "Set##actualtake"));
misc->AddItem(std::make_shared<CommandItem>("diamondcasinoheistskiphacking"_J));
misc->AddItem(std::make_shared<CommandItem>("diamondcasinoheistskipdrilling"_J));
+14 -2
View File
@@ -2,6 +2,7 @@
#include "core/util/Joaat.hpp"
#include "game/frontend/items/Items.hpp"
#include "OutfitEditor.hpp"
namespace YimMenu::Submenus
{
@@ -11,7 +12,7 @@ namespace YimMenu::Submenus
auto main = std::make_shared<Category>("Main");
auto globalsGroup = std::make_shared<Group>("Globals");
auto movementGroup = std::make_shared<Group>("Movement");
auto toolsGroup = std::make_shared<Group>("Tools", 1);
auto toolsGroup = std::make_shared<Group>("Tools", 2);
auto wantedGroup = std::make_shared<Group>("Wanted");
globalsGroup->AddItem(std::make_shared<BoolCommandItem>("godmode"_J));
@@ -23,8 +24,10 @@ namespace YimMenu::Submenus
globalsGroup->AddItem(std::make_shared<BoolCommandItem>("unlimitedoxygen"_J));
globalsGroup->AddItem(std::make_shared<BoolCommandItem>("formatmoney"_J));
globalsGroup->AddItem(std::make_shared<BoolCommandItem>("mobileradio"_J));
globalsGroup->AddItem(std::make_shared<BoolCommandItem>("keepplayerclean"_J));
toolsGroup->AddItem(std::make_shared<CommandItem>("skipcutscene"_J));
toolsGroup->AddItem(std::make_shared<CommandItem>("skipconversation"_J));
toolsGroup->AddItem(std::make_shared<CommandItem>("suicide"_J));
toolsGroup->AddItem(std::make_shared<CommandItem>("heal"_J));
toolsGroup->AddItem(std::make_shared<CommandItem>("cleardamage"_J));
@@ -58,15 +61,21 @@ namespace YimMenu::Submenus
auto weapons = std::make_shared<Category>("Weapons");
auto weaponsGlobalsGroup = std::make_shared<Group>("Globals");
auto weaponsAimbotGroup = std::make_shared<Group>("Aimbot", 1);
weaponsGlobalsGroup->AddItem(std::make_shared<BoolCommandItem>("infiniteammo"_J));
weaponsGlobalsGroup->AddItem(std::make_shared<BoolCommandItem>("infiniteclip"_J));
weaponsGlobalsGroup->AddItem(std::make_shared<BoolCommandItem>("rapidfire"_J));
weaponsGlobalsGroup->AddItem(std::make_shared<BoolCommandItem>("aimbot"_J));
weaponsGlobalsGroup->AddItem(std::make_shared<BoolCommandItem>("infiniteparachutes"_J));
weaponsGlobalsGroup->AddItem(std::make_shared<BoolCommandItem>("ExplosiveAmmo"_J));
weaponsGlobalsGroup->AddItem(std::make_shared<CommandItem>("giveallweapons"_J));
weaponsAimbotGroup->AddItem(std::make_shared<BoolCommandItem>("aimbot"_J));
weaponsAimbotGroup->AddItem(std::make_shared<ConditionalItem>("aimbot"_J, std::make_shared<BoolCommandItem>("aimbotaimforhead"_J)));
weaponsAimbotGroup->AddItem(std::make_shared<ConditionalItem>("aimbot"_J, std::make_shared<BoolCommandItem>("aimbottargetdrivers"_J)));
weapons->AddItem(weaponsGlobalsGroup);
weapons->AddItem(weaponsAimbotGroup);
AddCategory(std::move(weapons));
auto vehicle = std::make_shared<Category>("Vehicle");
@@ -88,5 +97,8 @@ namespace YimMenu::Submenus
vehicle->AddItem(vehicleGlobalsGroup);
vehicle->AddItem(vehicleMiscGroup);
AddCategory(std::move(vehicle));
auto outfitEditorCategory = YimMenu::CreateOutfitsMenu();
AddCategory(std::move(outfitEditorCategory));
}
}
+9
View File
@@ -27,10 +27,16 @@ namespace YimMenu::Submenus
weatherOpts->AddItem(std::make_shared<ConditionalItem>("forceweather"_J, std::make_shared<CommandItem>("setweather"_J), true));
weatherOpts->AddItem(std::make_shared<BoolCommandItem>("forceweather"_J));
auto otherOpts = std::make_shared<Group>("Other", 1);
otherOpts->AddItem(std::make_shared<BoolCommandItem>("pedsignore"_J));
otherOpts->AddItem(std::make_shared<BoolCommandItem>("PedRiotMode"_J));
otherOpts->AddItem(std::make_shared<BoolCommandItem>("CopsDispatch"_J));
main->AddItem(std::move(killPeds));
main->AddItem(std::move(deleteOpts));
main->AddItem(std::move(bringOpts));
main->AddItem(std::move(weatherOpts));
main->AddItem(std::move(otherOpts));
auto spawnGroup = std::make_shared<Group>("Vehicle");
auto modsGroup = std::make_shared<Group>("Modifications");
@@ -52,6 +58,9 @@ namespace YimMenu::Submenus
iplsGroup->AddItem(std::make_shared<CommandItem>("unloadipl"_J));
iplsGroup->AddItem(std::make_shared<CommandItem>("ipltp"_J));
AddCategory(std::move(main));
AddCategory(std::move(spawnersGroup));
AddCategory(std::move(iplsGroup));
+1 -1
View File
@@ -159,7 +159,7 @@ namespace YimMenu
ENTITY_ASSERT_VALID();
ENTITY_ASSERT_CONTROL();
WEAPON::SET_PED_INFINITE_AMMO(GetHandle(), infinite, NULL);
WEAPON::SET_PED_INFINITE_AMMO(GetHandle(), infinite, 0);
}
void Ped::SetInfiniteClip(bool infinite)
+1 -1
View File
@@ -3,7 +3,7 @@
#include <type_traits>
#include <types/script/scrThread.hpp>
#include <core/util/Joaat.hpp>
#include <src/game/gta/Scripts.hpp>
#include <game/gta/Scripts.hpp>
namespace YimMenu
{
@@ -54,7 +54,6 @@ namespace YimMenu::Hooks
if (arx_score >= 2)
{
auto from_offset = *reinterpret_cast<std::uint64_t*>(_AddressOfReturnAddress()) - ModuleMgr.Get("GTA5_Enhanced.exe"_J)->Base();
return;
}
+5
View File
@@ -73,4 +73,9 @@ namespace YimMenu::Hooks
{
extern LRESULT WndProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam);
}
namespace Features
{
extern void OpenPauseMenu(uint32_t menuHash, bool pause, uint32_t unk1, bool unk2);
}
}
+27 -8
View File
@@ -184,7 +184,7 @@ namespace YimMenu
constexpr auto worldModelSpawnBypassPtrn = Pattern<"4C 8B 2C 01 4D 85 ED 0F 84 ? ? ? ?">("WorldModelSpawnBypass");
scanner.Add(worldModelSpawnBypassPtrn, [this](PointerCalculator ptr) {
WorldModelSpawnBypass = BytePatches::Add(ptr.Add(4).As<void*>(), std::vector<std::uint8_t>{0xEB, 0x12, 0x90});
WorldModelSpawnBypass = BytePatches::Add(ptr.Add(4).As<void*>(), std::to_array<std::uint8_t>({0xEB, 0x12, 0x90}));
});
constexpr auto receiveNetMessagePtrn = Pattern<"48 81 C1 00 03 00 00 4C 89 E2">("ReceiveNetMessage");
@@ -239,7 +239,7 @@ namespace YimMenu
constexpr auto netArrayCachedDataPatchPtrn = Pattern<"0F 84 64 FE FF FF FF">("NetArrayCachedDataPatch");
scanner.Add(netArrayCachedDataPatchPtrn, [this](PointerCalculator ptr) {
NetArrayCachedDataPatch = BytePatches::Add(ptr.As<void*>(), std::vector<std::uint8_t>{0xE9, 0x65, 0xFE, 0xFF, 0xFF, 0x90});
NetArrayCachedDataPatch = BytePatches::Add(ptr.As<void*>(), std::to_array<std::uint8_t>({0xE9, 0x65, 0xFE, 0xFF, 0xFF, 0x90}));
});
constexpr auto statsMgrPtrn = Pattern<"89 6C 24 28 48 8D 0D ? ? ? ? 48 8D">("CStatsMgr");
@@ -325,13 +325,32 @@ namespace YimMenu
constexpr auto shouldTargetEntityPatchPtrn = Pattern<"F6 80 A9 14 00 00 01">("ShouldNotTargetEntityPatch");
scanner.Add(shouldTargetEntityPatchPtrn, [this](PointerCalculator ptr) {
ShouldNotTargetEntityPatch = BytePatches::Add(ptr.Sub(0x53).As<void*>(), std::vector<std::uint8_t>{0xB0, 0x00, 0xC3});
ShouldNotTargetEntityPatch = BytePatches::Add(ptr.Sub(0x53).As<void*>(), std::to_array<std::uint8_t>({0xB0, 0x00, 0xC3}));
});
// TODO: this has been inlined a lot in Enhanced
constexpr auto getAssistedAimTypePatchPtrn = Pattern<"48 85 C0 74 15 8B 80 ? ? ? ? BE 03">("GetAssistedAimTypePatch");
constexpr auto getAssistedAimTypePatchPtrn = Pattern<"FF E0 48 8D 86">("GetAssistedAimTypePatch");
scanner.Add(getAssistedAimTypePatchPtrn, [this](PointerCalculator ptr) {
GetAssistedAimTypePatch = BytePatches::Add(ptr.Sub(0xE).As<void*>(), std::vector<std::uint8_t>{0xB0, 0x01, 0xC3});
GetAssistedAimTypePatch = BytePatches::Add(ptr.Sub(0x15).As<void*>(), std::to_array<std::uint8_t>({0xBD, 0x01, 0x00, 0x00, 0x00}));
});
constexpr auto getLockOnPosPatchPtrn = Pattern<"0F 29 74 24 ? 48 89 D6 48 89 CF 48 8B 05">("GetLockOnPosPatch");
scanner.Add(getLockOnPosPatchPtrn, [this](PointerCalculator ptr) {
GetLockOnPosPatch = BytePatches::Add(ptr.Add(0x22).As<std::uint8_t*>(), 0xEB);
});
constexpr auto shouldAllowDriverLockOnPatchPtrn = Pattern<"75 ? 45 89 C7 49 89 CE">("ShouldAllowDriverLockOnPatch");
scanner.Add(shouldAllowDriverLockOnPatchPtrn, [this](PointerCalculator ptr) {
ShouldAllowDriverLockOnPatch = BytePatches::Add(ptr.Sub(0x2C).As<std::uint8_t*>(), std::to_array<std::uint8_t>({0xB0, 0x01, 0xC3}));
});
constexpr auto allowPausingInSessionPatchPtrn = Pattern<"80 88 ? ? ? ? ? EB ? E8">("AllowPausingInSessionPatch");
scanner.Add(allowPausingInSessionPatchPtrn, [this](PointerCalculator ptr) {
AllowPausingInSessionPatch = BytePatches::Add(ptr.Sub(0x1E).As<std::uint8_t*>(), 0xEB);
});
constexpr auto openPauseMenuPtrn = Pattern<"E9 ? ? ? ? B9 30 09 09 21">("OpenPauseMenu");
scanner.Add(openPauseMenuPtrn, [this](PointerCalculator ptr) {
OpenPauseMenu = ptr.Add(1).Rip().As<PVOID>();
});
if (!scanner.Scan())
@@ -375,12 +394,12 @@ namespace YimMenu
constexpr auto readAttributePatchPtrn = Pattern<"75 70 EB 23">("ReadAttributesPatch");
scanner.Add(readAttributePatchPtrn, [this](PointerCalculator ptr) {
BytePatches::Add(ptr.As<void*>(), std::vector<std::uint8_t>{0x90, 0x90})->Apply();
BytePatches::Add(ptr.As<void*>(), std::to_array<std::uint8_t>({0x90, 0x90}))->Apply();
});
constexpr auto readAttributePatch2Ptrn = Pattern<"32 C0 EB ? C7 83">("ReadAttributesPatch2");
scanner.Add(readAttributePatch2Ptrn, [this](PointerCalculator ptr) {
BytePatches::Add(ptr.As<void*>(), std::vector<std::uint8_t>{0xB0, 0x01})->Apply();
BytePatches::Add(ptr.As<void*>(), std::to_array<std::uint8_t>({0xB0, 0x01}))->Apply();
});
constexpr auto getAvatarsPtrn = Pattern<"89 4E 7C 48 8B CE E8 ? ? ? ? 84 C0">("GetAvatars");
+4
View File
@@ -140,6 +140,10 @@ namespace YimMenu
PVOID FormatIntCaller2;
BytePatch ShouldNotTargetEntityPatch;
BytePatch GetAssistedAimTypePatch;
BytePatch GetLockOnPosPatch;
BytePatch ShouldAllowDriverLockOnPatch;
BytePatch AllowPausingInSessionPatch;
PVOID OpenPauseMenu;
};
struct Pointers : PointerData
+1
View File
@@ -28,6 +28,7 @@ namespace rage
std::uint32_t m_CxnId; // 0x0044
rage::netEvent* m_This; // 0x0048
uint32_t m_PeerId; // 0x0050
char pad_0084[4]; // 0x0054
};
static_assert(sizeof(rage::netEvent) == 0x58);
+4
View File
@@ -248,8 +248,10 @@ class CExplosionEvent : public rage::netGameEvent
public:
void Deserialize(rage::datBitBuffer& buffer);
#if !__GNUC__
struct
{
#endif
ExplosionType m_ExplosionType; // 0x30
rage::fvector3 m_Position; // 0x40
uint64_t m_0x50; // 0x50
@@ -282,7 +284,9 @@ public:
bool m_Expected; // 0xC2 -- for telemetry
uint32_t m_ScriptHash; // 0xC4 -- for telemetry
uint32_t m_ProgramCounter; // 0xC8 -- for telemetry
#if !__GNUC__
};
#endif
uint16_t m_TargetEntity; // 0xD0
uint16_t m_TargetEnt2; // 0xD2
uint16_t m_OwnerNetId; // 0xD4
+1 -1
View File
@@ -10,4 +10,4 @@ private: \
virtual bool _0x28(void**) = 0; \
virtual void destructor() = 0; \
\
public:
public:
+1 -1
View File
@@ -42,7 +42,7 @@ namespace rage
v11 = 8;
if (size > 8)
{
v12 = 1i64;
v12 = 1;
do
{
if (v12 > v9)
+2 -2
View File
@@ -8,7 +8,7 @@ namespace rage
class tlsContext
{
public:
char m_Pad1[0x7A0];
char m_Pad1[0x7A8];
rage::scrThread* m_CurrentScriptThread;
bool m_ScriptThreadActive;
@@ -18,5 +18,5 @@ namespace rage
return *reinterpret_cast<tlsContext**>(__readgsqword(0x58) + TlsIndex);
}
};
static_assert(sizeof(tlsContext) == 0x7B0);
static_assert(sizeof(tlsContext) == 0x7B8);
}