From: SmallJoker Date: Fri, 9 Sep 2016 05:03:36 +0000 (+0200) Subject: Anticheat: Use the physics_override modifiers aswell X-Git-Tag: 0.4.15~243 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=c0cd7aa351fc59a6f699c6f945673f02f02e8c32;p=oweals%2Fminetest.git Anticheat: Use the physics_override modifiers aswell --- diff --git a/src/content_sao.cpp b/src/content_sao.cpp index 937363b76..1e7e788e9 100644 --- a/src/content_sao.cpp +++ b/src/content_sao.cpp @@ -1326,52 +1326,52 @@ std::string PlayerSAO::getPropertyPacket() bool PlayerSAO::checkMovementCheat() { - bool cheated = false; - if(isAttached() || m_is_singleplayer || - g_settings->getBool("disable_anticheat")) - { + if (isAttached() || m_is_singleplayer || + g_settings->getBool("disable_anticheat")) { m_last_good_position = m_player->getPosition(); + return false; } - else - { - /* - Check player movements - - NOTE: Actually the server should handle player physics like the - client does and compare player's position to what is calculated - on our side. This is required when eg. players fly due to an - explosion. Altough a node-based alternative might be possible - too, and much more lightweight. - */ - - float player_max_speed = 0; - if(m_privs.count("fast") != 0){ - // Fast speed - player_max_speed = m_player->movement_speed_fast; - } else { - // Normal speed - player_max_speed = m_player->movement_speed_walk; - } - // Tolerance. With the lag pool we shouldn't need it. - //player_max_speed *= 2.5; - //player_max_speed_up *= 2.5; - - v3f diff = (m_player->getPosition() - m_last_good_position); - float d_vert = diff.Y; - diff.Y = 0; - float d_horiz = diff.getLength(); - float required_time = d_horiz/player_max_speed; - if(d_vert > 0 && d_vert/player_max_speed > required_time) - required_time = d_vert/player_max_speed; - if(m_move_pool.grab(required_time)){ - m_last_good_position = m_player->getPosition(); - } else { - actionstream<<"Player "<getName() - <<" moved too fast; resetting position" - <setPosition(m_last_good_position); - cheated = true; - } + + bool cheated = false; + /* + Check player movements + + NOTE: Actually the server should handle player physics like the + client does and compare player's position to what is calculated + on our side. This is required when eg. players fly due to an + explosion. Altough a node-based alternative might be possible + too, and much more lightweight. + */ + + float player_max_speed = 0; + + if (m_privs.count("fast") != 0) { + // Fast speed + player_max_speed = m_player->movement_speed_fast * m_physics_override_speed; + } else { + // Normal speed + player_max_speed = m_player->movement_speed_walk * m_physics_override_speed; + } + // Tolerance. The lag pool does this a bit. + //player_max_speed *= 2.5; + + v3f diff = (m_player->getPosition() - m_last_good_position); + float d_vert = diff.Y; + diff.Y = 0; + float d_horiz = diff.getLength(); + float required_time = d_horiz / player_max_speed; + + if (d_vert > 0 && d_vert / player_max_speed > required_time) + required_time = d_vert / player_max_speed; // Moving upwards + + if (m_move_pool.grab(required_time)) { + m_last_good_position = m_player->getPosition(); + } else { + actionstream << "Player " << m_player->getName() + << " moved too fast; resetting position" + << std::endl; + m_player->setPosition(m_last_good_position); + cheated = true; } return cheated; }