Fix various player save issues (performance penalty on sql backends + bugs)
[oweals/minetest.git] / src / network / networkprotocol.h
index 7126c237be2b30f6f3b77d0ee11f0b8ace401fcf..703e9605670eac02089b5a9814567daedb08946e 100644 (file)
@@ -17,8 +17,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef NETWORKPROTOCOL_HEADER
-#define NETWORKPROTOCOL_HEADER
+#pragma once
+
 #include "util/string.h"
 
 /*
@@ -155,19 +155,57 @@ with this program; if not, write to the Free Software Foundation, Inc.,
                Stop sending TOSERVER_CLIENT_READY
        PROTOCOL VERSION 32:
                Add fading sounds
+       PROTOCOL VERSION 33:
+               Add TOCLIENT_UPDATE_PLAYER_LIST and send the player list to the client,
+                       instead of guessing based on the active object list.
+       PROTOCOL VERSION 34:
+               Add sound pitch
+       PROTOCOL VERSION 35:
+               Rename TOCLIENT_CHAT_MESSAGE to TOCLIENT_CHAT_MESSAGE_OLD (0x30)
+               Add TOCLIENT_CHAT_MESSAGE (0x2F)
+                       This chat message is a signalisation message containing various
+                       informations:
+                       * timestamp
+                       * sender
+                       * type (RAW, NORMAL, ANNOUNCE, SYSTEM)
+                       * content
+               Add TOCLIENT_CSM_RESTRICTION_FLAGS to define which CSM features should be
+                       limited
+               Add settable player collisionbox. Breaks compatibility with older
+                       clients as a 1-node vertical offset has been removed from player's
+                       position
+               Add settable player stepheight using existing object property.
+                       Breaks compatibility with older clients.
+       PROTOCOL VERSION 36:
+               Backwards compatibility drop
+               Add 'can_zoom' to player object properties
+               Add glow to object properties
+               Change TileDef serialization format.
+               Add world-aligned tiles.
+               Mod channels
+               Raise ObjectProperties version to 3 for removing 'can_zoom' and adding
+                       'zoom_fov'.
+               Nodebox version 5
+               Add disconnected nodeboxes
+               Add TOCLIENT_FORMSPEC_PREPEND
+       PROTOCOL VERSION 37:
+               Redo detached inventory sending
+               Add TOCLIENT_NODEMETA_CHANGED
+               New network float format
+               ContentFeatures version 13
 */
 
-#define LATEST_PROTOCOL_VERSION 32
+#define LATEST_PROTOCOL_VERSION 37
+#define LATEST_PROTOCOL_VERSION_STRING TOSTRING(LATEST_PROTOCOL_VERSION)
 
 // Server's supported network protocol range
-#define SERVER_PROTOCOL_VERSION_MIN 24
+#define SERVER_PROTOCOL_VERSION_MIN 37
 #define SERVER_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
 
 // Client's supported network protocol range
 // The minimal version depends on whether
 // send_pre_v25_init is enabled or not
-#define CLIENT_PROTOCOL_VERSION_MIN 25
-#define CLIENT_PROTOCOL_VERSION_MIN_LEGACY 24
+#define CLIENT_PROTOCOL_VERSION_MIN 37
 #define CLIENT_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
 
 // Constant that differentiates the protocol from random data and other protocols
@@ -181,6 +219,8 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-"
 
