From ee707c538b6061a248c02f29c4809c28ac465201 Mon Sep 17 00:00:00 2001 From: Anvar Date: Sun, 28 Jan 2024 09:17:26 -0500 Subject: [PATCH] Graceful Landing (#2660) --- src/backend/commands/self/graceful_landing.cpp | 6 ++++++ src/core/settings.hpp | 1 + src/gta/enums.hpp | 17 +++++++++++++++++ src/gta_pointers.hpp | 1 + src/hooking/hooking.cpp | 2 ++ src/hooking/hooking.hpp | 2 ++ src/hooks/misc/task_fall_constructor.cpp | 14 ++++++++++++++ src/hooks/misc/task_jump_constructor.cpp | 5 +++-- src/pointers.cpp | 9 +++++++++ src/views/self/view_self.cpp | 1 + 10 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/backend/commands/self/graceful_landing.cpp create mode 100644 src/hooks/misc/task_fall_constructor.cpp diff --git a/src/backend/commands/self/graceful_landing.cpp b/src/backend/commands/self/graceful_landing.cpp new file mode 100644 index 00000000..ad53bbe8 --- /dev/null +++ b/src/backend/commands/self/graceful_landing.cpp @@ -0,0 +1,6 @@ +#include "backend/bool_command.hpp" + +namespace big +{ + bool_command g_graceful_landing("gracefullanding", "GRACEFUL_LANDING", "GRACEFUL_LANDING_DESC", g.self.graceful_landing); +} \ No newline at end of file diff --git a/src/core/settings.hpp b/src/core/settings.hpp index ae8287da..303dfa9c 100644 --- a/src/core/settings.hpp +++ b/src/core/settings.hpp @@ -341,6 +341,7 @@ namespace big bool auto_tp = false; bool super_jump = false; bool beast_jump = false; + bool graceful_landing = false; bool healthregen = false; float healthregenrate = 1.0f; bool superman = false; diff --git a/src/gta/enums.hpp b/src/gta/enums.hpp index 6edf40d0..b2b30ba9 100644 --- a/src/gta/enums.hpp +++ b/src/gta/enums.hpp @@ -1974,6 +1974,23 @@ enum class eTaskTypeIndex CTaskAnimatedFallback = 530 }; +enum class eTaskFlags +{ + ParachuteWhenCoordThresholdIsReached = 1 << 3, + CamShakeOnFall = 1 << 4, + PlayRagdollAnim = 1 << 5, + PlayDiveAnim = 1 << 7, + NoFallAnimation = 1 << 10, + NoSlowFall = 1 << 11, + Unk12 = 1 << 12, + SuperJump = 1 << 15, + LandOnJump = 1 << 16, + BeastJump = 1 << 17, + BeastJumpWithSuper = SuperJump | BeastJump, + GracefulLanding = NoFallAnimation | NoSlowFall | Unk12 | LandOnJump, + RagdollOnFall = BeastJump | PlayRagdollAnim +}; + enum class eDoorId { VEH_EXT_DOOR_INVALID_ID = -1, diff --git a/src/gta_pointers.hpp b/src/gta_pointers.hpp index d34aef5c..1eaa42f8 100644 --- a/src/gta_pointers.hpp +++ b/src/gta_pointers.hpp @@ -277,6 +277,7 @@ namespace big PVOID m_allow_weapons_in_vehicle; PVOID m_taskjump_constructor; + PVOID m_taskfall_constructor; PVOID m_write_vehicle_proximity_migration_data_node; functions::migrate_object m_migrate_object; diff --git a/src/hooking/hooking.cpp b/src/hooking/hooking.cpp index 90201eff..3ed5ce35 100644 --- a/src/hooking/hooking.cpp +++ b/src/hooking/hooking.cpp @@ -115,6 +115,8 @@ namespace big detour_hook_helper::add("TJC", g_pointers->m_gta.m_taskjump_constructor); + detour_hook_helper::add("TFC", g_pointers->m_gta.m_taskfall_constructor); + detour_hook_helper::add("EAD", g_pointers->m_gta.m_enumerate_audio_devices); detour_hook_helper::add("DSCC", g_pointers->m_gta.m_direct_sound_capture_create); diff --git a/src/hooking/hooking.hpp b/src/hooking/hooking.hpp index bc0d0258..92b14f9b 100644 --- a/src/hooking/hooking.hpp +++ b/src/hooking/hooking.hpp @@ -151,6 +151,8 @@ namespace big static __int64 task_jump_constructor(uint64_t a1, int a2); + static void* task_fall_constructor(uint64_t a1, int a2); + static CBaseModelInfo* get_model_info(rage::joaat_t hash, uint32_t* a2); static int enumerate_audio_devices(CFoundDevice* found_devices, int count, int flags); diff --git a/src/hooks/misc/task_fall_constructor.cpp b/src/hooks/misc/task_fall_constructor.cpp new file mode 100644 index 00000000..fdcaaec0 --- /dev/null +++ b/src/hooks/misc/task_fall_constructor.cpp @@ -0,0 +1,14 @@ +#include "gta/enums.hpp" +#include "hooking/hooking.hpp" + +namespace big +{ + void* hooks::task_fall_constructor(uint64_t a1, int a2) + { + if (g.self.graceful_landing) + { + a2 |= (int)eTaskFlags::GracefulLanding; + } + return g_hooking->get_original()(a1, a2); + } +} diff --git a/src/hooks/misc/task_jump_constructor.cpp b/src/hooks/misc/task_jump_constructor.cpp index dda76d68..a42e1b02 100644 --- a/src/hooks/misc/task_jump_constructor.cpp +++ b/src/hooks/misc/task_jump_constructor.cpp @@ -1,3 +1,4 @@ +#include "gta/enums.hpp" #include "hooking/hooking.hpp" namespace big @@ -5,9 +6,9 @@ namespace big __int64 hooks::task_jump_constructor(uint64_t a1, int a2) { if (g.self.super_jump) - a2 |= 1 << 15; + a2 |= (int)eTaskFlags::SuperJump; if (g.self.beast_jump) - a2 |= (1 << 15) | (1 << 17); + a2 |= (int)eTaskFlags::BeastJumpWithSuper; return g_hooking->get_original()(a1, a2); } } diff --git a/src/pointers.cpp b/src/pointers.cpp index 88393a8a..202f97f3 100644 --- a/src/pointers.cpp +++ b/src/pointers.cpp @@ -1267,6 +1267,15 @@ namespace big g_pointers->m_gta.m_taskjump_constructor = ptr.as(); } }, + // Task Fall Constructor + { + "TFC", + "E8 ? ? ? ? B3 04 08 98 A0", + [](memory::handle ptr) + { + g_pointers->m_gta.m_taskfall_constructor = ptr.add(1).rip().as(); + } + }, // NetFilter Handle Message { "NHM", diff --git a/src/views/self/view_self.cpp b/src/views/self/view_self.cpp index 15fd0eb0..4b285e02 100644 --- a/src/views/self/view_self.cpp +++ b/src/views/self/view_self.cpp @@ -40,6 +40,7 @@ namespace big components::command_checkbox<"invis">(); if (g.self.invisibility) components::command_checkbox<"localvis">(); // TODO: does nothing in SP + components::command_checkbox<"gracefullanding">(); // clang-format off ImGui::BeginDisabled(!*g_pointers->m_gta.m_is_session_started ||