From 391596eb491466b85b239695696769e9ee963f9a Mon Sep 17 00:00:00 2001 From: gir489returns Date: Wed, 14 Aug 2024 15:09:37 -0400 Subject: [PATCH] Completely rewrote Vehicle Godmode. --- cmake/gtav-classes.cmake | 4 +- src/backend/backend.cpp | 1 - src/backend/looped/looped.hpp | 1 - src/backend/looped/system/self_globals.cpp | 70 +++++++++--------- src/backend/looped/system/update_pointers.cpp | 10 --- .../looped/vehicle/keep_vehicle_repaired.cpp | 2 + src/backend/looped/vehicle/vehicle_god.cpp | 4 + src/gta_pointers.hpp | 4 + src/hooking/hooking.cpp | 4 + src/hooking/hooking.hpp | 4 + src/hooks/vehicle/do_damage.cpp | 73 +++++++++++++++++++ src/pointers.cpp | 27 +++++++ src/util/mobile.hpp | 11 +++ 13 files changed, 167 insertions(+), 48 deletions(-) delete mode 100644 src/backend/looped/system/update_pointers.cpp create mode 100644 src/hooks/vehicle/do_damage.cpp diff --git a/cmake/gtav-classes.cmake b/cmake/gtav-classes.cmake index 78b091fa..c54baa46 100644 --- a/cmake/gtav-classes.cmake +++ b/cmake/gtav-classes.cmake @@ -2,8 +2,8 @@ include(FetchContent) FetchContent_Declare( gtav_classes - GIT_REPOSITORY https://github.com/Yimura/GTAV-Classes.git - GIT_TAG b9b832ab00c95a731f8472f696c5d026a29fd767 + GIT_REPOSITORY https://github.com/gir489returns/GTAV-Classes.git + GIT_TAG 9dd81150412bbd2a207eff0beb9415f4f5d9348c GIT_PROGRESS TRUE CONFIGURE_COMMAND "" BUILD_COMMAND "" diff --git a/src/backend/backend.cpp b/src/backend/backend.cpp index 2b1c11af..6fb99367 100644 --- a/src/backend/backend.cpp +++ b/src/backend/backend.cpp @@ -33,7 +33,6 @@ namespace big while (g_running) { looped::system_self_globals(); - looped::system_update_pointers(); looped::system_update_desync_kick(); looped::system_spoofing(); looped::system_mission_creator(); diff --git a/src/backend/looped/looped.hpp b/src/backend/looped/looped.hpp index 21b23fbd..e2633ac2 100644 --- a/src/backend/looped/looped.hpp +++ b/src/backend/looped/looped.hpp @@ -39,7 +39,6 @@ namespace big static void session_modder_detection(); static void system_self_globals(); - static void system_update_pointers(); static void system_update_desync_kick(); static void system_spoofing(); static void system_mission_creator(); diff --git a/src/backend/looped/system/self_globals.cpp b/src/backend/looped/system/self_globals.cpp index 02c52ae1..53661102 100644 --- a/src/backend/looped/system/self_globals.cpp +++ b/src/backend/looped/system/self_globals.cpp @@ -1,34 +1,36 @@ -#include "backend/looped/looped.hpp" -#include "natives.hpp" -#include "pointers.hpp" - -#include - -namespace big -{ - void looped::system_self_globals() - { - if (!(*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player - || (*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player->m_player_id == static_cast(-1)) [[unlikely]] - self::id = 0; - else [[likely]] - self::id = (*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player->m_player_id; - - self::ped = PLAYER::PLAYER_PED_ID(); - - STATS::STAT_GET_INT("MPPLY_LAST_MP_CHAR"_J, &self::char_index, true); - - self::pos = ENTITY::GET_ENTITY_COORDS(self::ped, false /*Unused*/); - - self::rot = ENTITY::GET_ENTITY_ROTATION(self::ped, 2); - - if (PED::IS_PED_IN_ANY_VEHICLE(self::ped, 0)) - { - self::veh = PED::GET_VEHICLE_PED_IS_IN(self::ped, false); - } - else - { - self::veh = 0; - } - } -} +#include "backend/looped/looped.hpp" +#include "natives.hpp" +#include "pointers.hpp" +#include "gta_util.hpp" + +#include + +namespace big +{ + void looped::system_self_globals() + { + if (!(*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player + || (*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player->m_player_id == static_cast(-1)) [[unlikely]] + self::id = 0; + else [[likely]] + self::id = (*g_pointers->m_gta.m_network_player_mgr)->m_local_net_player->m_player_id; + + self::ped = PLAYER::PLAYER_PED_ID(); + g_local_player = gta_util::get_local_ped(); + + STATS::STAT_GET_INT("MPPLY_LAST_MP_CHAR"_J, &self::char_index, true); + + self::pos = ENTITY::GET_ENTITY_COORDS(self::ped, false /*Unused*/); + + self::rot = ENTITY::GET_ENTITY_ROTATION(self::ped, 2); + + if (PED::IS_PED_IN_ANY_VEHICLE(self::ped, 0)) + { + self::veh = PED::GET_VEHICLE_PED_IS_IN(self::ped, false); + } + else + { + self::veh = 0; + } + } +} diff --git a/src/backend/looped/system/update_pointers.cpp b/src/backend/looped/system/update_pointers.cpp deleted file mode 100644 index 437fcc4b..00000000 --- a/src/backend/looped/system/update_pointers.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "backend/looped/looped.hpp" -#include "gta_util.hpp" - -namespace big -{ - void looped::system_update_pointers() - { - g_local_player = gta_util::get_local_ped(); - } -} \ No newline at end of file diff --git a/src/backend/looped/vehicle/keep_vehicle_repaired.cpp b/src/backend/looped/vehicle/keep_vehicle_repaired.cpp index 90670ccf..b9a8dcec 100644 --- a/src/backend/looped/vehicle/keep_vehicle_repaired.cpp +++ b/src/backend/looped/vehicle/keep_vehicle_repaired.cpp @@ -11,6 +11,8 @@ namespace big virtual void on_tick() override { + return; + Vehicle veh = self::veh; if (veh == 0 || VEHICLE::GET_PED_IN_VEHICLE_SEAT(self::veh, SEAT_DRIVER, FALSE) != self::ped) diff --git a/src/backend/looped/vehicle/vehicle_god.cpp b/src/backend/looped/vehicle/vehicle_god.cpp index 7f9e8cf9..1d19f54a 100644 --- a/src/backend/looped/vehicle/vehicle_god.cpp +++ b/src/backend/looped/vehicle/vehicle_god.cpp @@ -104,6 +104,8 @@ namespace big virtual void on_tick() override { + return; + if (g_local_player) { const auto personal_vehicle = get_personal_vehicle(); @@ -114,6 +116,8 @@ namespace big virtual void on_disable() override { + return; + if (g_local_player) { if (g_local_player->m_vehicle) diff --git a/src/gta_pointers.hpp b/src/gta_pointers.hpp index 2c899f79..81d290bc 100644 --- a/src/gta_pointers.hpp +++ b/src/gta_pointers.hpp @@ -411,6 +411,10 @@ namespace big functions::is_ped_enemies_with m_is_ped_enemies_with; functions::can_do_damage_to_ped m_can_do_damage_to_ped; + + PVOID m_damage_vehicle; + PVOID m_deform_vehicle; + PVOID m_is_driver_invincible; }; #pragma pack(pop) static_assert(sizeof(gta_pointers) % 8 == 0, "Pointers are not properly aligned"); diff --git a/src/hooking/hooking.cpp b/src/hooking/hooking.cpp index f97cfe24..ebe4bd03 100644 --- a/src/hooking/hooking.cpp +++ b/src/hooking/hooking.cpp @@ -156,6 +156,10 @@ namespace big detour_hook_helper::add("CPI", g_pointers->m_gta.m_create_pool_item); + detour_hook_helper::add("VDF", g_pointers->m_gta.m_damage_vehicle); + detour_hook_helper::add("ADFV", g_pointers->m_gta.m_deform_vehicle); + detour_hook_helper::add("ISDINV", g_pointers->m_gta.m_is_driver_invincible); + g_hooking = this; } diff --git a/src/hooking/hooking.hpp b/src/hooking/hooking.hpp index 5b784d13..0a92666d 100644 --- a/src/hooking/hooking.hpp +++ b/src/hooking/hooking.hpp @@ -213,6 +213,10 @@ namespace big static void error_packet_memmove(void* dst, void* src, int size); static void* create_pool_item(GenericPool* pool); + + static float damage_vehicle(CVehicleDamage* thisptr, rage::CEntity* source, eDamageType damage_type, Hash weapon, float damage, rage::fvector3* position, rage::fvector3* dot_product, rage::fvector3* unk, std::uint32_t body_part, std::uint64_t damage_material, std::int32_t wheel_index, bool unk1, bool unk2, float radius, bool unk3, bool unk4, bool source_is_melee, const bool unk5, bool max_damage); + static bool apply_deformation(CDeformation* thisptr, rage::fvector3* unk, rage::fvector3* unk2, rage::CEntity* source, bool set_all_deformations, bool break_glass); + static bool is_vehicle_invincible(CVehicleDamage* thisptr); }; class minhook_keepalive diff --git a/src/hooks/vehicle/do_damage.cpp b/src/hooks/vehicle/do_damage.cpp new file mode 100644 index 00000000..fcaea7e3 --- /dev/null +++ b/src/hooks/vehicle/do_damage.cpp @@ -0,0 +1,73 @@ +#include "hooking/hooking.hpp" +#include "pointers.hpp" +#include "util/mobile.hpp" + +namespace big +{ + float hooks::damage_vehicle(CVehicleDamage* thisptr, rage::CEntity* source, eDamageType damage_type, Hash weapon, float damage, rage::fvector3* position, rage::fvector3* dot_product, rage::fvector3* unk, std::uint32_t body_part, std::uint64_t damage_material, std::int32_t wheel_index, bool unk1, bool unk2, float radius, bool unk3, bool unk4, bool source_is_melee, bool unk5, bool max_damage) + { + if (g.vehicle.god_mode) + { + if (self::veh != 0) + { + if (const auto current_vehicle = g_local_player->m_vehicle) + { + if (current_vehicle->m_driver == g_local_player && ¤t_vehicle->m_vehicle_damage == thisptr) + { + LOG(INFO) << "damage_vehicle REJECTED"; + return 0.f; + } + } + } + if (const auto personal_vehicle = mobile::mechanic::get_personal_cvehicle()) + { + if (&personal_vehicle->m_vehicle_damage == thisptr) + { + LOG(INFO) << "personal_vehicle damage_vehicle REJECTED"; + return 0.f; + } + } + } + return g_hooking->get_original()(thisptr, source, damage_type, weapon, damage, position, dot_product, unk, body_part, damage_material, wheel_index, unk1, unk2, radius, unk3, unk4, source_is_melee, unk5, max_damage); + } + + bool hooks::apply_deformation(CDeformation* thisptr, rage::fvector3* unk, rage::fvector3* unk2, rage::CEntity* source, bool set_all_deformations, bool break_glass) + { + if (g.vehicle.proof_collision) + { + if (self::veh != 0) + { + if (const auto current_vehicle = g_local_player->m_vehicle) + { + if (current_vehicle->m_driver == g_local_player && ¤t_vehicle->m_vehicle_damage.m_deformation == thisptr) + { + LOG(INFO) << "apply_deformation REJECTED"; + return false; + } + } + } + if (const auto personal_vehicle = mobile::mechanic::get_personal_cvehicle()) + { + if (&personal_vehicle->m_vehicle_damage.m_deformation == thisptr) + { + LOG(INFO) << "personal_vehicle apply_deformation REJECTED"; + return false; + } + } + } + return g_hooking->get_original()(thisptr, unk, unk2, source, set_all_deformations, break_glass); + } + + bool hooks::is_vehicle_invincible(CVehicleDamage* thisptr) + { + if (g.vehicle.proof_collision) + { + if (thisptr->m_vehicle->m_driver == g_local_player) + { + //LOG(INFO) << "is_vehicle_invincible spoofed"; + return true; + } + } + return g_hooking->get_original()(thisptr); + } +} diff --git a/src/pointers.cpp b/src/pointers.cpp index a88ce8cd..7e1da380 100644 --- a/src/pointers.cpp +++ b/src/pointers.cpp @@ -1958,6 +1958,33 @@ namespace big { g_pointers->m_gta.m_can_do_damage_to_ped = ptr.add(1).rip().as(); } + }, + // Damage vehicle. + { + "DVF", + "E8 ? ? ? ? 32 D2 32 C9", + [](memory::handle ptr) + { + g_pointers->m_gta.m_damage_vehicle = ptr.add(1).rip().as(); + } + }, + // Deform vehicle. + { + "DEFV", + "E8 ? ? ? ? 33 D2 38 96", + [](memory::handle ptr) + { + g_pointers->m_gta.m_deform_vehicle = ptr.add(1).rip().as(); + } + }, + // Is Driver Invincible + { + "ISDINV", + "E8 ? ? ? ? 49 8B 56 ? 84 C0", + [](memory::handle ptr) + { + g_pointers->m_gta.m_is_driver_invincible = ptr.add(1).rip().as(); + } } >(); // don't leave a trailing comma at the end diff --git a/src/util/mobile.hpp b/src/util/mobile.hpp index 11cc751a..7222e81b 100644 --- a/src/util/mobile.hpp +++ b/src/util/mobile.hpp @@ -139,6 +139,17 @@ namespace big::mobile return *scr_globals::freemode_global.at(301).as(); } + inline CVehicle* get_personal_cvehicle() + { + Vehicle personal_vehicle = get_personal_vehicle(); + if (personal_vehicle != -1 && ENTITY::DOES_ENTITY_EXIST(personal_vehicle)) + { + return reinterpret_cast(g_pointers->m_gta.m_handle_to_ptr(personal_vehicle)); + } + + return nullptr; + } + inline void summon_vehicle_by_index(int veh_idx) { if (*scr_globals::freemode_global.at(1000).as() != -1)