+typedef u16 session_t;
+
 enum ToClientCommand
 {
        TOCLIENT_HELLO = 0x02,
@@ -211,26 +251,15 @@ enum ToClientCommand
        /*
                Signals client that sudo mode auth failed.
        */
-       TOCLIENT_INIT_LEGACY = 0x10,
-       /*
-               Server's reply to TOSERVER_INIT.
-               Sent second after connected.
-
-               [0] u16 TOSERVER_INIT
-               [2] u8 deployed version
-               [3] v3s16 player's position + v3f(0,BS/2,0) floatToInt'd
-               [12] u64 map seed (new as of 2011-02-27)
-               [20] f1000 recommended send interval (in seconds) (new as of 14)
-
-               NOTE: The position in here is deprecated; position is
-                     explicitly sent afterwards
-       */
        TOCLIENT_ACCESS_DENIED = 0x0A,
        /*
                u8 reason
                std::string custom reason (if needed, otherwise "")
                u8 (bool) reconnect
        */
+
+       TOCLIENT_INIT_LEGACY = 0x10, // Obsolete
+
        TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
        TOCLIENT_ADDNODE = 0x21,
        /*
@@ -241,34 +270,9 @@ enum ToClientCommand
        TOCLIENT_REMOVENODE = 0x22,
 
        TOCLIENT_PLAYERPOS = 0x23, // Obsolete
-       /*
-               [0] u16 command
-               // Followed by an arbitary number of these:
-               // Number is determined from packet length.
-               [N] u16 peer_id
-               [N+2] v3s32 position*100
-               [N+2+12] v3s32 speed*100
-               [N+2+12+12] s32 pitch*100
-               [N+2+12+12+4] s32 yaw*100
-       */
-
        TOCLIENT_PLAYERINFO = 0x24, // Obsolete
-       /*
-               [0] u16 command
-               // Followed by an arbitary number of these:
-               // Number is determined from packet length.
-               [N] u16 peer_id
-               [N] char[20] name
-       */
-
        TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
-
        TOCLIENT_SECTORMETA = 0x26, // Obsolete
-       /*
-               [0] u16 command
-               [2] u8 sector count
-               [3...] v2s16 pos + sector metadata
-       */
 
        TOCLIENT_INVENTORY = 0x27,
        /*
@@ -277,21 +281,6 @@ enum ToClientCommand
        */
 
        TOCLIENT_OBJECTDATA = 0x28, // Obsolete
-       /*
-               Sent as unreliable.
-
-               u16 number of player positions
-               for each player:
-                       u16 peer_id
-                       v3s32 position*100
-                       v3s32 speed*100
-                       s32 pitch*100
-                       s32 yaw*100
-               u16 count of blocks
-               for each block:
-                       v3s16 blockpos
-                       block objects
-       */
 
        TOCLIENT_TIME_OF_DAY = 0x29,
        /*
@@ -300,14 +289,25 @@ enum ToClientCommand
                f1000 time_speed
        */
 
+       TOCLIENT_CSM_RESTRICTION_FLAGS = 0x2A,
+       /*
+               u32 CSMRestrictionFlags byteflag
+        */
+
        // (oops, there is some gap here)
 
-       TOCLIENT_CHAT_MESSAGE = 0x30,
+       TOCLIENT_CHAT_MESSAGE = 0x2F,
        /*
+               u8 version
+               u8 message_type
+               u16 sendername length
+               wstring sendername
                u16 length
                wstring message
        */
 
+       TOCLIENT_CHAT_MESSAGE_OLD = 0x30, // Obsolete
+
        TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
        /*
                u16 count of removed objects
@@ -352,14 +352,6 @@ enum ToClientCommand
        */
 
        TOCLIENT_PLAYERITEM = 0x36, // Obsolete
-       /*
-               u16 count of player items
-               for all player items {
-                       u16 peer id
-                       u16 length of serialized item
-                       string serialized item
-               }
-       */
 
        TOCLIENT_DEATHSCREEN = 0x37,
        /*
@@ -490,10 +482,13 @@ enum ToClientCommand
                f1000 expirationtime
                f1000 size
                u8 bool collisiondetection
-               u8 bool vertical
                u32 len
                u8[len] texture
+               u8 bool vertical
                u8 collision_removal
+               TileAnimation animation
+               u8 glow
+               u8 object_collision
        */
 
        TOCLIENT_ADD_PARTICLESPAWNER = 0x47,
@@ -511,17 +506,17 @@ enum ToClientCommand
                f1000 minsize
                f1000 maxsize
                u8 bool collisiondetection
-               u8 bool vertical
                u32 len
                u8[len] texture
-               u32 id
+               u8 bool vertical
                u8 collision_removal
+               u32 id
+               TileAnimation animation
+               u8 glow
+               u8 object_collision
        */
 
-       TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48,
-       /*
-               u16 id
-       */
+       TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48, // Obsolete
 
        TOCLIENT_HUDADD = 0x49,
        /*
@@ -629,16 +624,52 @@ enum ToClientCommand
                float step
                float gain
        */
+       TOCLIENT_UPDATE_PLAYER_LIST = 0x56,
+       /*
+               u8 type
+               u16 number of players
+               for each player
+                       u16 len
+                       u8[len] player name
+       */
+
+       TOCLIENT_MODCHANNEL_MSG = 0x57,
+       /*
+               u16 channel name length
+               std::string channel name
+               u16 channel name sender
+               std::string channel name
+               u16 message length
+               std::string message
+       */
+
+       TOCLIENT_MODCHANNEL_SIGNAL = 0x58,
+       /*
+               u8 signal id
+               u16 channel name length
+               std::string channel name
+       */
+
+       TOCLIENT_NODEMETA_CHANGED = 0x59,
+       /*
+               serialized and compressed node metadata
+       */
 
        TOCLIENT_SRP_BYTES_S_B = 0x60,
        /*
-               Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP.
+               Belonging to AUTH_MECHANISM_SRP.
 
                std::string bytes_s
                std::string bytes_B
        */
 
-       TOCLIENT_NUM_MSG_TYPES = 0x61,
+       TOCLIENT_FORMSPEC_PREPEND = 0x61,
+       /*
+               u16 len
+               u8[len] formspec
+       */
+
+       TOCLIENT_NUM_MSG_TYPES = 0x62,
 };
 
 enum ToServerCommand
