Use server's zoom fov for distant world loading.
authorLars Hofhansl <larsh@apache.org>
Wed, 16 May 2018 01:49:11 +0000 (18:49 -0700)
committerLars Hofhansl <larsh@apache.org>
Wed, 16 May 2018 01:49:11 +0000 (18:49 -0700)
src/clientiface.cpp
src/util/numeric.cpp

index 8c429976be025cc650f35c0765d7ff3893f60b79..cc52d1fbc57e61d82f96caeb44083c76a83ccfdc 100644 (file)
@@ -196,30 +196,19 @@ void RemoteClient::GetNextBlocks (
        s16 wanted_range = sao->getWantedRange() + 1;
        float camera_fov = sao->getFov();
 
-       // If below the heuristic zoom threshold (see adjustDist() in numeric.cpp)
-       // distrust client-sent FOV and get server-set player object property
+       // Distrust client-sent FOV and get server-set player object property
        // zoom FOV (degrees) as a check to avoid hacked clients using FOV to load
        // distant world.
-       // 0.888 radians is slightly larger than the zoom threshold of 1.775 / 2
-       // radians.
-       if (camera_fov < 0.888f) {
-               float prop_zoom_fov = sao->getZoomFOV();
-               // If zoom is disabled by value 0
-               if (prop_zoom_fov < 0.001f)
-                       camera_fov = 0.888f;
-               else
-                       // Degrees -> radians
-                       camera_fov = prop_zoom_fov * core::DEGTORAD;
-       }
+       float prop_zoom_fov = sao->getZoomFOV() * core::DEGTORAD;
 
-       const s16 full_d_max = std::min(adjustDist(m_max_send_distance, camera_fov),
+       const s16 full_d_max = std::min(adjustDist(m_max_send_distance, prop_zoom_fov),
                wanted_range);
-       const s16 d_opt = std::min(adjustDist(m_block_optimize_distance, camera_fov),
+       const s16 d_opt = std::min(adjustDist(m_block_optimize_distance, prop_zoom_fov),
                wanted_range);
        const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
 
        s16 d_max = full_d_max;
-       s16 d_max_gen = std::min(adjustDist(m_max_gen_distance, camera_fov),
+       s16 d_max_gen = std::min(adjustDist(m_max_gen_distance, prop_zoom_fov),
                wanted_range);
 
        // Don't loop very much at a time, adjust with distance,
index 7264e5f89909a35e8bb8d657830ee3c79c9a7bfa..d878a3f6043be5734d861d7183816da0f176b275 100644 (file)
@@ -168,7 +168,7 @@ s16 adjustDist(s16 dist, float zoom_fov)
        // 1.775 ~= 72 * PI / 180 * 1.4, the default FOV on the client.
        // The heuristic threshold for zooming is half of that.
        static constexpr const float threshold_fov = 1.775f / 2.0f;
-       if (zoom_fov > threshold_fov)
+       if (zoom_fov < 0.001f || zoom_fov > threshold_fov)
                return dist;
 
        return std::round(dist * std::cbrt((1.0f - std::cos(threshold_fov)) /