]> git.lizzy.rs Git - minetest.git/blobdiff - src/content_sao.cpp
Switch F3 to use 'enable_fog' setting
[minetest.git] / src / content_sao.cpp
index 61384493ac954e8428013e29129ce9efd5fff33d..247b6df0ab9bcaa669a79c801945622932fa7186 100644 (file)
@@ -28,6 +28,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "server.h"
 #include "scripting_server.h"
 #include "genericobject.h"
+#include "settings.h"
 #include <algorithm>
 
 std::map<u16, ServerActiveObject::Factory> ServerActiveObject::m_types;
@@ -801,7 +802,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p
        m_prop.collisionbox = aabb3f(-0.3f, 0.0f, -0.3f, 0.3f, 1.77f, 0.3f);
        m_prop.selectionbox = aabb3f(-0.3f, 0.0f, -0.3f, 0.3f, 1.77f, 0.3f);
        m_prop.pointable = true;
-       // start of default appearance, this should be overwritten by LUA
+       // Start of default appearance, this should be overwritten by Lua
        m_prop.visual = "upright_sprite";
        m_prop.visual_size = v2f(1, 2);
        m_prop.textures.clear();
@@ -811,13 +812,14 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p
        m_prop.colors.emplace_back(255, 255, 255, 255);
        m_prop.spritediv = v2s16(1,1);
        m_prop.eye_height = 1.625f;
-       // end of default appearance
+       // End of default appearance
        m_prop.is_visible = true;
        m_prop.makes_footstep_sound = true;
        m_prop.stepheight = PLAYER_DEFAULT_STEPHEIGHT * BS;
-       m_prop.can_zoom = true;
        m_hp = m_prop.hp_max;
        m_breath = m_prop.breath_max;
+       // Disable zoom in survival mode using a value of 0
+       m_prop.zoom_fov = g_settings->getBool("creative_mode") ? 15.0f : 0.0f;
 }
 
 PlayerSAO::~PlayerSAO()
@@ -1399,26 +1401,38 @@ bool PlayerSAO::checkMovementCheat()
                too, and much more lightweight.
        */
 
-       float player_max_speed = 0;
+       float player_max_walk = 0; // horizontal movement
+       float player_max_jump = 0; // vertical upwards movement
 
-       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;
+       if (m_privs.count("fast") != 0)
+               player_max_walk = m_player->movement_speed_fast; // Fast speed
+       else
+               player_max_walk = m_player->movement_speed_walk; // Normal speed
+       player_max_walk *= m_physics_override_speed;
+       player_max_jump = m_player->movement_speed_jump * m_physics_override_jump;
+       // FIXME: Bouncy nodes cause practically unbound increase in Y speed,
+       //        until this can be verified correctly, tolerate higher jumping speeds
+       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);
        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
+       float required_time = d_horiz / player_max_walk;
+
+       // FIXME: Checking downwards movement is not easily possible currently,
+       //        the server could calculate speed differences to examine the gravity
+       if (d_vert > 0) {
+               // 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)) {
                m_last_good_position = m_base_position;