]> git.lizzy.rs Git - minetest.git/blobdiff - src/network/networkprotocol.h
Fix interact range check (thanks to @lhofhansl)
[minetest.git] / src / network / networkprotocol.h
index 18905a22b6a573f1ed0f22d8504b5aa14efd18b3..018b392b63b9134ff0ff00f39d0d774f931f6d64 100644 (file)
@@ -108,16 +108,49 @@ with this program; if not, write to the Free Software Foundation, Inc.,
        PROTOCOL_VERSION 24:
                ContentFeatures version 7
                ContentFeatures: change number of special tiles to 6 (CF_SPECIAL_COUNT)
+       PROTOCOL_VERSION 25:
+               Rename TOCLIENT_ACCESS_DENIED to TOCLIENT_ACCESS_DENIED_LEGAGY
+               Rename TOCLIENT_DELETE_PARTICLESPAWNER to
+                       TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY
+               Rename TOSERVER_PASSWORD to TOSERVER_PASSWORD_LEGACY
+               Rename TOSERVER_INIT to TOSERVER_INIT_LEGACY
+               Rename TOCLIENT_INIT to TOCLIENT_INIT_LEGACY
+               Add TOCLIENT_ACCESS_DENIED new opcode (0x0A), using error codes
+                       for standard error, keeping customisation possible. This
+                       permit translation
+               Add TOCLIENT_DELETE_PARTICLESPAWNER (0x53), fixing the u16 read and
+                       reading u32
+               Add new opcode TOSERVER_INIT for client presentation to server
+               Add new opcodes TOSERVER_FIRST_SRP, TOSERVER_SRP_BYTES_A,
+                       TOSERVER_SRP_BYTES_M, TOCLIENT_SRP_BYTES_S_B
+                       for the three supported auth mechanisms around srp
+               Add new opcodes TOCLIENT_ACCEPT_SUDO_MODE and TOCLIENT_DENY_SUDO_MODE
+                       for sudo mode handling (auth mech generic way of changing password).
+               Add TOCLIENT_HELLO for presenting server to client after client
+                       presentation
+               Add TOCLIENT_AUTH_ACCEPT to accept connection from client
+               Rename GENERIC_CMD_SET_ATTACHMENT to GENERIC_CMD_ATTACH_TO
+       PROTOCOL_VERSION 26:
+               Add TileDef tileable_horizontal, tileable_vertical flags
+       PROTOCOL_VERSION 27:
+               backface_culling: backwards compatibility for playing with
+               newer client on pre-27 servers.
+               Add nodedef v3 - connected nodeboxes
+       PROTOCOL_VERSION 28:
+               CPT2_MESHOPTIONS
 */
 
-#define LATEST_PROTOCOL_VERSION 24
+#define LATEST_PROTOCOL_VERSION 28
 
 // Server's supported network protocol range
 #define SERVER_PROTOCOL_VERSION_MIN 13
 #define SERVER_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
 
 // Client's supported network protocol range
-#define CLIENT_PROTOCOL_VERSION_MIN 13
+// 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 13
 #define CLIENT_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
 
 // Constant that differentiates the protocol from random data and other protocols
