feat(Hooks): Added player join and leave hooks

This commit is contained in:
Yimura 2022-01-25 02:55:35 +01:00
parent 436db363f4
commit 2f7b8d425b
No known key found for this signature in database
GPG Key ID: 3D8FF4397E768682
6 changed files with 64 additions and 1 deletions

View File

@ -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<void*>(), &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<void*>(), &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();

View File

@ -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;

View File

@ -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<decltype(&hooks::player_join)>()(_this, net_player);
}
}

View File

@ -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<decltype(&hooks::player_leave)>()(_this, net_player);
}
}

View File

@ -215,6 +215,24 @@ namespace big
{
m_send_net_info_to_lobby = ptr.sub(0x64).as<decltype(m_send_net_info_to_lobby)>();
});
// 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<CNetworkObjectMgr**>();
});
// 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<PVOID>();
});
// 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<PVOID>();
});
main_batch.run(memory::module(nullptr));

View File

@ -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{};