From 47e4e9c491af1e0c22acccdff5b316b0ae73ed15 Mon Sep 17 00:00:00 2001 From: Yimura Date: Sun, 10 Jan 2021 16:19:40 +0100 Subject: [PATCH] wip(Project): pushing project --- BigBaseV2/src/features.cpp | 3 + BigBaseV2/src/features.hpp | 3 +- .../src/features/looped/join_message.cpp | 48 +++---- .../src/features/looped/spectate_player.cpp | 10 +- .../src/features/looped/super_sprint.cpp | 117 ++++++++++-------- BigBaseV2/src/features/rid_joiner.cpp | 54 ++++++++ BigBaseV2/src/features/rid_joiner.hpp | 63 ++++++++++ BigBaseV2/src/function_types.hpp | 8 +- BigBaseV2/src/gui/tab_bar/tab_misc.cpp | 9 ++ BigBaseV2/src/hooking.cpp | 6 +- BigBaseV2/src/hooking.hpp | 4 +- BigBaseV2/src/hooks/censor_chat.cpp | 11 -- BigBaseV2/src/hooks/read_session_response.cpp | 59 +++++++++ BigBaseV2/src/pointers.cpp | 31 ++++- BigBaseV2/src/pointers.hpp | 8 +- 15 files changed, 334 insertions(+), 100 deletions(-) create mode 100644 BigBaseV2/src/features/rid_joiner.cpp create mode 100644 BigBaseV2/src/features/rid_joiner.hpp delete mode 100644 BigBaseV2/src/hooks/censor_chat.cpp create mode 100644 BigBaseV2/src/hooks/read_session_response.cpp diff --git a/BigBaseV2/src/features.cpp b/BigBaseV2/src/features.cpp index 551d3bfa..f77cc1f5 100644 --- a/BigBaseV2/src/features.cpp +++ b/BigBaseV2/src/features.cpp @@ -12,8 +12,11 @@ namespace big update_player_structs(); update_screen_sizes(); + g_rid_joiner.look_for_session(); + disable_phone(); god_mode(); + join_message(); never_wanted(); no_bike_fall(); no_idle_kick(); diff --git a/BigBaseV2/src/features.hpp b/BigBaseV2/src/features.hpp index 216278c4..971ecbde 100644 --- a/BigBaseV2/src/features.hpp +++ b/BigBaseV2/src/features.hpp @@ -6,6 +6,7 @@ #include "structs/temp.hpp" #include "features/functions.hpp" #include "features/notify.hpp" +#include "features/rid_joiner.hpp" #include "features/stats.hpp" #include "features/teleport.hpp" @@ -31,7 +32,7 @@ namespace big void disable_phone(); void god_mode(); - void join_message(Player player); + void join_message(); void never_wanted(); void no_bike_fall(); void no_idle_kick(); diff --git a/BigBaseV2/src/features/looped/join_message.cpp b/BigBaseV2/src/features/looped/join_message.cpp index da4a2ef0..eec249dc 100644 --- a/BigBaseV2/src/features/looped/join_message.cpp +++ b/BigBaseV2/src/features/looped/join_message.cpp @@ -1,22 +1,28 @@ -#include "features.hpp" -#include "pointers.hpp" - -namespace big -{ - void features::join_message(Player player) - { - if (player == g_playerId) return; - - bool bJoinMessage = g_settings.options["join_message"].get(); - - if (bJoinMessage) - { - char joinMsg[64]; - strcpy(joinMsg, ""); - strcat(joinMsg, g_pointers->m_get_player_name(player)); - strcat(joinMsg, " is joining."); - - features::notify::above_map(joinMsg); - } - } +#include "features.hpp" +#include "pointers.hpp" + +namespace big +{ + void features::join_message() + { + bool bJoinMessage = g_settings.options["join_message"].get(); + + if (bJoinMessage) + { + for (uint8_t i = 0; i < 32; i++) + { + if (i == g_playerId) continue; + + if (ENTITY::DOES_ENTITY_EXIST(PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(i)) && !NETWORK::NETWORK_IS_PLAYER_CONNECTED(i)) + { + char joinMsg[64]; + strcpy(joinMsg, ""); + strcat(joinMsg, g_pointers->m_get_player_name(i)); + strcat(joinMsg, " is joining."); + + features::notify::above_map(joinMsg); + } + } + } + } } \ No newline at end of file diff --git a/BigBaseV2/src/features/looped/spectate_player.cpp b/BigBaseV2/src/features/looped/spectate_player.cpp index a4520661..11c57342 100644 --- a/BigBaseV2/src/features/looped/spectate_player.cpp +++ b/BigBaseV2/src/features/looped/spectate_player.cpp @@ -3,17 +3,25 @@ namespace big { + static bool bReset = true; void features::spectate_player() { if (g_selectedPlayerId == -1 || !g_selectedPlayer.is_online || !g_temp.spectate_player) { if (g_temp.spectate_player) g_temp.spectate_player = false; - g_pointers->m_spectate_player(false, -1); + if (!bReset) + { + bReset = true; + + g_pointers->m_spectate_player(false, -1); + } return; } g_pointers->m_spectate_player(true, PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_selectedPlayerId)); + + bReset = false; } } \ No newline at end of file diff --git a/BigBaseV2/src/features/looped/super_sprint.cpp b/BigBaseV2/src/features/looped/super_sprint.cpp index 3d198766..7de248ab 100644 --- a/BigBaseV2/src/features/looped/super_sprint.cpp +++ b/BigBaseV2/src/features/looped/super_sprint.cpp @@ -1,55 +1,64 @@ -#include "features.hpp" - -namespace big -{ - static bool bLastSuperSprint = false; - static bool bSkyDiving = false; - - void features::super_sprint() - { - bool bSuperSprint = g_settings.options["super_sprint"].get(); - - if (bSuperSprint) - { - QUEUE_JOB_BEGIN_CLAUSE(= ) - { - Ped player = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_playerId); - Vector3 location = ENTITY::GET_ENTITY_COORDS(player, true); - float ground; - MISC::GET_GROUND_Z_FOR_3D_COORD(location.x, location.y, location.z, &ground, 0, 0); - - bool flying = location.z - ground > 3; - if (flying && !bSkyDiving) - { - TASK::TASK_SKY_DIVE(player, true); - - bSkyDiving = true; - } - else if (!flying && bSkyDiving) - bSkyDiving = false; - - if (TASK::IS_PED_SPRINTING(player) || flying) - { - Vector3 offset = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(player, 0, 0.6, 0); - ENTITY::APPLY_FORCE_TO_ENTITY(player, 1, 0.0f, 1.3, bSkyDiving ? 1.f : 0.f, 0.0f, 0.0f, 0.0f, 0, 1, 1, 1, 0, 1); - - PLAYER::SET_PLAYER_SPRINT(g_playerId, 1); - PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(g_playerId, 1.49); - } - else - { - PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(g_playerId, 1.0); - } - }QUEUE_JOB_END_CLAUSE - } - else if (!bSuperSprint && bSuperSprint != bLastSuperSprint) - { - QUEUE_JOB_BEGIN_CLAUSE(= ) - { - PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(g_playerId, 1.0); - }QUEUE_JOB_END_CLAUSE - } - - bLastSuperSprint = bSuperSprint; - } +#include "features.hpp" + +namespace big +{ + static bool bLastSuperSprint = false; + static bool bSkyDiving = false; + + void features::super_sprint() + { + Ped player = PLAYER::GET_PLAYER_PED_SCRIPT_INDEX(g_playerId); + + if (PED::IS_PED_IN_ANY_VEHICLE(player, true)) return; + + bool bSuperSprint = g_settings.options["super_sprint"].get(); + + if (bSuperSprint) + { + Vector3 vel = ENTITY::GET_ENTITY_VELOCITY(player); + + LOG(INFO) << vel.x << " " << vel.y << ", " << vel.z; + + ENTITY::SET_ENTITY_VELOCITY(player, vel.x * 2, vel.y * 2, vel.z); + } + /* + if (bSuperSprint) + { + float height = ENTITY::GET_ENTITY_HEIGHT_ABOVE_GROUND(player); + + bool flying = height > 5; + if (flying && !bSkyDiving) + { + TASK::TASK_SKY_DIVE(player, true); + + bSkyDiving = true; + } + else if (!flying && bSkyDiving) + { + bSkyDiving = false; + flying = false; + + TASK::TASK_SKY_DIVE(player, false); + } + + if (TASK::IS_PED_SPRINTING(player) || flying) + { + Vector3 offset = ENTITY::GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(player, 0, 0.6, 0); + ENTITY::APPLY_FORCE_TO_ENTITY(player, 1, 0.0f, 1.3, bSkyDiving ? 1.f : 0.f, 0.0f, 0.0f, 0.0f, 0, 1, 1, 1, 0, 1); + + PLAYER::SET_PLAYER_SPRINT(g_playerId, 1); + PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(g_playerId, 1.49); + } + else + { + PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(g_playerId, 1.0); + } + } + else if (!bSuperSprint && bSuperSprint != bLastSuperSprint) + { + PLAYER::SET_RUN_SPRINT_MULTIPLIER_FOR_PLAYER(g_playerId, 1.0); + }*/ + + bLastSuperSprint = bSuperSprint; + } } \ No newline at end of file diff --git a/BigBaseV2/src/features/rid_joiner.cpp b/BigBaseV2/src/features/rid_joiner.cpp new file mode 100644 index 00000000..8be2bc14 --- /dev/null +++ b/BigBaseV2/src/features/rid_joiner.cpp @@ -0,0 +1,54 @@ +#include "features/notify.hpp" +#include "natives.hpp" +#include "pointers.hpp" +#include "rid_joiner.hpp" +#include "script.hpp" +#include "fiber_pool.hpp" + +namespace big +{ + void rid_joiner::look_for_session() + { + if (this->awaiting_request) + { + features::notify::above_map("WAITING FOR GAME COORDINATOR"); + + if (this->type == 2 && !this->gs_info.empty()) + { + handle_info(); + } + } + } + + void rid_joiner::handle_info() + { + this->awaiting_request = false; + + join_rstar_id_request request; + memset(&request, 0, sizeof(request)); + request.identifier.rockstar_id = g_pointers->m_rs_info->rockstar_id; + request.identifier.type = 3; + + features::notify::above_map("ATTEMPTING TO JOIN"); + + g_pointers->m_get_session_info_from_gs(&request.session_info, this->gs_info.c_str(), 0, 0); + g_pointers->m_join_player_via_session_info(&request.identifier, &request.session_info, 0xA000); + } + + void rid_joiner::join_player(uint64_t rid) + { + this->awaiting_request = true; + this->gs_info.clear(); + this->type = 2; + this->rid = rid; + + rockstar_identifier* identifier = new rockstar_identifier(); + identifier->rockstar_id = rid; + identifier->type = 3; + NETWORK::NETWORK_CLEAR_GET_GAMER_STATUS(); + + g_pointers->m_send_session_info_request(identifier, 1); + + features::notify::above_map("Sent join request to join R* Id."); + } +} \ No newline at end of file diff --git a/BigBaseV2/src/features/rid_joiner.hpp b/BigBaseV2/src/features/rid_joiner.hpp new file mode 100644 index 00000000..3b3d210e --- /dev/null +++ b/BigBaseV2/src/features/rid_joiner.hpp @@ -0,0 +1,63 @@ +#pragma once +#include "common.hpp" + +namespace big +{ + class rid_joiner + { + public: + std::string gs_info; + uint64_t rid; + + void look_for_session(); + void handle_info(); + void join_player(uint64_t rid); + private: + bool awaiting_request = false; + int type = 0; + }; + + inline rid_joiner g_rid_joiner{}; + + struct rockstar_identifier { + uint64_t rockstar_id; + uint32_t type; + uint32_t sub_type; + }; + + struct gs_session { + char _0x0000[0x8]; + uint64_t PeerToken; + char _0x0010[0x38]; + uint64_t RockstarID; + }; + + struct net_msg_identifier { + uint64_t rockstar_id; + uint8_t type; + char _0x0009[0xB]; + }; + + struct rs_info { + char scs_ticket[0x100]; + char _0x0100[0x190]; + uint64_t peer; + char _0x0298[0xA7]; + char email[0x50]; + char _0x038f[0x20]; + char name[0x20]; + char _0x03cf[0x29]; + uint32_t rockstar_id; + }; + + struct network_handle { + int Handle; + char _0x0[48]; + }; + + struct join_rstar_id_request { + char _0x0000[0x8]; + gs_session session_info; + net_msg_identifier identifier; + }; +} \ No newline at end of file diff --git a/BigBaseV2/src/function_types.hpp b/BigBaseV2/src/function_types.hpp index 058efbdc..b4156db4 100644 --- a/BigBaseV2/src/function_types.hpp +++ b/BigBaseV2/src/function_types.hpp @@ -2,6 +2,7 @@ #include "common.hpp" #include "gta/fwddec.hpp" #include "gta/natives.hpp" +#include "features/rid_joiner.hpp" namespace big::functions { @@ -9,7 +10,6 @@ namespace big::functions using get_native_handler_t = rage::scrNativeHandler(*)(rage::scrNativeRegistrationTable*, rage::scrNativeHash); using fix_vectors_t = void(*)(rage::scrNativeCallContext*); - using censor_chat = int(int64_t chat_menu, const char* user_text, const char** output_text); using error_screen = void(char* entryHeader, char* entryLine1, int instructionalKey, char* entryLine2, BOOL p4, Any p5, Any* p6, Any* p7, BOOL background); using increment_stat_event = bool(uint64_t net_event_struct, int64_t sender, int64_t a3); using get_event_data = bool(int32_t eventGroup, int32_t eventIndex, int64_t* args, uint32_t argCount); @@ -20,4 +20,10 @@ namespace big::functions using spectate_player = bool(bool toggle, Ped player); using sync_local_time = void(int h, int m); using trigger_script_event = int(bool unk0, int64_t* args, int argCount, int bitFlags); + + // R* Joiner + using get_session_info_from_gs = bool(gs_session* session, const char* gs, int a3, int a4); + using join_player_via_session_info = void(net_msg_identifier* identifier, gs_session* session_info, int flag); + using read_session_response = bool(uint64_t rcx); + using send_session_info_request = void(rockstar_identifier* target, int count); } diff --git a/BigBaseV2/src/gui/tab_bar/tab_misc.cpp b/BigBaseV2/src/gui/tab_bar/tab_misc.cpp index d7e35a3f..d14d0eec 100644 --- a/BigBaseV2/src/gui/tab_bar/tab_misc.cpp +++ b/BigBaseV2/src/gui/tab_bar/tab_misc.cpp @@ -1,4 +1,5 @@ #include "tab_bar.hpp" +#include "features/rid_joiner.hpp" namespace big { @@ -6,6 +7,14 @@ namespace big { if (ImGui::BeginTabItem("Misc")) { + if (ImGui::Button("Join R* Id")) + { + QUEUE_JOB_BEGIN_CLAUSE() + { + g_rid_joiner.join_player(143069134); + }QUEUE_JOB_END_CLAUSE + } + ImGui::Text("Set Current Character Level:"); ImGui::SliderInt("##input_levels_self", &g_temp.set_level, 0, 8000); if (ImGui::Button("Set Level")) diff --git a/BigBaseV2/src/hooking.cpp b/BigBaseV2/src/hooking.cpp index 6088b26f..4752d9b1 100644 --- a/BigBaseV2/src/hooking.cpp +++ b/BigBaseV2/src/hooking.cpp @@ -39,10 +39,10 @@ namespace big m_run_script_threads_hook("Script hook", g_pointers->m_run_script_threads, &hooks::run_script_threads), m_convert_thread_to_fiber_hook("ConvertThreadToFiber", memory::module("kernel32.dll").get_export("ConvertThreadToFiber").as(), &hooks::convert_thread_to_fiber), - m_censor_chat("Censor Chat", g_pointers->m_censor_chat, &hooks::censor_chat), m_get_event_data("Get Event Data", g_pointers->m_get_event_data, &hooks::get_event_data), m_error_screen_hook("Disable Warning/Error Screen", g_pointers->m_error_screen, &hooks::error_screen), m_increment_stat_hook("Increment Stat Event", g_pointers->m_increment_stat_event, &hooks::increment_stat_event), + m_read_session_response("Read Session Response", g_pointers->m_read_session_response, &hooks::read_session_response), m_script_event_hook("Script Event Handler", g_pointers->m_script_event_handler, &hooks::script_event_handler) { m_swapchain_hook.hook(hooks::swapchain_present_index, &hooks::swapchain_present); @@ -69,10 +69,10 @@ namespace big m_convert_thread_to_fiber_hook.enable(); // New hooks enable - m_censor_chat.enable(); m_get_event_data.enable(); m_error_screen_hook.enable(); m_increment_stat_hook.enable(); + m_read_session_response.enable(); m_script_event_hook.enable(); m_enabled = true; @@ -90,10 +90,10 @@ namespace big m_swapchain_hook.disable(); // New hooks disable - m_censor_chat.disable(); m_get_event_data.disable(); m_error_screen_hook.disable(); m_increment_stat_hook.disable(); + m_read_session_response.disable(); m_script_event_hook.disable(); } diff --git a/BigBaseV2/src/hooking.hpp b/BigBaseV2/src/hooking.hpp index 93e26eb3..e3cefc07 100644 --- a/BigBaseV2/src/hooking.hpp +++ b/BigBaseV2/src/hooking.hpp @@ -22,10 +22,10 @@ namespace big static BOOL set_cursor_pos(int x, int y); // New Hook Definitions - static int censor_chat(int64_t chat_menu, const char* user_text, const char** output_text); static bool get_event_data(int32_t eventGroup, int32_t eventIndex, int64_t* args, uint32_t argCount); static void error_screen(char* entryHeader, char* entryLine1, int instructionalKey, char* entryLine2, BOOL p4, Any p5, Any* p6, Any* p7, BOOL background); static bool increment_stat_event(uint64_t net_event_struct, int64_t sender, int64_t a3); + static bool read_session_response(uint64_t rcx); static bool script_event_handler(std::int64_t NetEventStruct, std::int64_t CNetGamePlayer); }; @@ -57,10 +57,10 @@ namespace big detour_hook m_convert_thread_to_fiber_hook; // New Detour Hook Definitions - detour_hook m_censor_chat; detour_hook m_get_event_data; detour_hook m_error_screen_hook; detour_hook m_increment_stat_hook; + detour_hook m_read_session_response; detour_hook m_script_event_hook; }; diff --git a/BigBaseV2/src/hooks/censor_chat.cpp b/BigBaseV2/src/hooks/censor_chat.cpp deleted file mode 100644 index 4b0c1cec..00000000 --- a/BigBaseV2/src/hooks/censor_chat.cpp +++ /dev/null @@ -1,11 +0,0 @@ -#include "hooking.hpp" - -namespace big -{ - int hooks::censor_chat(int64_t chat_menu, const char* user_text, const char** output_text) - { - if (g_settings.options["disable_chat_censoring"].get()) return -1; - - return g_hooking->m_censor_chat.get_original()(chat_menu, user_text, output_text); - } -} \ No newline at end of file diff --git a/BigBaseV2/src/hooks/read_session_response.cpp b/BigBaseV2/src/hooks/read_session_response.cpp new file mode 100644 index 00000000..9d5c0ec5 --- /dev/null +++ b/BigBaseV2/src/hooks/read_session_response.cpp @@ -0,0 +1,59 @@ +#include "hooking.hpp" +#include "features.hpp" + +namespace big +{ + bool hooks::read_session_response(uint64_t rcx) + { + bool bReturn = true; + + if (rcx && *(uint32_t*)(rcx + 0x23C4)) { + uint32_t i = 0; + do { + uint64_t address = rcx + 0x22C0 + (i * 8); + if (*(uint64_t*)(address)) { + const char* responseData = *(const char**)(address); + if (responseData) { + try { + nlohmann::json Json = nlohmann::json::parse(responseData); + if (Json.find("gsinfo") == Json.end()) { + return false; + } + + uint64_t rockstar_id = std::stoul(Json["_id"].get().substr(3)); + std::string gs_info_json = Json["gsinfo"].get(); + + features::notify::above_map("HOOK GOT DRIP."); + + LOG(INFO) << "Rockstar ID: " << rockstar_id; + LOG(INFO) << "Data: "; + LOG(INFO) << gs_info_json; + LOG(INFO) << rockstar_id << " == " << g_rid_joiner.rid; + + if (rockstar_id == g_rid_joiner.rid) { + if (gs_info_json.empty()) + { + // PendingTimeout = 0; + } + else + { + g_rid_joiner.gs_info = gs_info_json; + } + + bReturn = false; + } + } + catch (...) { + return false; + } + } + } + + i++; + } while (i < *(uint32_t*)(rcx + 0x23C4)); + } + + if (!bReturn) return false; + return g_hooking->m_read_session_response.get_original()(rcx); + } +} \ No newline at end of file diff --git a/BigBaseV2/src/pointers.cpp b/BigBaseV2/src/pointers.cpp index f0ccf0cb..bb779d94 100644 --- a/BigBaseV2/src/pointers.cpp +++ b/BigBaseV2/src/pointers.cpp @@ -113,11 +113,6 @@ namespace big m_spectate_player = ptr.as(); }); - main_batch.add("Censor Chat", "E8 ? ? ? ? 83 F8 FF 75 B9", [this](memory::handle ptr) - { - m_censor_chat = ptr.as(); - }); - main_batch.add("Get Net player", "48 83 EC 28 33 C0 38 05 ? ? ? ? 74 0A", [this](memory::handle ptr) { m_get_net_game_player = ptr.as(); @@ -127,6 +122,32 @@ namespace big { m_get_event_data = ptr.sub(28).as(); }); + + // R* Id + main_batch.add("Send Session Info Request", "48 8B C4 48 89 58 08 48 89 68 10 48 89 70 18 48 89 78 20 41 56 48 83 EC 30 48 83 3D ? ? ? ? ? 8B", [this](memory::handle ptr) + { + m_send_session_info_request = ptr.as(); + }); + + main_batch.add("Join Player Via Session Info", "48 89 5C 24 ? 48 89 6C 24 ? 48 89 74 24 ? 57 41 56 41 57 48 81 EC ? ? ? ? 4C 8B F9 B1 01 49 8B F1 49 8B E8 44 8B F2 E8", [this](memory::handle ptr) + { + m_join_player_via_session_info = ptr.as(); + }); + + main_batch.add("Rockstar Info", "48 8D 05 ? ? ? ? 4D 69 C0 ? ? ? ? 4C 03 C0 41 83 B8 ? ? ? ? ? 0F 86 ? ? ? ? 83 CD FF 48 8D 15", [this](memory::handle ptr) + { + m_rs_info = ptr.as(); + }); + + main_batch.add("Get Session Info From GS", "48 8B C4 48 89 58 08 48 89 68 10 56 57 41 56 48 81 EC ? ? ? ? 48 8B F2 33 D2 49 8B F8 4C 8B F1 44 8D 42", [this](memory::handle ptr) + { + m_get_session_info_from_gs = ptr.as(); + }); + + main_batch.add("Read Session Response Hook", "48 8B C4 48 89 58 08 48 89 70 10 48 89 78 18 55 41 54 41 56 48 8D 68 D8 48 81 EC ? ? ? ? 45 33 F6 48 8B F9 45", [this](memory::handle ptr) + { + m_read_session_response = ptr.as(); + }); main_batch.run(memory::module(nullptr)); diff --git a/BigBaseV2/src/pointers.hpp b/BigBaseV2/src/pointers.hpp index 1c79e87e..3464c1f6 100644 --- a/BigBaseV2/src/pointers.hpp +++ b/BigBaseV2/src/pointers.hpp @@ -3,6 +3,7 @@ #include "gta/fwddec.hpp" #include "gta/enums.hpp" #include "function_types.hpp" +#include "features/rid_joiner.hpp" namespace big { @@ -35,7 +36,6 @@ namespace big PVOID m_model_spawn_bypass; - functions::censor_chat* m_censor_chat{}; functions::error_screen* m_error_screen{}; functions::get_event_data* m_get_event_data{}; functions::get_player_name* m_get_player_name{}; @@ -46,6 +46,12 @@ namespace big functions::spectate_player* m_spectate_player{}; functions::sync_local_time* m_sync_local_time{}; functions::trigger_script_event* m_trigger_script_event{}; + + rs_info *m_rs_info{}; + functions::get_session_info_from_gs* m_get_session_info_from_gs{}; + functions::join_player_via_session_info* m_join_player_via_session_info{}; + functions::read_session_response* m_read_session_response{}; + functions::send_session_info_request* m_send_session_info_request{}; }; inline pointers *g_pointers{};