@@ -133,7 +166,35 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 enum ToClientCommand
 {
-       TOCLIENT_INIT = 0x10,
+       TOCLIENT_HELLO = 0x02,
+       /*
+               Sent after TOSERVER_INIT.
+
+               u8 deployed serialisation version
+               u16 deployed network compression mode
+               u16 deployed protocol version
+               u32 supported auth methods
+               std::string username that should be used for legacy hash (for proper casing)
+       */
+       TOCLIENT_AUTH_ACCEPT = 0x03,
+       /*
+               Message from server to accept auth.
+
+               v3s16 player's position + v3f(0,BS/2,0) floatToInt'd
+               u64 map seed
+               f1000 recommended send interval
+               u32 : supported auth methods for sudo mode
+                     (where the user can change their password)
+       */
+       TOCLIENT_ACCEPT_SUDO_MODE = 0x04,
+       /*
+               Sent to client to show it is in sudo mode now.
+       */
+       TOCLIENT_DENY_SUDO_MODE = 0x05,
+       /*
+               Signals client that sudo mode auth failed.
+       */
+       TOCLIENT_INIT_LEGACY = 0x10,
        /*
                Server's reply to TOSERVER_INIT.
                Sent second after connected.
@@ -147,11 +208,15 @@ enum ToClientCommand
                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_BLOCKDATA = 0x20, //TODO: Multiple blocks
        TOCLIENT_ADDNODE = 0x21,
        /*
-               u16 command
                v3s16 position
                serialized mapnode
                u8 keep_metadata // Added in protocol version 22
@@ -198,7 +263,6 @@ enum ToClientCommand
        /*
                Sent as unreliable.
 
-               u16 command
                u16 number of player positions
                for each player:
                        u16 peer_id
@@ -214,7 +278,6 @@ enum ToClientCommand
 
        TOCLIENT_TIME_OF_DAY = 0x29,
        /*
-               u16 command
                u16 time (0-23999)
                Added in a later version:
                f1000 time_speed
@@ -224,14 +287,12 @@ enum ToClientCommand
 
        TOCLIENT_CHAT_MESSAGE = 0x30,
        /*
-               u16 command
                u16 length
                wstring message
        */
 
        TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
        /*
-               u16 command
                u16 count of removed objects
                for all removed objects {
                        u16 id
@@ -247,7 +308,6 @@ enum ToClientCommand
 
        TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32,
        /*
-               u16 command
                for all objects
                {
                        u16 id
@@ -258,13 +318,11 @@ enum ToClientCommand
 
        TOCLIENT_HP = 0x33,
        /*
-               u16 command
                u8 hp
        */
 
        TOCLIENT_MOVE_PLAYER = 0x34,
        /*
-               u16 command
                v3f1000 player position
                f1000 player pitch
                f1000 player yaw
@@ -272,14 +330,12 @@ enum ToClientCommand
 
        TOCLIENT_ACCESS_DENIED_LEGACY = 0x35,
        /*
-               u16 command
                u16 reason_length
                wstring reason
        */
 
        TOCLIENT_PLAYERITEM = 0x36, // Obsolete
        /*
-               u16 command
                u16 count of player items
                for all player items {
                        u16 peer id
@@ -290,14 +346,12 @@ enum ToClientCommand
 
        TOCLIENT_DEATHSCREEN = 0x37,
        /*
-               u16 command
                u8 bool set camera point target
                v3f1000 camera point target (to point the death cause or whatever)
        */
 
        TOCLIENT_MEDIA = 0x38,
        /*
-               u16 command
                u16 total number of texture bunches
                u16 index of this bunch
                u32 number of files in this bunch
@@ -313,21 +367,18 @@ enum ToClientCommand
 
        TOCLIENT_TOOLDEF = 0x39,
        /*
-               u16 command
                u32 length of the next item
                serialized ToolDefManager
        */
 
        TOCLIENT_NODEDEF = 0x3a,
        /*
-               u16 command
                u32 length of the next item
                serialized NodeDefManager
        */
 
        TOCLIENT_CRAFTITEMDEF = 0x3b,
        /*
-               u16 command
                u32 length of the next item
                serialized CraftiItemDefManager
        */
@@ -335,7 +386,6 @@ enum ToClientCommand
        TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
 
        /*
-               u16 command
                u32 number of files
                for each texture {
                        u16 length of name
@@ -347,14 +397,12 @@ enum ToClientCommand
 
        TOCLIENT_ITEMDEF = 0x3d,
        /*
-               u16 command
                u32 length of next item
                serialized ItemDefManager
        */
 
        TOCLIENT_PLAY_SOUND = 0x3f,
        /*
-               u16 command
                s32 sound_id
                u16 len
                u8[len] sound name
@@ -367,13 +415,11 @@ enum ToClientCommand
 
        TOCLIENT_STOP_SOUND = 0x40,
        /*
-               u16 command
                s32 sound_id
        */
 
        TOCLIENT_PRIVILEGES = 0x41,
        /*
-               u16 command
                u16 number of privileges
                for each privilege
                        u16 len
@@ -382,7 +428,6 @@ enum ToClientCommand
 
        TOCLIENT_INVENTORY_FORMSPEC = 0x42,
        /*
-               u16 command
                u32 len
                u8[len] formspec
        */
@@ -406,7 +451,6 @@ enum ToClientCommand
 
        TOCLIENT_MOVEMENT = 0x45,
        /*
-               u16 command
                f1000 movement_acceleration_default
                f1000 movement_acceleration_air
                f1000 movement_acceleration_fast
@@ -423,7 +467,6 @@ enum ToClientCommand
 
        TOCLIENT_SPAWN_PARTICLE = 0x46,
        /*
-               u16 command
                v3f1000 pos
                v3f1000 velocity
                v3f1000 acceleration
@@ -433,11 +476,11 @@ enum ToClientCommand
                u8 bool vertical
                u32 len
                u8[len] texture
+               u8 collision_removal
        */
 
        TOCLIENT_ADD_PARTICLESPAWNER = 0x47,
        /*
-               u16 command
                u16 amount
                f1000 spawntime
                v3f1000 minpos
@@ -455,17 +498,16 @@ enum ToClientCommand
                u32 len
                u8[len] texture
                u32 id
+               u8 collision_removal
        */
 
        TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48,
        /*
-               u16 command
-               u32 id
+               u16 id
        */
 
        TOCLIENT_HUDADD = 0x49,
        /*
-               u16 command
                u32 id
                u8 type
                v2f1000 pos
@@ -485,13 +527,11 @@ enum ToClientCommand
 
        TOCLIENT_HUDRM = 0x4a,
        /*
-               u16 command
                u32 id
        */
 
        TOCLIENT_HUDCHANGE = 0x4b,
        /*
-               u16 command
                u32 id
                u8 stat
                [v2f1000 data |
@@ -502,14 +542,12 @@ enum ToClientCommand
 
        TOCLIENT_HUD_SET_FLAGS = 0x4c,
        /*
-               u16 command
                u32 flags
                u32 mask
        */
 
        TOCLIENT_HUD_SET_PARAM = 0x4d,
        /*
-               u16 command
                u16 param
                u16 len
                u8[len] value
@@ -517,13 +555,11 @@ enum ToClientCommand
 
        TOCLIENT_BREATH = 0x4e,
        /*
-               u16 command
                u16 breath
        */
 
        TOCLIENT_SET_SKY = 0x4f,
        /*
-               u16 command
                u8[4] color (ARGB)
                u8 len
                u8[len] type
@@ -535,14 +571,12 @@ enum ToClientCommand
 
        TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO = 0x50,
        /*
-               u16 command
                u8 do_override (boolean)
                u16 day-night ratio 0...65535
        */
 
        TOCLIENT_LOCAL_PLAYER_ANIMATIONS = 0x51,
        /*
-               u16 command
                v2s32 stand/idle
                v2s32 walk
                v2s32 dig
@@ -552,21 +586,44 @@ enum ToClientCommand
 
        TOCLIENT_EYE_OFFSET = 0x52,
        /*
-               u16 command
                v3f1000 first
                v3f1000 third
        */
 
-       TOCLIENT_NUM_MSG_TYPES = 0x53,
+       TOCLIENT_DELETE_PARTICLESPAWNER = 0x53,
+       /*
+               u32 id
+       */
+
+       TOCLIENT_SRP_BYTES_S_B = 0x60,
+       /*
+               Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP.
+
+               std::string bytes_s
+               std::string bytes_B
+       */
+
+       TOCLIENT_NUM_MSG_TYPES = 0x61,
 };
 
 enum ToServerCommand
 {
+       TOSERVER_INIT = 0x02,
+       /*
+               Sent first after connected.
+
+               u8 serialisation version (=SER_FMT_VER_HIGHEST_READ)
+               u16 supported network compression modes
+               u16 minimum supported network protocol version
+               u16 maximum supported network protocol version
+               std::string player name
+       */
+
        TOSERVER_INIT_LEGACY = 0x10,
        /*
                Sent first after connected.
 
-               [0] u16 TOSERVER_INIT
+               [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)
@@ -594,6 +651,8 @@ enum ToServerCommand
                [2+12+12] s32 pitch*100
                [2+12+12+4] s32 yaw*100
                [2+12+12+4+4] u32 keyPressed
+               [2+12+12+4+4+1] u8 fov*80
+               [2+12+12+4+4+4+1] u8 ceil(wanted_range / MAP_BLOCKSIZE)
        */
 
        TOSERVER_GOTBLOCKS = 0x24,
@@ -652,7 +711,6 @@ enum ToServerCommand
 
        TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
        /*
-               u16 command
                v3s16 blockpos
                s16 id
                u16 textlen
@@ -666,14 +724,12 @@ enum ToServerCommand
 
        TOSERVER_CHAT_MESSAGE = 0x32,
        /*
-               u16 command
                u16 length
                wstring message
        */
 
        TOSERVER_SIGNNODETEXT = 0x33, // obsolete
        /*
-               u16 command
                v3s16 p
                u16 textlen
                textdata
@@ -690,7 +746,6 @@ enum ToServerCommand
 
        TOSERVER_DAMAGE = 0x35,
        /*
-               u16 command
                u8 amount
        */
 
@@ -735,14 +790,12 @@ enum ToServerCommand
 
        TOSERVER_REMOVED_SOUNDS = 0x3a,
        /*
-               u16 command
                u16 len
                s32[len] sound_id
        */
 
        TOSERVER_NODEMETA_FIELDS = 0x3b,
        /*
-               u16 command
                v3s16 p
                u16 len
                u8[len] form name (reserved for future use)
@@ -756,7 +809,6 @@ enum ToServerCommand
 
        TOSERVER_INVENTORY_FIELDS = 0x3c,
        /*
-               u16 command
                u16 len
                u8[len] form name (reserved for future use)
                u16 number of fields
@@ -769,7 +821,6 @@ enum ToServerCommand
 
        TOSERVER_REQUEST_MEDIA = 0x40,
        /*
-               u16 command
                u16 number of files requested
                for each file {
                        u16 length of name
@@ -779,12 +830,11 @@ enum ToServerCommand
 
        TOSERVER_RECEIVED_MEDIA = 0x41,
        /*
-               u16 command
+               <no payload data>
        */
 
        TOSERVER_BREATH = 0x42,
        /*
-               u16 command
                u16 breath
        */
 
@@ -798,7 +848,86 @@ enum ToServerCommand
                u8[len] full_version_string
        */
 
-       TOSERVER_NUM_MSG_TYPES = 0x44,
+       TOSERVER_FIRST_SRP = 0x50,
+       /*
+               Belonging to AUTH_MECHANISM_FIRST_SRP.
+
+               std::string srp salt
+               std::string srp verification key
+               u8 is_empty (=1 if password is empty, 0 otherwise)
+       */
+
+       TOSERVER_SRP_BYTES_A = 0x51,
+       /*
+               Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP,
+                       depending on current_login_based_on.
+
+               std::string bytes_A
+               u8 current_login_based_on : on which version of the password's
+                                           hash this login is based on (0 legacy hash,
+                                           or 1 directly the password)
+       */
+
+       TOSERVER_SRP_BYTES_M = 0x52,
+       /*
+               Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP.
+
+               std::string bytes_M
+       */
+
+       TOSERVER_NUM_MSG_TYPES = 0x53,
+};
+
+enum AuthMechanism
+{
+       // reserved
+       AUTH_MECHANISM_NONE = 0,
+
+       // SRP based on the legacy hash
+       AUTH_MECHANISM_LEGACY_PASSWORD = 1 << 0,
+
+       // SRP based on the srp verification key
+       AUTH_MECHANISM_SRP = 1 << 1,
+
+       // Establishes a srp verification key, for first login and password changing
+       AUTH_MECHANISM_FIRST_SRP = 1 << 2,
+};
+
+enum AccessDeniedCode {
+       SERVER_ACCESSDENIED_WRONG_PASSWORD,
+       SERVER_ACCESSDENIED_UNEXPECTED_DATA,
+       SERVER_ACCESSDENIED_SINGLEPLAYER,
+       SERVER_ACCESSDENIED_WRONG_VERSION,
+       SERVER_ACCESSDENIED_WRONG_CHARS_IN_NAME,
+       SERVER_ACCESSDENIED_WRONG_NAME,
+       SERVER_ACCESSDENIED_TOO_MANY_USERS,
+       SERVER_ACCESSDENIED_EMPTY_PASSWORD,
+       SERVER_ACCESSDENIED_ALREADY_CONNECTED,
+       SERVER_ACCESSDENIED_SERVER_FAIL,
+       SERVER_ACCESSDENIED_CUSTOM_STRING,
+       SERVER_ACCESSDENIED_SHUTDOWN,
+       SERVER_ACCESSDENIED_CRASH,
+       SERVER_ACCESSDENIED_MAX,
+};
+
+enum NetProtoCompressionMode {
+       NETPROTO_COMPRESSION_NONE = 0,
+};
+
+const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
+       "Invalid password",
+       "Your client sent something the server didn't expect.  Try reconnecting or updating your client",
+       "The server is running in simple singleplayer mode.  You cannot connect.",
+       "Your client's version is not supported.\nPlease contact server administrator.",
+       "Player name contains disallowed characters.",
+       "Player name not allowed.",
+       "Too many users.",
+       "Empty passwords are disallowed.  Set a password and try again.",
+       "Another client is connected with this name.  If your client closed unexpectedly, try again in a minute.",
+       "Server authentication failed.  This is likely a server error.",
+       "",
+       "Server shutting down.",
+       "This server has experienced an internal error. You will now be disconnected."
 };
 
 #endif