Make getters of the Settings class const
[oweals/minetest.git] / src / clientiface.h
index a2315b3bd96d0d88aad95bfcdf0672e58012fcc7..cb3dae04b71355b95b0dd9996ac2a05a92cf32c6 100644 (file)
@@ -34,30 +34,135 @@ class MapBlock;
 class ServerEnvironment;
 class EmergeManager;
 
+/*
+ * State Transitions
+
+      Start
+  (peer connect)
+        |
+        v
+      /-----------------\
+      |                 |
+      |    Created      |
+      |                 |
+      \-----------------/
+               |
+               |
++-----------------------------+            invalid playername, password
+|IN:                          |                    or denied by mod
+| TOSERVER_INIT               |------------------------------
++-----------------------------+                             |
+               |                                            |
+               | Auth ok                                    |
+               |                                            |
++-----------------------------+                             |
+|OUT:                         |                             |
+| TOCLIENT_INIT               |                             |
++-----------------------------+                             |
+               |                                            |
+               v                                            |
+      /-----------------\                                   |
+      |                 |                                   |
+      |    InitSent     |                                   |
+      |                 |                                   |
+      \-----------------/                                   +------------------
+               |                                            |                 |
++-----------------------------+             +-----------------------------+   |
+|IN:                          |             |OUT:                         |   |
+| TOSERVER_INIT2              |             | TOCLIENT_ACCESS_DENIED      |   |
++-----------------------------+             +-----------------------------+   |
+               |                                            |                 |
+               v                                            v                 |
+      /-----------------\                           /-----------------\       |
+      |                 |                           |                 |       |
+      |    InitDone     |                           |     Denied      |       |
+      |                 |                           |                 |       |
+      \-----------------/                           \-----------------/       |
+               |                                                              |
++-----------------------------+                                               |
+|OUT:                         |                                               |
+| TOCLIENT_MOVEMENT           |                                               |
+| TOCLIENT_ITEMDEF            |                                               |
+| TOCLIENT_NODEDEF            |                                               |
+| TOCLIENT_ANNOUNCE_MEDIA     |                                               |
+| TOCLIENT_DETACHED_INVENTORY |                                               |
+| TOCLIENT_TIME_OF_DAY        |                                               |
++-----------------------------+                                               |
+               |                                                              |
+               |                                                              |
+               |      -----------------------------------                     |
+               v      |                                 |                     |
+      /-----------------\                               v                     |
+      |                 |                   +-----------------------------+   |
+      | DefinitionsSent |                   |IN:                          |   |
+      |                 |                   | TOSERVER_REQUEST_MEDIA      |   |
+      \-----------------/                   | TOSERVER_RECEIVED_MEDIA     |   |
+               |                            +-----------------------------+   |
+               |      ^                                 |                     |
+               |      -----------------------------------                     |
+               |                                                              |
++-----------------------------+                                               |
+|IN:                          |                                               |
+| TOSERVER_CLIENT_READY       |                                               |
++-----------------------------+                                               |
+               |                                                    async     |
+               v                                                  mod action  |
++-----------------------------+                                   (ban,kick)  |
+|OUT:                         |                                               |
+| TOCLIENT_MOVE_PLAYER        |                                               |
+| TOCLIENT_PRIVILEGES         |                                               |
+| TOCLIENT_INVENTORY_FORMSPEC |                                               |
+| UpdateCrafting              |                                               |
+| TOCLIENT_INVENTORY          |                                               |
+| TOCLIENT_HP (opt)           |                                               |
+| TOCLIENT_BREATH             |                                               |
+| TOCLIENT_DEATHSCREEN        |                                               |
++-----------------------------+                                               |
+              |                                                               |
+              v                                                               |
+      /-----------------\                                                     |
+      |                 |------------------------------------------------------
+      |     Active      |
+      |                 |----------------------------------
+      \-----------------/      timeout                    |
+               |                            +-----------------------------+
+               |                            |OUT:                         |
+               |                            | TOCLIENT_DISCONNECT         |
+               |                            +-----------------------------+
+               |                                          |
+               |                                          v
++-----------------------------+                    /-----------------\
+|IN:                          |                    |                 |
+| TOSERVER_DISCONNECT         |------------------->|  Disconnecting  |
++-----------------------------+                    |                 |
+                                                   \-----------------/
+*/
 namespace con {
        class Connection;
 }
 
