Modernize client code (#6250)
[oweals/minetest.git] / src / clientiface.h
index a219ed5fc364ddff0ab6e9ea05759fb11aabbda9..ce74cfeced0ee42b4fa64278f5d0312dde9f5ccd 100644 (file)
@@ -23,14 +23,13 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #include "constants.h"
 #include "serialization.h"             // for SER_FMT_VER_INVALID
-#include "threading/mutex.h"
 #include "network/networkpacket.h"
-#include "util/cpp11_container.h"
 #include "porting.h"
 
 #include <list>
 #include <vector>
 #include <set>
+#include <mutex>
 
 class MapBlock;
 class ServerEnvironment;
@@ -227,51 +226,27 @@ public:
        // NOTE: If client is made allowed to exist while peer doesn't,
        //       this has to be set to 0 when there is no peer.
        //       Also, the client must be moved to some other container.
-       u16 peer_id;
+       u16 peer_id = PEER_ID_INEXISTENT;
        // The serialization version to use with the client
-       u8 serialization_version;
+       u8 serialization_version = SER_FMT_VER_INVALID;
        //
-       u16 net_proto_version;
+       u16 net_proto_version = 0;
 
        /* Authentication information */
-       std::string enc_pwd;
-       bool create_player_on_auth_success;
-       AuthMechanism chosen_mech;
-       void * auth_data;
-       u32 allowed_auth_mechs;
-       u32 allowed_sudo_mechs;
+       std::string enc_pwd = "";
+       bool create_player_on_auth_success = false;
+       AuthMechanism chosen_mech  = AUTH_MECHANISM_NONE;
+       void *auth_data = nullptr;
+       u32 allowed_auth_mechs = 0;
+       u32 allowed_sudo_mechs = 0;
 
        bool isSudoMechAllowed(AuthMechanism mech)
        { return allowed_sudo_mechs & mech; }
        bool isMechAllowed(AuthMechanism mech)
        { return allowed_auth_mechs & mech; }
 
-       RemoteClient():
-               peer_id(PEER_ID_INEXISTENT),
-               serialization_version(SER_FMT_VER_INVALID),
-               net_proto_version(0),
-               create_player_on_auth_success(false),
-               chosen_mech(AUTH_MECHANISM_NONE),
-               auth_data(NULL),
-               m_time_from_building(9999),
-               m_pending_serialization_version(SER_FMT_VER_INVALID),
-               m_state(CS_Created),
-               m_nearest_unsent_d(0),
-               m_nearest_unsent_reset_timer(0.0),
-               m_excess_gotblocks(0),
-               m_nothing_to_send_pause_timer(0.0),
-               m_name(""),
-               m_version_major(0),
-               m_version_minor(0),
-               m_version_patch(0),
-               m_full_version("unknown"),
-               m_deployed_compression(0),
-               m_connection_time(porting::getTime(PRECISION_SECONDS))
-       {
-       }
-       ~RemoteClient()
-       {
-       }
+       RemoteClient() {}
+       ~RemoteClient() {}
 
        /*
                Finds block that should be sent next to the client.
@@ -318,7 +293,7 @@ public:
        }
 
        // Time from last placing or removing blocks
-       float m_time_from_building;
+       float m_time_from_building = 9999;
 
        /*
                List of active objects that the client knows of.
@@ -345,7 +320,7 @@ public:
                { serialization_version = m_pending_serialization_version; }
 
        /* get uptime */
-       u32 uptime() const;
+       u64 uptime() const;
 
        /* set version information */
        void setVersionInfo(u8 major, u8 minor, u8 patch, const std::string &full)
@@ -362,10 +337,10 @@ public:
        u8 getPatch() const { return m_version_patch; }
 private:
        // Version is stored in here after INIT before INIT2
-       u8 m_pending_serialization_version;
+       u8 m_pending_serialization_version = SER_FMT_VER_INVALID;
 
        /* current state of client */
-       ClientState m_state;
+       ClientState m_state = CS_Created;
 
        /*
                Blocks that have been sent to client.
@@ -377,9 +352,9 @@ private:
                No MapBlock* is stored here because the blocks can get deleted.
        */
        std::set<v3s16> m_blocks_sent;
-       s16 m_nearest_unsent_d;
+       s16 m_nearest_unsent_d = 0;
        v3s16 m_last_center;
-       float m_nearest_unsent_reset_timer;
+       float m_nearest_unsent_reset_timer = 0.0f;
 
        /*
                Blocks that are currently on the line.
@@ -408,33 +383,35 @@ private:
                and the client then sends two GOTBLOCKs.
                This is resetted by PrintInfo()
        */
-       u32 m_excess_gotblocks;
+       u32 m_excess_gotblocks = 0;
 
        // CPU usage optimization
-       float m_nothing_to_send_pause_timer;
+       float m_nothing_to_send_pause_timer = 0.0f;
 
        /*
                name of player using this client
        */
-       std::string m_name;
+       std::string m_name = "";
 
        /*
                client information
         */
-       u8 m_version_major;
-       u8 m_version_minor;
-       u8 m_version_patch;
+       u8 m_version_major = 0;
+       u8 m_version_minor = 0;
+       u8 m_version_patch = 0;
 
-       std::string m_full_version;
+       std::string m_full_version = "unknown";
 
-       u16 m_deployed_compression;
+       u16 m_deployed_compression = 0;
 
        /*
                time this client was created
         */
-       const u32 m_connection_time;
+       const u64 m_connection_time = porting::getTimeS();
 };
 
+typedef std::unordered_map<u16, RemoteClient*> RemoteClientMap;
+
 class ClientInterface {
 public:
 
@@ -457,6 +434,7 @@ public:
 
        /* send to all clients */
        void sendToAll(NetworkPacket *pkt);
+       void sendToAllCompat(NetworkPacket *pkt, NetworkPacket *legacypkt, u16 min_proto_ver);
 
        /* delete a client */
        void DeleteClient(u16 peer_id);
@@ -499,7 +477,7 @@ protected:
        void lock() { m_clients_mutex.lock(); }
        void unlock() { m_clients_mutex.unlock(); }
 
-       UNORDERED_MAP<u16, RemoteClient*>& getClientList() { return m_clients; }
+       RemoteClientMap& getClientList() { return m_clients; }
 
 private:
        /* update internal player list */
@@ -507,14 +485,14 @@ private:
 
        // Connection
        con::Connection* m_con;
-       Mutex m_clients_mutex;
+       std::mutex m_clients_mutex;
        // Connected clients (behind the con mutex)
-       UNORDERED_MAP<u16, RemoteClient*> m_clients;
+       RemoteClientMap m_clients;
        std::vector<std::string> m_clients_names; //for announcing masterserver
 
        // Environment
        ServerEnvironment *m_env;
-       Mutex m_env_mutex;
+       std::mutex m_env_mutex;
 
        float m_print_info_timer;