@@ -654,17 +685,7 @@ enum ToServerCommand
                std::string player name
        */
 
-       TOSERVER_INIT_LEGACY = 0x10,
-       /*
-               Sent first after connected.
-
-               [0] u16 TOSERVER_INIT_LEGACY
-               [2] u8 SER_FMT_VER_HIGHEST_READ
-               [3] u8[20] player_name
-               [23] u8[28] password (new in some version)
-               [51] u16 minimum supported network protocol version (added sometime)
-               [53] u16 maximum supported network protocol version (added later than the previous one)
-       */
+       TOSERVER_INIT_LEGACY = 0x10, // Obsolete
 
        TOSERVER_INIT2 = 0x11,
        /*
@@ -674,7 +695,27 @@ enum ToServerCommand
                [0] u16 TOSERVER_INIT2
        */
 
-       TOSERVER_GETBLOCK=0x20, // Obsolete
+       TOSERVER_MODCHANNEL_JOIN = 0x17,
+       /*
+               u16 channel name length
+               std::string channel name
+        */
+
+       TOSERVER_MODCHANNEL_LEAVE = 0x18,
+       /*
+               u16 channel name length
+               std::string channel name
+        */
+
+       TOSERVER_MODCHANNEL_MSG = 0x19,
+       /*
+               u16 channel name length
+               std::string channel name
+               u16 message length
+               std::string message
+        */
+
+       TOSERVER_GETBLOCK = 0x20, // Obsolete
        TOSERVER_ADDNODE = 0x21, // Obsolete
        TOSERVER_REMOVENODE = 0x22, // Obsolete
 
@@ -709,48 +750,10 @@ enum ToServerCommand
        */
 
        TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
-       /*
-               [0] u16 command
-               [2] v3s16 pos
-               [8] u16 i
-       */
-
        TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
-       /*
-               length: 13
-               [0] u16 command
-               [2] u8 button (0=left, 1=right)
-               [3] v3s16 blockpos
-               [9] s16 id
-               [11] u16 item
-       */
-
        TOSERVER_GROUND_ACTION = 0x28, // Obsolete
-       /*
-               length: 17
-               [0] u16 command
-               [2] u8 action
-               [3] v3s16 nodepos_undersurface
-               [9] v3s16 nodepos_abovesurface
-               [15] u16 item
-               actions:
-               0: start digging (from undersurface)
-               1: place block (to abovesurface)
-               2: stop digging (all parameters ignored)
-               3: digging completed
-       */
-
        TOSERVER_RELEASE = 0x29, // Obsolete
