]> git.lizzy.rs Git - minetest.git/blobdiff - src/clientiface.cpp
Increase defaults for viewing_range, active_object_range and related settings #10597
[minetest.git] / src / clientiface.cpp
index a55e0f7b55907795522118464d04f32a48893164..f5e32469bb154713df2f50debb440c55b5f8049b 100644 (file)
@@ -27,7 +27,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "serverenvironment.h"
 #include "map.h"
 #include "emerge.h"
-#include "content_sao.h"              // TODO this is used for cleanup of only
+#include "server/luaentity_sao.h"
+#include "server/player_sao.h"
 #include "log.h"
 #include "util/srp.h"
 #include "face_position_cache.h"
@@ -79,10 +80,11 @@ LuaEntitySAO *getAttachedObject(PlayerSAO *sao, ServerEnvironment *env)
        int id;
        std::string bone;
        v3f dummy;
-       sao->getAttachment(&id, &bone, &dummy, &dummy);
+       bool force_visible;
+       sao->getAttachment(&id, &bone, &dummy, &dummy, &force_visible);
        ServerActiveObject *ao = env->getActiveObject(id);
        while (id && ao) {
-               ao->getAttachment(&id, &bone, &dummy, &dummy);
+               ao->getAttachment(&id, &bone, &dummy, &dummy, &force_visible);
                if (id)
                        ao = env->getActiveObject(id);
        }
