]> git.lizzy.rs Git - minetest.git/blobdiff - src/clientiface.h
Fix Enter key after creating a new world (#12997)
[minetest.git] / src / clientiface.h
index bf95df4a8a126d079fbca266db2cf17dfd869159..3d84944ea448e062268642d36956b082b273aa1c 100644 (file)
@@ -25,11 +25,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "serialization.h"             // for SER_FMT_VER_INVALID
 #include "network/networkpacket.h"
 #include "network/networkprotocol.h"
+#include "network/address.h"
 #include "porting.h"
+#include "threading/mutex_auto_lock.h"
 
 #include <list>
 #include <vector>
 #include <set>
+#include <memory>
 #include <mutex>
 
 class MapBlock;
@@ -188,7 +191,6 @@ enum ClientStateEvent
 {
        CSE_Hello,
        CSE_AuthAccept,
-       CSE_InitLegacy,
        CSE_GotInit2,
        CSE_SetDenied,
        CSE_SetDefinitionsSent,
@@ -241,6 +243,8 @@ class RemoteClient
        u32 allowed_auth_mechs = 0;
        u32 allowed_sudo_mechs = 0;
 
+       void resetChosenMech();
+
        bool isSudoMechAllowed(AuthMechanism mech)
        { return allowed_sudo_mechs & mech; }
        bool isMechAllowed(AuthMechanism mech)
@@ -338,7 +342,14 @@ class RemoteClient
        u8 getMajor() const { return m_version_major; }
        u8 getMinor() const { return m_version_minor; }
        u8 getPatch() const { return m_version_patch; }
-       const std::string &getFull() const { return m_full_version; }
+       const std::string &getFullVer() const { return m_full_version; }
+
+       void setLangCode(const std::string &code) { m_lang_code = code; }
+       const std::string &getLangCode() const { return m_lang_code; }
+
+       void setCachedAddress(const Address &addr) { m_addr = addr; }
+       const Address &getAddress() const { return m_addr; }
+
 private:
        // Version is stored in here after INIT before INIT2
        u8 m_pending_serialization_version = SER_FMT_VER_INVALID;
@@ -346,6 +357,12 @@ class RemoteClient
        /* current state of client */
        ClientState m_state = CS_Created;
 
+       // Cached here so retrieval doesn't have to go to connection API
+       Address m_addr;
+
+       // Client sent language code
+       std::string m_lang_code;
+
        /*
                Blocks that have been sent to client.
                - These don't have to be sent again.
@@ -358,7 +375,7 @@ class RemoteClient
        std::set<v3s16> m_blocks_sent;
        s16 m_nearest_unsent_d = 0;
        v3s16 m_last_center;
-       float m_nearest_unsent_reset_timer = 0.0f;
+       v3f m_last_camera_dir;
 
        const u16 m_max_simul_sends;
        const float m_min_time_from_building;
@@ -378,10 +395,10 @@ class RemoteClient
        std::map<v3s16, float> m_blocks_sending;
 
        /*
-               Blocks that have been modified since last sending them.
-               These blocks will not be marked as sent, even if the
-               client reports it has received them to account for blocks
-               that are being modified while on the line.
+               Blocks that have been modified since blocks were
+               sent to the client last (getNextBlocks()).
+               This is used to reset the unsent distance, so that
+               modified blocks are resent to the client.
 
                List of block positions.
        */
@@ -392,7 +409,7 @@ class RemoteClient
                There is an excess amount because the client sometimes
                gets a block so late that the server sends it again,
                and the client then sends two GOTBLOCKs.
-               This is resetted by PrintInfo()
+               This is reset by PrintInfo()
        */
        u32 m_excess_gotblocks = 0;
 
@@ -406,7 +423,7 @@ class RemoteClient
 
        /*
                client information
-        */
+       */
        u8 m_version_major = 0;
        u8 m_version_minor = 0;
        u8 m_version_patch = 0;
@@ -451,7 +468,6 @@ class ClientInterface {
 
        /* send to all clients */
        void sendToAll(NetworkPacket *pkt);
-       void sendToAllCompat(NetworkPacket *pkt, NetworkPacket *legacypkt, u16 min_proto_ver);
 
        /* delete a client */
        void DeleteClient(session_t peer_id);
@@ -490,9 +506,13 @@ class ClientInterface {
 
        static std::string state2Name(ClientState state);
 protected:
-       //TODO find way to avoid this functions
-       void lock() { m_clients_mutex.lock(); }
-       void unlock() { m_clients_mutex.unlock(); }
+       class AutoLock {
+       public:
+               AutoLock(ClientInterface &iface): m_lock(iface.m_clients_mutex) {}
+
+       private:
+               RecursiveMutexAutoLock m_lock;
+       };
 
        RemoteClientMap& getClientList() { return m_clients; }