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)
|
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)
|
inline std::string get_task_type_string(int type)
|
||||||
@ -1338,6 +1341,8 @@ namespace big
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case sync_node_id("CSectorDataNode"):
|
case sync_node_id("CSectorDataNode"):
|
||||||
|
{
|
||||||
|
if ((eNetObjType)object->m_object_type == eNetObjType::NET_OBJ_TYPE_PLAYER)
|
||||||
{
|
{
|
||||||
float player_sector_pos_x{}, player_sector_pos_y{};
|
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);
|
get_player_sector_pos(node->m_root->m_next_sync_node, player_sector_pos_x, player_sector_pos_y, object);
|
||||||
@ -1347,9 +1352,12 @@ namespace big
|
|||||||
int posY = (sector_node->m_pos_y - 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 (is_invalid_override_pos(posX + player_sector_pos_x, posY + player_sector_pos_y))
|
||||||
{
|
{
|
||||||
notify::crash_blocked(sender, "invalid sector position (sector node)");
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case sync_node_id("CPlayerGameStateDataNode"):
|
case sync_node_id("CPlayerGameStateDataNode"):
|
||||||
|
Reference in New Issue
Block a user