+#define CI_ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
+
 enum ClientState
 {
-       Invalid,
-       Disconnecting,
-       Denied,
-       Created,
-       InitSent,
-       InitDone,
-       DefinitionsSent,
-       Active
+       CS_Invalid,
+       CS_Disconnecting,
+       CS_Denied,
+       CS_Created,
+       CS_InitSent,
+       CS_InitDone,
+       CS_DefinitionsSent,
+       CS_Active
 };
 
 enum ClientStateEvent
 {
-       Init,
-       GotInit2,
-       SetDenied,
-       SetDefinitionsSent,
-       SetMediaSent,
-       Disconnect
+       CSE_Init,
+       CSE_GotInit2,
+       CSE_SetDenied,
+       CSE_SetDefinitionsSent,
+       CSE_SetClientReady,
+       CSE_Disconnect
 };
 
 /*
@@ -101,13 +206,17 @@ public:
                net_proto_version(0),
                m_time_from_building(9999),
                m_pending_serialization_version(SER_FMT_VER_INVALID),
-               m_state(Created),
+               m_state(CS_Created),
                m_nearest_unsent_d(0),
                m_nearest_unsent_reset_timer(0.0),
                m_excess_gotblocks(0),
-               m_nothing_to_send_counter(0),
                m_nothing_to_send_pause_timer(0.0),
-               m_name("")
+               m_name(""),
+               m_version_major(0),
+               m_version_minor(0),
+               m_version_patch(0),
+               m_full_version("unknown"),
+               m_connection_time(getTime(PRECISION_SECONDS))
        {
        }
        ~RemoteClient()
@@ -129,6 +238,14 @@ public:
        void SetBlockNotSent(v3s16 p);
        void SetBlocksNotSent(std::map<v3s16, MapBlock*> &blocks);
 
+       /**
+        * tell client about this block being modified right now.
+        * this information is required to requeue the block in case it's "on wire"
+        * while modification is processed by server
+        * @param p position of modified block
+        */
+       void ResendBlockIfOnWire(v3s16 p);
+
        s32 SendingCount()
        {
                return m_blocks_sending.size();
@@ -178,6 +295,23 @@ public:
        void confirmSerializationVersion()
                { serialization_version = m_pending_serialization_version; }
 
+       /* get uptime */
+       u32 uptime();
+
+
+       /* set version information */
+       void setVersionInfo(u8 major, u8 minor, u8 patch, std::string full) {
+               m_version_major = major;
+               m_version_minor = minor;
+               m_version_patch = patch;
+               m_full_version = full;
+       }
+
+       /* 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; }
 private:
        // Version is stored in here after INIT before INIT2
        u8 m_pending_serialization_version;
@@ -219,9 +353,26 @@ private:
        u32 m_excess_gotblocks;
 
        // CPU usage optimization
-       u32 m_nothing_to_send_counter;
        float m_nothing_to_send_pause_timer;
+
+       /*
+               name of player using this client
+       */
        std::string m_name;
+
+       /*
+               client information
+        */
+       u8 m_version_major;
+       u8 m_version_minor;
+       u8 m_version_patch;
+
+       std::string m_full_version;
+
+       /*
+               time this client was created
+        */
+       const u32 m_connection_time;
 };
 
 class ClientInterface {
@@ -236,7 +387,7 @@ public:
        void step(float dtime);
 
        /* get list of active client id's */
-       std::list<u16> getClientIDs(ClientState min_state=Active);
+       std::list<u16> getClientIDs(ClientState min_state=CS_Active);
 
        /* get list of client player names */
        std::vector<std::string> getPlayerNames();
@@ -254,10 +405,10 @@ public:
        void CreateClient(u16 peer_id);
 
        /* get a client by peer_id */
-       RemoteClient* getClientNoEx(u16 peer_id,  ClientState state_min=Active);
+       RemoteClient* getClientNoEx(u16 peer_id,  ClientState state_min=CS_Active);
 
        /* get client by peer_id (make sure you have list lock before!*/
-       RemoteClient* lockedGetClientNoEx(u16 peer_id,  ClientState state_min=Active);
+       RemoteClient* lockedGetClientNoEx(u16 peer_id,  ClientState state_min=CS_Active);
 
        /* get state of client by id*/
        ClientState getClientState(u16 peer_id);
@@ -268,6 +419,9 @@ public:
        /* get protocol version of client */
        u16 getProtocolVersion(u16 peer_id);
 
+       /* set client version */
+       void setClientVersion(u16 peer_id, u8 major, u8 minor, u8 patch, std::string full);
+
        /* event to update client state */
        void event(u16 peer_id, ClientStateEvent event);
 
@@ -275,6 +429,8 @@ public:
        void setEnv(ServerEnvironment* env)
        { assert(m_env == 0); m_env = env; }
 
+       static std::string state2Name(ClientState state);
+
 protected:
        //TODO find way to avoid this functions
        void Lock()
@@ -301,6 +457,8 @@ private:
        JMutex m_env_mutex;
 
        float m_print_info_timer;
+       
+       static const char *statenames[];
 };
 
 #endif