From 9769b26870d505c24e19fb5044dbd905a9c45e21 Mon Sep 17 00:00:00 2001 From: Andreas Maerten <24669514+Yimura@users.noreply.github.com> Date: Sun, 10 Sep 2023 17:20:45 +0200 Subject: [PATCH 1/3] fix(Hotkey): Single key not executing multiple hotkeys (#2111) Closes #2000 --- src/services/hotkey/hotkey_service.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/hotkey/hotkey_service.cpp b/src/services/hotkey/hotkey_service.cpp index a2402cd5..0de1632c 100644 --- a/src/services/hotkey/hotkey_service.cpp +++ b/src/services/hotkey/hotkey_service.cpp @@ -94,7 +94,7 @@ namespace big if (state == eKeyState::RELEASE || state == eKeyState::DOWN) { auto& hotkey_map = m_hotkeys[state == eKeyState::RELEASE]; - if (const auto& it = hotkey_map.find(key); it != hotkey_map.end()) + for (auto [ it, end ] = hotkey_map.equal_range(key); it != end; ++it) { if (auto& hotkey = it->second; hotkey.can_exec()) { From 43bf73ba56604d32ff59e67713f8f3b2e987c3a8 Mon Sep 17 00:00:00 2001 From: Andreas Maerten <24669514+Yimura@users.noreply.github.com> Date: Sun, 10 Sep 2023 22:24:13 +0200 Subject: [PATCH 2/3] fix(EmptySession): use translation in command label (#2112) --- src/backend/commands/session/wipe_session.cpp | 13 +++++++------ src/views/network/view_network.cpp | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/backend/commands/session/wipe_session.cpp b/src/backend/commands/session/wipe_session.cpp index 112dc715..2f5a8f3c 100644 --- a/src/backend/commands/session/wipe_session.cpp +++ b/src/backend/commands/session/wipe_session.cpp @@ -10,12 +10,13 @@ namespace big using command::command; virtual void execute(const command_arguments&, const std::shared_ptr ctx) override { - g_player_service->iterate([](const player_entry& player) { - auto mgr = *g_pointers->m_gta.m_network_player_mgr; - mgr->RemovePlayer(player.second->get_net_game_player()); - }); - g_notification_service->push_success("Empty Session", "Completed"); + const auto player_mgr = *g_pointers->m_gta.m_network_player_mgr; + for (const auto& plyr : g_player_service->players() | std::ranges::views::values) + { + player_mgr->RemovePlayer(plyr->get_net_game_player()); + } + g_notification_service->push("Empty Session", "Completed"); } }; - empty_session g_empty_session("emptysession", "Remove All Players From Session", "Removes everyone from the session", 0); + empty_session g_empty_session("emptysession", "EMPTY_SESSION", "Removes everyone from the session", 0); } \ No newline at end of file diff --git a/src/views/network/view_network.cpp b/src/views/network/view_network.cpp index 022cf38e..16770cf3 100644 --- a/src/views/network/view_network.cpp +++ b/src/views/network/view_network.cpp @@ -484,7 +484,7 @@ namespace big }, true, "TELEPORT"_T.data()); - components::command_button<"emptysession">({}, "EMPTY_SESSION"_T.data()); + components::command_button<"emptysession">(); components::sub_title("SCRIPT_HOST_FEATURES"_T); ImGui::Checkbox("DISABLE_CEO_MONEY"_T.data(), &g.session.block_ceo_money); From c2dd37c81507446110447cbda8abbae2fa75f0fa Mon Sep 17 00:00:00 2001 From: gir489 <100792176+gir489returns@users.noreply.github.com> Date: Mon, 11 Sep 2023 12:06:24 -0400 Subject: [PATCH 3/3] Add proper OOB calculation for CSectorDataNode. (#2103) --- scripts/gtav-classes.cmake | 2 +- src/hooks/protections/can_apply_data.cpp | 47 ++++++++++++++++++++---- 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/scripts/gtav-classes.cmake b/scripts/gtav-classes.cmake index 1ea126d6..55b80e5a 100644 --- a/scripts/gtav-classes.cmake +++ b/scripts/gtav-classes.cmake @@ -3,7 +3,7 @@ include(FetchContent) FetchContent_Declare( gtav_classes GIT_REPOSITORY https://github.com/Yimura/GTAV-Classes.git - GIT_TAG 0f88abb93d1499c04f440b77095ae4e02e5144ae + GIT_TAG 3c7763fcf996f53f891e40f12bbfa8115fd612a7 GIT_PROGRESS TRUE CONFIGURE_COMMAND "" BUILD_COMMAND "" diff --git a/src/hooks/protections/can_apply_data.cpp b/src/hooks/protections/can_apply_data.cpp index e843daff..b4777a0e 100644 --- a/src/hooks/protections/can_apply_data.cpp +++ b/src/hooks/protections/can_apply_data.cpp @@ -162,11 +162,11 @@ namespace big return false; } - inline bool is_sane_override_pos(float x, float y, float z) + inline bool is_invalid_override_pos(float x, float y) { - bool crash = ((int)round(fmaxf(0.0, (x + 149.0) - -8192.0) / 75.0)) == 255 || ((int)round(fmaxf(0.0, (y + 149.0) - -8192.0) / 75.0)) == 255; + bool crash = ((int)round(fmaxf(0.0, (x + 149.0) - -8192.0) / 75.0)) >= 255 || ((int)round(fmaxf(0.0, (y + 149.0) - -8192.0) / 75.0)) >= 255; - return !crash; + return crash; } inline std::string get_task_type_string(int type) @@ -1135,6 +1135,34 @@ namespace big return false; } + bool get_player_sector_pos(rage::netSyncNodeBase* node, float& x, float& y, rage::netObject* object) + { + if (node->IsParentNode()) + { + for (auto child = node->m_first_child; child; child = child->m_next_sibling) + { + if (get_player_sector_pos(child, x, y, object)) + return true; + } + } + else if (node->IsDataNode()) + { + const auto& node_id = sync_node_finder::find((eNetObjType)object->m_object_type, (uintptr_t)node); + + if ((((CProjectBaseSyncDataNode*)node)->flags & 1) == 0) + return false; + + if (node_id == sync_node_id("CPlayerSectorPosNode")) + { + CPlayerSectorPosNode* player_sector_pos_node = (CPlayerSectorPosNode*)(node); + x = player_sector_pos_node->m_sector_pos.x; + y = player_sector_pos_node->m_sector_pos.y; + return true; + } + } + return false; + } + bool check_node(rage::netSyncNodeBase* node, CNetGamePlayer* sender, rage::netObject* object) { if (node->IsParentNode()) @@ -1311,8 +1339,13 @@ namespace big } case sync_node_id("CSectorDataNode"): { + float player_sector_pos_x{}, player_sector_pos_y{}; + get_player_sector_pos(node->m_root->m_next_sync_node, player_sector_pos_x, player_sector_pos_y, object); + const auto sector_node = (CSectorDataNode*)(node); - if (sector_node->m_pos_x >= 711 || sector_node->m_pos_y >= 711) + int posX = (sector_node->m_pos_x - 512.0f) * 54.0f; + int posY = (sector_node->m_pos_y - 512.0f) * 54.0f; + if (is_invalid_override_pos(posX + player_sector_pos_x, posY + player_sector_pos_y)) { notify::crash_blocked(sender, "invalid sector position (sector node)"); return true; @@ -1323,9 +1356,7 @@ namespace big { const auto game_state_node = (CPlayerGameStateDataNode*)(node); if (game_state_node->m_is_overriding_population_control_sphere - && !is_sane_override_pos(game_state_node->m_population_control_sphere_x, - game_state_node->m_population_control_sphere_y, - game_state_node->m_population_control_sphere_z)) + && is_invalid_override_pos(game_state_node->m_population_control_sphere_x,game_state_node->m_population_control_sphere_y)) { if (gta_util::get_network()->m_game_session_ptr->is_host()) notify::crash_blocked(sender, "invalid sector position (player game state node)"); @@ -1525,7 +1556,7 @@ namespace big case sync_node_id("CPlayerCameraDataNode"): { const auto camera_node = (CPlayerCameraDataNode*)(node); - if (!is_sane_override_pos(camera_node->m_free_cam_pos_x, camera_node->m_free_cam_pos_y, camera_node->m_free_cam_pos_z)) + if (is_invalid_override_pos(camera_node->m_free_cam_pos_x, camera_node->m_free_cam_pos_y)) { if (gta_util::get_network()->m_game_session_ptr->is_host()) notify::crash_blocked(sender, "invalid sector position (camera data node)");