Anticheat: Use the physics_override modifiers aswell
authorSmallJoker <SmallJoker@users.noreply.github.com>
Fri, 9 Sep 2016 05:03:36 +0000 (07:03 +0200)
committerkwolekr <kwolekr@minetest.net>
Fri, 9 Sep 2016 05:03:36 +0000 (01:03 -0400)
src/content_sao.cpp

index 937363b763035fcf4b5de54d92cb8abc54dd5cdc..1e7e788e9dd9da21671d6347fb4bdef3ed1e6ad1 100644 (file)
@@ -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 "<<m_player->getName()
-                                       <<" moved too fast; resetting position"
-                                       <<std::endl;
-                       m_player->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;
 }