@@ -97,7 +99,6 @@ void RemoteClient::GetNextBlocks (
 {
        // Increment timers
        m_nothing_to_send_pause_timer -= dtime;
-       m_nearest_unsent_reset_timer += dtime;
 
        if (m_nothing_to_send_pause_timer >= 0)
                return;
@@ -137,34 +138,6 @@ void RemoteClient::GetNextBlocks (
        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;*/
-
-       /*
-               Get the starting value of the block finder radius.
-       */
-
-       if (m_last_center != center) {
-               m_nearest_unsent_d = 0;
-               m_last_center = center;
-       }
-
-       /*infostream<<"m_nearest_unsent_reset_timer="
-                       <<m_nearest_unsent_reset_timer<<std::endl;*/
-
-       // Reset periodically to workaround for some bugs or stuff
-       if (m_nearest_unsent_reset_timer > 20.0f) {
-               m_nearest_unsent_reset_timer = 0.0f;
-               m_nearest_unsent_d = 0;
-               //infostream<<"Resetting m_nearest_unsent_d for "
-               //              <<server->getPlayerName(peer_id)<<std::endl;
-       }
-
-       //s16 last_nearest_unsent_d = m_nearest_unsent_d;
-       s16 d_start = m_nearest_unsent_d;
-
-       //infostream<<"d_start="<<d_start<<std::endl;
-
        u16 max_simul_sends_usually = m_max_simul_sends;
 
        /*
@@ -196,6 +169,29 @@ void RemoteClient::GetNextBlocks (
        s16 wanted_range = sao->getWantedRange() + 1;
        float camera_fov = sao->getFov();
 
+       /*
+               Get the starting value of the block finder radius.
+       */
+       if (m_last_center != center) {
+               m_nearest_unsent_d = 0;
+               m_last_center = center;
+       }
+       // reset the unsent distance if the view angle has changed more that 10% of the fov
+       // (this matches isBlockInSight which allows for an extra 10%)
+       if (camera_dir.dotProduct(m_last_camera_dir) < std::cos(camera_fov * 0.1f)) {
+               m_nearest_unsent_d = 0;
+               m_last_camera_dir = camera_dir;
+       }
+       if (m_nearest_unsent_d > 0) {
+               // make sure any blocks modified since the last time we sent blocks are resent
+               for (const v3s16 &p : m_blocks_modified) {
+                       m_nearest_unsent_d = std::min(m_nearest_unsent_d, center.getDistanceFrom(p));
+               }
+       }
+       m_blocks_modified.clear();
+
+       s16 d_start = m_nearest_unsent_d;
+
        // 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.
@@ -210,16 +206,9 @@ void RemoteClient::GetNextBlocks (
                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, prop_zoom_fov),
                wanted_range);
 
-       // Don't loop very much at a time, adjust with distance,
-       // do more work per RTT with greater distances.
-       s16 max_d_increment_at_time = full_d_max / 9 + 1;
-       if (d_max > d_start + max_d_increment_at_time)
-               d_max = d_start + max_d_increment_at_time;
-
        // cos(angle between velocity and camera) * |velocity|
        // Limit to 0.0f in case player moves backwards.
        f32 dot = rangelim(camera_dir.dotProduct(playerspeed), 0.0f, 300.0f);
@@ -236,7 +225,7 @@ void RemoteClient::GetNextBlocks (
        const v3s16 cam_pos_nodes = floatToInt(camera_pos, BS);
 
        s16 d;
-       for (d = d_start; d <= d_max; d++) {
+       for (d = d_start; d <= full_d_max; d++) {
                /*
                        Get the border/face dot coordinates of a "d-radiused"
                        box
@@ -343,10 +332,10 @@ void RemoteClient::GetNextBlocks (
                        }
 
                        /*
-                               If block has been marked to not exist on disk (dummy)
-                               and generating new ones is not wanted, skip block.
+                               If block has been marked to not exist on disk (dummy) or is
+                               not generated and generating new ones is not wanted, skip block.
                        */
-                       if (!generate && surely_not_found_on_disk) {
+                       if (!generate && (surely_not_found_on_disk || block_is_invalid)) {
                                // get next one.
                                continue;
                        }
@@ -407,21 +396,18 @@ void RemoteClient::GetNextBlocks (
 
 void RemoteClient::GotBlock(v3s16 p)
 {
-       if (m_blocks_modified.find(p) == m_blocks_modified.end()) {
-               if (m_blocks_sending.find(p) != m_blocks_sending.end())
-                       m_blocks_sending.erase(p);
-               else
-                       m_excess_gotblocks++;
-
+       if (m_blocks_sending.find(p) != m_blocks_sending.end()) {
+               m_blocks_sending.erase(p);
+               // only add to sent blocks if it actually was sending
+               // (it might have been modified since)
                m_blocks_sent.insert(p);
+       } else {
+               m_excess_gotblocks++;
        }
 }
 
 void RemoteClient::SentBlock(v3s16 p)
 {
-       if (m_blocks_modified.find(p) != m_blocks_modified.end())
-               m_blocks_modified.erase(p);
-
        if (m_blocks_sending.find(p) == m_blocks_sending.end())
                m_blocks_sending[p] = 0.0f;
        else
@@ -431,29 +417,24 @@ void RemoteClient::SentBlock(v3s16 p)
 
 void RemoteClient::SetBlockNotSent(v3s16 p)
 {
-       m_nearest_unsent_d = 0;
        m_nothing_to_send_pause_timer = 0;
 
-       if (m_blocks_sending.find(p) != m_blocks_sending.end())
-               m_blocks_sending.erase(p);
-       if (m_blocks_sent.find(p) != m_blocks_sent.end())
-               m_blocks_sent.erase(p);
-       m_blocks_modified.insert(p);
+       // remove the block from sending and sent sets,
+       // and mark as modified if found
+       if (m_blocks_sending.erase(p) + m_blocks_sent.erase(p) > 0)
+               m_blocks_modified.insert(p);
 }
 
 void RemoteClient::SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks)
 {
-       m_nearest_unsent_d = 0;
        m_nothing_to_send_pause_timer = 0;
 
        for (auto &block : blocks) {
                v3s16 p = block.first;
-               m_blocks_modified.insert(p);
-
-               if (m_blocks_sending.find(p) != m_blocks_sending.end())
-                       m_blocks_sending.erase(p);
-               if (m_blocks_sent.find(p) != m_blocks_sent.end())
-                       m_blocks_sent.erase(p);
+               // remove the block from sending and sent sets,
+               // and mark as modified if found
+               if (m_blocks_sending.erase(p) + m_blocks_sent.erase(p) > 0)
+                       m_blocks_modified.insert(p);
        }
 }
 
@@ -636,7 +617,7 @@ ClientInterface::~ClientInterface()
                Delete clients
        */
        {
-               MutexAutoLock clientslock(m_clients_mutex);
+               RecursiveMutexAutoLock clientslock(m_clients_mutex);
 
                for (auto &client_it : m_clients) {
                        // Delete client
@@ -648,7 +629,7 @@ ClientInterface::~ClientInterface()
 std::vector<session_t> ClientInterface::getClientIDs(ClientState min_state)
 {
        std::vector<session_t> reply;
-       MutexAutoLock clientslock(m_clients_mutex);
+       RecursiveMutexAutoLock clientslock(m_clients_mutex);
 
        for (const auto &m_client : m_clients) {
                if (m_client.second->getState() >= min_state)
@@ -660,7 +641,7 @@ std::vector<session_t> ClientInterface::getClientIDs(ClientState min_state)
 
 void ClientInterface::markBlockposAsNotSent(const v3s16 &pos)
 {
-       MutexAutoLock clientslock(m_clients_mutex);
+       RecursiveMutexAutoLock clientslock(m_clients_mutex);
        for (const auto &client : m_clients) {
                if (client.second->getState() >= CS_Active)
                        client.second->SetBlockNotSent(pos);
@@ -705,7 +686,7 @@ void ClientInterface::UpdatePlayerList()
                        infostream << "* " << player->getName() << "\t";
 
                        {
-                               MutexAutoLock clientslock(m_clients_mutex);
+                               RecursiveMutexAutoLock clientslock(m_clients_mutex);
                                RemoteClient* client = lockedGetClientNoEx(i);
                                if (client)
                                        client->PrintInfo(infostream);
@@ -724,7 +705,7 @@ void ClientInterface::send(session_t peer_id, u8 channelnum,
 
 void ClientInterface::sendToAll(NetworkPacket *pkt)
 {
-       MutexAutoLock clientslock(m_clients_mutex);
+       RecursiveMutexAutoLock clientslock(m_clients_mutex);
        for (auto &client_it : m_clients) {
                RemoteClient *client = client_it.second;
 
@@ -739,7 +720,7 @@ void ClientInterface::sendToAll(NetworkPacket *pkt)
 void ClientInterface::sendToAllCompat(NetworkPacket *pkt, NetworkPacket *legacypkt,
                u16 min_proto_ver)
 {
-       MutexAutoLock clientslock(m_clients_mutex);
+       RecursiveMutexAutoLock clientslock(m_clients_mutex);
        for (auto &client_it : m_clients) {
                RemoteClient *client = client_it.second;
                NetworkPacket *pkt_to_send = nullptr;
@@ -763,7 +744,7 @@ void ClientInterface::sendToAllCompat(NetworkPacket *pkt, NetworkPacket *legacyp
 
 RemoteClient* ClientInterface::getClientNoEx(session_t peer_id, ClientState state_min)
 {
-       MutexAutoLock clientslock(m_clients_mutex);
+       RecursiveMutexAutoLock clientslock(m_clients_mutex);
        RemoteClientMap::const_iterator n = m_clients.find(peer_id);
        // The client may not exist; clients are immediately removed if their
        // access is denied, and this event occurs later then.
@@ -792,7 +773,7 @@ RemoteClient* ClientInterface::lockedGetClientNoEx(session_t peer_id, ClientStat
 
 ClientState ClientInterface::getClientState(session_t peer_id)
 {
-       MutexAutoLock clientslock(m_clients_mutex);
+       RecursiveMutexAutoLock clientslock(m_clients_mutex);
        RemoteClientMap::const_iterator n = m_clients.find(peer_id);
        // The client may not exist; clients are immediately removed if their
        // access is denied, and this event occurs later then.
@@ -804,7 +785,7 @@ ClientState ClientInterface::getClientState(session_t peer_id)
 
 void ClientInterface::setPlayerName(session_t peer_id, const std::string &name)
 {
-       MutexAutoLock clientslock(m_clients_mutex);
+       RecursiveMutexAutoLock clientslock(m_clients_mutex);
        RemoteClientMap::iterator n = m_clients.find(peer_id);
        // The client may not exist; clients are immediately removed if their
        // access is denied, and this event occurs later then.
@@ -814,7 +795,7 @@ void ClientInterface::setPlayerName(session_t peer_id, const std::string &name)
 
 void ClientInterface::DeleteClient(session_t peer_id)
 {
-       MutexAutoLock conlock(m_clients_mutex);
+       RecursiveMutexAutoLock conlock(m_clients_mutex);
 
        // Error check
        RemoteClientMap::iterator n = m_clients.find(peer_id);
@@ -844,7 +825,7 @@ void ClientInterface::DeleteClient(session_t peer_id)
 
 void ClientInterface::CreateClient(session_t peer_id)
 {
-       MutexAutoLock conlock(m_clients_mutex);
+       RecursiveMutexAutoLock conlock(m_clients_mutex);
 
        // Error check
        RemoteClientMap::iterator n = m_clients.find(peer_id);
@@ -860,7 +841,7 @@ void ClientInterface::CreateClient(session_t peer_id)
 void ClientInterface::event(session_t peer_id, ClientStateEvent event)
 {
        {
-               MutexAutoLock clientlock(m_clients_mutex);
+               RecursiveMutexAutoLock clientlock(m_clients_mutex);
 
                // Error check
                RemoteClientMap::iterator n = m_clients.find(peer_id);
@@ -881,7 +862,7 @@ void ClientInterface::event(session_t peer_id, ClientStateEvent event)
 
 u16 ClientInterface::getProtocolVersion(session_t peer_id)
 {
-       MutexAutoLock conlock(m_clients_mutex);
+       RecursiveMutexAutoLock conlock(m_clients_mutex);
 
        // Error check
        RemoteClientMap::iterator n = m_clients.find(peer_id);
@@ -896,7 +877,7 @@ u16 ClientInterface::getProtocolVersion(session_t peer_id)
 void ClientInterface::setClientVersion(session_t peer_id, u8 major, u8 minor, u8 patch,
                const std::string &full)
 {
-       MutexAutoLock conlock(m_clients_mutex);
+       RecursiveMutexAutoLock conlock(m_clients_mutex);
 
        // Error check
        RemoteClientMap::iterator n = m_clients.find(peer_id);