-
-       // (oops, there is some gap here)
-
-       TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
-       /*
-               v3s16 blockpos
-               s16 id
-               u16 textlen
-               textdata
-       */
+       TOSERVER_SIGNTEXT = 0x30, // Obsolete
 
        TOSERVER_INVENTORY_ACTION = 0x31,
        /*
@@ -763,35 +766,15 @@ enum ToServerCommand
                wstring message
        */
 
-       TOSERVER_SIGNNODETEXT = 0x33, // obsolete
-       /*
-               v3s16 p
-               u16 textlen
-               textdata
-       */
-
+       TOSERVER_SIGNNODETEXT = 0x33, // Obsolete
        TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
-       /*
-               length: 7
-               [0] u16 command
-               [2] u8 button (0=left, 1=right)
-               [3] u16 id
-               [5] u16 item
-       */
 
        TOSERVER_DAMAGE = 0x35,
        /*
                u8 amount
        */
 
-       TOSERVER_PASSWORD_LEGACY = 0x36,
-       /*
-               Sent to change password.
-
-               [0] u16 TOSERVER_PASSWORD
-               [2] u8[28] old password
-               [30] u8[28] new password
-       */
+       TOSERVER_PASSWORD_LEGACY = 0x36, // Obsolete
 
        TOSERVER_PLAYERITEM = 0x37,
        /*
@@ -819,8 +802,6 @@ enum ToServerCommand
                2: digging completed
                3: place block or item (to abovesurface)
                4: use item
-
-               (Obsoletes TOSERVER_GROUND_ACTION and TOSERVER_CLICK_ACTIVEOBJECT.)
        */
 
        TOSERVER_REMOVED_SOUNDS = 0x3a,
@@ -861,17 +842,10 @@ enum ToServerCommand
                        u16 length of name
                        string name
                }
-        */
-
-       TOSERVER_RECEIVED_MEDIA = 0x41,
-       /*
-               <no payload data>
        */
 
+       TOSERVER_RECEIVED_MEDIA = 0x41, // Obsolete
        TOSERVER_BREATH = 0x42, // Obsolete
-       /*
-               u16 breath
-       */
 
        TOSERVER_CLIENT_READY = 0x43,
        /*
@@ -894,7 +868,7 @@ enum ToServerCommand
 
        TOSERVER_SRP_BYTES_A = 0x51,
        /*
-               Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP,
+               Belonging to AUTH_MECHANISM_SRP,
                        depending on current_login_based_on.
 
                std::string bytes_A
@@ -905,7 +879,7 @@ enum ToServerCommand
 
        TOSERVER_SRP_BYTES_M = 0x52,
        /*
-               Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP.
+               Belonging to AUTH_MECHANISM_SRP.
 
                std::string bytes_M
        */
@@ -965,4 +939,24 @@ const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
        "This server has experienced an internal error. You will now be disconnected."
 };
 
-#endif
+enum PlayerListModifer: u8
+{
+       PLAYER_LIST_INIT,
+       PLAYER_LIST_ADD,
+       PLAYER_LIST_REMOVE,
+};
+
+enum CSMRestrictionFlags : u64 {
+       CSM_RF_NONE = 0x00000000,
+       // Until server-sent CSM and verifying of builtin are complete,
+       // 'CSM_RF_LOAD_CLIENT_MODS' also disables loading 'builtin'.
+       // When those are complete, this should return to only being a restriction on the
+       // loading of client mods.
+       CSM_RF_LOAD_CLIENT_MODS = 0x00000001, // Don't load client-provided mods or 'builtin'
+       CSM_RF_CHAT_MESSAGES = 0x00000002, // Disable chat message sending from CSM
+       CSM_RF_READ_ITEMDEFS = 0x00000004, // Disable itemdef lookups
+       CSM_RF_READ_NODEDEFS = 0x00000008, // Disable nodedef lookups
+       CSM_RF_LOOKUP_NODES = 0x00000010, // Limit node lookups
+       CSM_RF_READ_PLAYERINFO = 0x00000020, // Disable player info lookups
+       CSM_RF_ALL = 0xFFFFFFFF,
+};