Optimize updateFastFaceRow processing by removing some TileSpec copy (#5678)
[oweals/minetest.git] / src / clientiface.h
index 070559c3a7d3cf1a2706e8978cd10c0d420ca762..49101fbc1bae4dd0044f20d56ed4b1bb9e19b31c 100644 (file)
@@ -23,12 +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 "jthread/jmutex.h"
+#include "threading/mutex.h"
 #include "network/networkpacket.h"
+#include "util/cpp11_container.h"
+#include "porting.h"
 
 #include <list>
 #include <vector>
-#include <map>
 #include <set>
 
 class MapBlock;
@@ -49,14 +50,14 @@ class EmergeManager;
       \-----------------/
                |                  depending of the incoming packet
                +---------------------------------------
-               v                                      |
+               v                                      v
 +-----------------------------+        +-----------------------------+
 |IN:                          |        |IN:                          |
 | TOSERVER_INIT_LEGACY        |-----   | TOSERVER_INIT               |      invalid playername,
 +-----------------------------+    |   +-----------------------------+  password (for _LEGACY),
                |                   |                  |                       or denied by mod
                | Auth ok           -------------------+---------------------------------
-               |                                      |                                |
+               v                                      v                                |
 +-----------------------------+        +-----------------------------+                 |
 |OUT:                         |        |OUT:                         |                 |
 | TOCLIENT_INIT_LEGACY        |        | TOCLIENT_HELLO              |                 |
@@ -104,7 +105,7 @@ class EmergeManager;
                |                      +-----------------------------+                  |
                |      ^                           |                                    |
                |      -----------------------------                                    |
-               |                                                                       |
+               v                                                                       |
 +-----------------------------+                        --------------------------------+
 |IN:                          |                        |                               |
 | TOSERVER_CLIENT_READY       |                        v                               |
@@ -128,13 +129,13 @@ class EmergeManager;
       |                 |---------------------------------------------------------------
  ---->|     Active      |
  |    |                 |----------------------------------------------
- |    \-----------------/      timeout                                |
+ |    \-----------------/      timeout                                v
  |       |           |                                  +-----------------------------+
  |       |           |                                  |OUT:                         |
  |       |           |                                  | TOCLIENT_DISCONNECT         |
  |       |           |                                  +-----------------------------+
  |       |           |                                                |
- |       |           |                                                v
+ |       |           v                                                v
  |       |  +-----------------------------+                    /-----------------\
  |       |  |IN:                          |                    |                 |
  |       |  | TOSERVER_DISCONNECT         |------------------->|  Disconnecting  |
@@ -158,14 +159,16 @@ class EmergeManager;
  |                  |                               +-----------------------------+
  |                  |    sets password accordingly  |IN:                          |
  -------------------+-------------------------------| TOSERVER_FIRST_SRP          |
-                                                   +-----------------------------+
+                                                    +-----------------------------+
 
 */
 namespace con {
        class Connection;
 }
 
-#define CI_ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+// Also make sure to update the ClientInterface::statenames
+// array when modifying these enums
 
 enum ClientState
 {
@@ -232,6 +235,7 @@ public:
 
        /* Authentication information */
        std::string enc_pwd;
+       bool create_player_on_auth_success;
        AuthMechanism chosen_mech;
        void * auth_data;
        u32 allowed_auth_mechs;
@@ -246,6 +250,7 @@ public:
                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),
@@ -260,8 +265,8 @@ public:
                m_version_minor(0),
                m_version_patch(0),
                m_full_version("unknown"),
-               m_supported_compressions(0),
-               m_connection_time(getTime(PRECISION_SECONDS))
+               m_deployed_compression(0),
+               m_connection_time(porting::getTime(PRECISION_SECONDS))
        {
        }
        ~RemoteClient()
@@ -317,18 +322,14 @@ public:
 
        /*
                List of active objects that the client knows of.
-               Value is dummy.
        */
        std::set<u16> m_known_objects;
 
-       ClientState getState()
-               { return m_state; }
+       ClientState getState() const { return m_state; }
 
-       std::string getName()
-               { return m_name; }
+       std::string getName() const { return m_name; }
 
-       void setName(std::string name)
-               { m_name = name; }
+       void setName(const std::string &name) { m_name = name; }
 
        /* update internal client state */
        void notifyEvent(ClientStateEvent event);
@@ -337,8 +338,8 @@ public:
        void setPendingSerializationVersion(u8 version)
                { m_pending_serialization_version = version; }
 
-       void setSupportedCompressionModes(u8 byteFlag)
-               { m_supported_compressions = byteFlag; }
+       void setDeployedCompressionMode(u16 byteFlag)
+               { m_deployed_compression = byteFlag; }
 
        void confirmSerializationVersion()
                { serialization_version = m_pending_serialization_version; }
@@ -347,7 +348,8 @@ public:
        u32 uptime();
 
        /* set version information */
-       void setVersionInfo(u8 major, u8 minor, u8 patch, std::string full) {
+       void setVersionInfo(u8 major, u8 minor, u8 patch, const std::string &full)
+       {
                m_version_major = major;
                m_version_minor = minor;
                m_version_patch = patch;
@@ -355,10 +357,10 @@ public:
        }
 
        /* read version information */
-       u8 getMajor() { return m_version_major; }
-       u8 getMinor() { return m_version_minor; }
-       u8 getPatch() { return m_version_patch; }
-       std::string getVersion() { return m_full_version; }
+       u8 getMajor() const { return m_version_major; }
+       u8 getMinor() const { return m_version_minor; }
+       u8 getPatch() const { return m_version_patch; }
+       std::string getVersion() const { return m_full_version; }
 private:
        // Version is stored in here after INIT before INIT2
        u8 m_pending_serialization_version;
@@ -372,7 +374,7 @@ private:
                - A block is cleared from here when client says it has
                  deleted it from it's memory
 
-               Key is position, value is dummy.
+               List of block positions.
                No MapBlock* is stored here because the blocks can get deleted.
        */
        std::set<v3s16> m_blocks_sent;
@@ -390,6 +392,16 @@ private:
        */
        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.
+
+               List of block positions.
+       */
+       std::set<v3s16> m_blocks_modified;
+
        /*
                Count of excess GotBlocks().
                There is an excess amount because the client sometimes
@@ -416,7 +428,7 @@ private:
 
        std::string m_full_version;
 
-       u8 m_supported_compressions;
+       u16 m_deployed_compression;
 
        /*
                time this client was created
@@ -439,13 +451,13 @@ public:
        std::vector<u16> getClientIDs(ClientState min_state=CS_Active);
 
        /* get list of client player names */
-       std::vector<std::string> getPlayerNames();
+       const std::vector<std::string> &getPlayerNames() const { return m_clients_names; }
 
        /* send message to client */
        void send(u16 peer_id, u8 channelnum, NetworkPacket* pkt, bool reliable);
 
        /* send to all clients */
-       void sendToAll(u16 channelnum, NetworkPacket* pkt, bool reliable);
+       void sendToAll(NetworkPacket *pkt);
 
        /* delete a client */
        void DeleteClient(u16 peer_id);
@@ -485,13 +497,10 @@ public:
 
 protected:
        //TODO find way to avoid this functions
-       void Lock()
-               { m_clients_mutex.Lock(); }
-       void Unlock()
-               { m_clients_mutex.Unlock(); }
+       void lock() { m_clients_mutex.lock(); }
+       void unlock() { m_clients_mutex.unlock(); }
 
-       std::map<u16, RemoteClient*>& getClientList()
-               { return m_clients; }
+       UNORDERED_MAP<u16, RemoteClient*>& getClientList() { return m_clients; }
 
 private:
        /* update internal player list */
@@ -499,14 +508,14 @@ private:
 
        // Connection
        con::Connection* m_con;
-       JMutex m_clients_mutex;
+       Mutex m_clients_mutex;
        // Connected clients (behind the con mutex)
-       std::map<u16, RemoteClient*> m_clients;
+       UNORDERED_MAP<u16, RemoteClient*> m_clients;
        std::vector<std::string> m_clients_names; //for announcing masterserver
 
        // Environment
        ServerEnvironment *m_env;
-       JMutex m_env_mutex;
+       Mutex m_env_mutex;
 
        float m_print_info_timer;