From 2f7b8d425bf53850ce23582f1079fbd77fd15c2d Mon Sep 17 00:00:00 2001 From: Yimura Date: Tue, 25 Jan 2022 02:55:35 +0100 Subject: [PATCH] feat(Hooks): Added player join and leave hooks --- BigBaseV2/src/hooking.cpp | 14 +++++++++++++- BigBaseV2/src/hooking.hpp | 7 +++++++ BigBaseV2/src/hooks/player_join.cpp | 11 +++++++++++ BigBaseV2/src/hooks/player_left.cpp | 11 +++++++++++ BigBaseV2/src/pointers.cpp | 18 ++++++++++++++++++ BigBaseV2/src/pointers.hpp | 4 ++++ 6 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 BigBaseV2/src/hooks/player_join.cpp create mode 100644 BigBaseV2/src/hooks/player_left.cpp diff --git a/BigBaseV2/src/hooking.cpp b/BigBaseV2/src/hooking.cpp index 51520f45..12f4492a 100644 --- a/BigBaseV2/src/hooking.cpp +++ b/BigBaseV2/src/hooking.cpp @@ -17,6 +17,7 @@ namespace big { hooking::hooking() : + // Swapchain m_swapchain_hook(*g_pointers->m_swapchain, hooks::swapchain_num_funcs), // SetCursorPos m_set_cursor_pos_hook("SCP", memory::module("user32.dll").get_export("SetCursorPos").as(), &hooks::set_cursor_pos), @@ -26,6 +27,8 @@ namespace big // ConvertThreadToFibe m_convert_thread_to_fiber_hook("CTTF", memory::module("kernel32.dll").get_export("ConvertThreadToFiber").as(), &hooks::convert_thread_to_fiber), + // GTA Thead Start + m_gta_thread_start_hook("GTS", g_pointers->m_gta_thread_start, &hooks::gta_thread_start), // GTA Thread Tick m_gta_thread_tick_hook("GTT", g_pointers->m_gta_thread_tick, &hooks::gta_thread_tick), // GTA Thread Kill @@ -48,7 +51,10 @@ namespace big // Send NET Info to Lobby m_send_net_info_to_lobby("SNITL", g_pointers->m_send_net_info_to_lobby, &hooks::send_net_info_to_lobby), - m_gta_thread_start_hook("GTS", g_pointers->m_gta_thread_start, &hooks::gta_thread_start) + // Player Has Joined + m_player_has_joined_hook("PHJ", g_pointers->m_player_has_joined, &hooks::player_join), + // Player Has Left + m_player_has_left_hook("PHL", g_pointers->m_player_has_left, &hooks::player_leave) { m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present); m_swapchain_hook.hook(hooks::swapchain_resizebuffers_index, &hooks::swapchain_resizebuffers); @@ -77,6 +83,9 @@ namespace big m_gta_thread_kill_hook.enable(); m_gta_thread_tick_hook.enable(); + m_player_has_joined_hook.enable(); + m_player_has_left_hook.enable(); + m_increment_stat_hook.enable(); m_error_screen_hook.enable(); @@ -104,6 +113,9 @@ namespace big m_increment_stat_hook.disable(); + m_player_has_joined_hook.disable(); + m_player_has_left_hook.disable(); + m_gta_thread_tick_hook.disable(); m_gta_thread_kill_hook.disable(); m_gta_thread_start_hook.disable(); diff --git a/BigBaseV2/src/hooking.hpp b/BigBaseV2/src/hooking.hpp index 46bff2db..4ca52da9 100644 --- a/BigBaseV2/src/hooking.hpp +++ b/BigBaseV2/src/hooking.hpp @@ -40,6 +40,9 @@ namespace big static rage::eThreadState gta_thread_tick(GtaThread* a1, unsigned int a2); static rage::eThreadState gta_thread_kill(GtaThread* thread); + static void player_join(CNetworkObjectMgr* _this, CNetGamePlayer* net_player); + static void player_leave(CNetworkObjectMgr* _this, CNetGamePlayer* net_player); + static bool increment_stat_event(CNetworkIncrementStatEvent* net_event_struct, CNetGamePlayer* sender, int64_t a3); static bool is_dlc_present(Hash dlc_hash); @@ -79,6 +82,7 @@ namespace big minhook_keepalive m_minhook_keepalive; vmt_hook m_swapchain_hook; + WNDPROC m_og_wndproc = nullptr; detour_hook m_set_cursor_pos_hook; @@ -91,6 +95,9 @@ namespace big detour_hook m_gta_thread_tick_hook; detour_hook m_gta_thread_kill_hook; + detour_hook m_player_has_joined_hook; + detour_hook m_player_has_left_hook; + detour_hook m_increment_stat_hook; detour_hook m_is_dlc_present_hook; diff --git a/BigBaseV2/src/hooks/player_join.cpp b/BigBaseV2/src/hooks/player_join.cpp new file mode 100644 index 00000000..4c162d3c --- /dev/null +++ b/BigBaseV2/src/hooks/player_join.cpp @@ -0,0 +1,11 @@ +#include "hooking.hpp" + +namespace big +{ + void hooks::player_join(CNetworkObjectMgr* _this, CNetGamePlayer* net_player) + { + LOG(INFO) << "Player '" << net_player->get_name() << "' joined taking slot #" << (int)net_player->player_id; + + return g_hooking->m_player_has_joined_hook.get_original()(_this, net_player); + } +} \ No newline at end of file diff --git a/BigBaseV2/src/hooks/player_left.cpp b/BigBaseV2/src/hooks/player_left.cpp new file mode 100644 index 00000000..bd74e5eb --- /dev/null +++ b/BigBaseV2/src/hooks/player_left.cpp @@ -0,0 +1,11 @@ +#include "hooking.hpp" + +namespace big +{ + void hooks::player_leave(CNetworkObjectMgr* _this, CNetGamePlayer* net_player) + { + LOG(INFO) << "Player '" << net_player->get_name() << "' leaved freeing slot #" << (int)net_player->player_id; + + return g_hooking->m_player_has_left_hook.get_original()(_this, net_player); + } +} \ No newline at end of file diff --git a/BigBaseV2/src/pointers.cpp b/BigBaseV2/src/pointers.cpp index ebff61df..45ee530a 100644 --- a/BigBaseV2/src/pointers.cpp +++ b/BigBaseV2/src/pointers.cpp @@ -215,6 +215,24 @@ namespace big { m_send_net_info_to_lobby = ptr.sub(0x64).as(); }); + + // CNetworkObjectMgr + main_batch.add("CNOM", "48 8B 0D ? ? ? ? 45 33 C0 E8 ? ? ? ? 33 FF 4C 8B F0", [this](memory::handle ptr) + { + m_network_object_mgr = ptr.add(3).rip().as(); + }); + + // Player Has Joined + main_batch.add("PHJ", "48 8B CA 48 8B F2 FF 50 18 4C 8D 05", [this](memory::handle ptr) + { + m_player_has_joined = ptr.sub(0x26).as(); + }); + + // Player Has Left + main_batch.add("PHL", "4C 8B F1 48 8B CA 48 8B EA FF 50 18 4C 8D 05", [this](memory::handle ptr) + { + m_player_has_left = ptr.sub(0x26).as(); + }); main_batch.run(memory::module(nullptr)); diff --git a/BigBaseV2/src/pointers.hpp b/BigBaseV2/src/pointers.hpp index cebc3f44..5955f119 100644 --- a/BigBaseV2/src/pointers.hpp +++ b/BigBaseV2/src/pointers.hpp @@ -21,6 +21,7 @@ namespace big CPedFactory **m_ped_factory{}; CNetworkPlayerMgr **m_network_player_mgr{}; + CNetworkObjectMgr** m_network_object_mgr{}; rage::CReplayInterface** m_replay_interface{}; functions::ptr_to_handle* m_ptr_to_handle{}; @@ -51,6 +52,9 @@ namespace big PVOID m_gta_thread_tick{}; PVOID m_gta_thread_kill{}; + PVOID m_player_has_joined{}; + PVOID m_player_has_left{}; + functions::increment_stat_event* m_increment_stat_event{}; PVOID m_scripted_game_event{};