Refine movement anticheat again ()

* Account for walking speed in vertical dir
* Avoid undefined behaviour due to division-by-zero
This commit is contained in:
sfan5 2018-02-02 23:34:09 +01:00 committed by SmallJoker
parent 49b65a5593
commit cf0bcebc76

@ -1414,6 +1414,12 @@ bool PlayerSAO::checkMovementCheat()
// until this can be verified correctly, tolerate higher jumping speeds // until this can be verified correctly, tolerate higher jumping speeds
player_max_jump *= 2.0; player_max_jump *= 2.0;
// Don't divide by zero!
if (player_max_walk < 0.0001f)
player_max_walk = 0.0001f;
if (player_max_jump < 0.0001f)
player_max_jump = 0.0001f;
v3f diff = (m_base_position - m_last_good_position); v3f diff = (m_base_position - m_last_good_position);
float d_vert = diff.Y; float d_vert = diff.Y;
diff.Y = 0; diff.Y = 0;
@ -1422,8 +1428,11 @@ bool PlayerSAO::checkMovementCheat()
// FIXME: Checking downwards movement is not easily possible currently, // FIXME: Checking downwards movement is not easily possible currently,
// the server could calculate speed differences to examine the gravity // the server could calculate speed differences to examine the gravity
if (d_vert > 0) if (d_vert > 0) {
required_time = MYMAX(required_time, d_vert / player_max_jump); // In certain cases (water, ladders) walking speed is applied vertically
float s = MYMAX(player_max_jump, player_max_walk);
required_time = MYMAX(required_time, d_vert / s);
}
if (m_move_pool.grab(required_time)) { if (m_move_pool.grab(required_time)) {
m_last_good_position = m_base_position; m_last_good_position = m_base_position;