]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/clientiface.cpp
Send only changed node metadata to clients instead of whole mapblock (#5268)
[dragonfireclient.git] / src / clientiface.cpp
index a3c44fb9e17468532e545dd5e3792b76f4925ae9..a55e0f7b55907795522118464d04f32a48893164 100644 (file)
@@ -134,8 +134,8 @@ void RemoteClient::GetNextBlocks (
        // Camera position and direction
        v3f camera_pos = sao->getEyePosition();
        v3f camera_dir = v3f(0,0,1);
-       camera_dir.rotateYZBy(sao->getPitch());
-       camera_dir.rotateXZBy(sao->getYaw());
+       camera_dir.rotateYZBy(sao->getLookPitch());
+       camera_dir.rotateXZBy(sao->getRotation().Y);
 
        /*infostream<<"camera_dir=("<<camera_dir.X<<","<<camera_dir.Y<<","
                        <<camera_dir.Z<<")"<<std::endl;*/
@@ -192,17 +192,27 @@ void RemoteClient::GetNextBlocks (
        */
        s32 new_nearest_unsent_d = -1;
 
-       // get view range and camera fov from the client
+       // Get view range and camera fov (radians) from the client
        s16 wanted_range = sao->getWantedRange() + 1;
        float camera_fov = sao->getFov();
 
-       const s16 full_d_max = std::min(adjustDist(m_max_send_distance, camera_fov), wanted_range);
-       const s16 d_opt = std::min(adjustDist(m_block_optimize_distance, camera_fov), wanted_range);
+       // 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.
+       // (zoom is disabled by value 0)
+       float prop_zoom_fov = sao->getZoomFOV() < 0.001f ?
+               0.0f :
+               std::max(camera_fov, sao->getZoomFOV() * core::DEGTORAD);
+
+       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, prop_zoom_fov),
+               wanted_range);
        const s16 d_blocks_in_sight = full_d_max * BS * MAP_BLOCKSIZE;
-       //infostream << "Fov from client " << camera_fov << " full_d_max " << full_d_max << std::endl;
 
        s16 d_max = full_d_max;
-       s16 d_max_gen = std::min(adjustDist(m_max_gen_distance, camera_fov), wanted_range);
+       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,
        // do more work per RTT with greater distances.
@@ -322,7 +332,7 @@ void RemoteClient::GetNextBlocks (
                                        differs from day-time mesh.
                                */
                                if (d >= d_opt) {
-                                       if (!block->getDayNightDiff())
+                                       if (!block->getIsUnderground() && !block->getDayNightDiff())
                                                continue;
                                }
 
@@ -648,6 +658,15 @@ std::vector<session_t> ClientInterface::getClientIDs(ClientState min_state)
        return reply;
 }
 
+void ClientInterface::markBlockposAsNotSent(const v3s16 &pos)
+{
+       MutexAutoLock clientslock(m_clients_mutex);
+       for (const auto &client : m_clients) {
+               if (client.second->getState() >= CS_Active)
+                       client.second->SetBlockNotSent(pos);
+       }
+}
+
 /**
  * Verify if user limit was reached.
  * User limit count all clients from HelloSent state (MT protocol user) to Active state