fix: CPlayerSectorPos false positives and bad math (#2136)
* Closes #2096
This commit is contained in:
parent
3e65e02eda
commit
a4209c1b23
@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user