From a4209c1b239af3685e7c72414da68c521107aef0 Mon Sep 17 00:00:00 2001 From: gir489 <100792176+gir489returns@users.noreply.github.com> Date: Sun, 17 Sep 2023 16:18:20 -0400 Subject: [PATCH] fix: CPlayerSectorPos false positives and bad math (#2136) * Closes #2096 --- src/hooks/protections/can_apply_data.cpp | 30 +++++++++++++++--------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/hooks/protections/can_apply_data.cpp b/src/hooks/protections/can_apply_data.cpp index b4777a0e..87dfe8fc 100644 --- a/src/hooks/protections/can_apply_data.cpp +++ b/src/hooks/protections/can_apply_data.cpp @@ -164,9 +164,12 @@ namespace big 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; + std::uint32_t x_pos = (((x + 149) + 8192) / 75); + std::uint32_t y_pos = (((y + 149) + 8192) / 75); + bool is_x_invalid = x_pos >= UCHAR_MAX; + bool is_y_invalid = y_pos >= UCHAR_MAX; - return crash; + return is_x_invalid || is_y_invalid; } inline std::string get_task_type_string(int type) @@ -1339,16 +1342,21 @@ 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); - 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)) + if ((eNetObjType)object->m_object_type == eNetObjType::NET_OBJ_TYPE_PLAYER) { - notify::crash_blocked(sender, "invalid sector position (sector node)"); - return true; + 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); + 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)) + { + std::stringstream crash_reason; + crash_reason << "invalid sector position (sector node)" << " X: " << posX << " Y: " << posY << " player_sector_pos_x: " << player_sector_pos_x << " player_sector_pos_y: " << player_sector_pos_y; + notify::crash_blocked(sender, crash_reason.str().c_str()); + return true; + } } break; }