// Luanti // SPDX-License-Identifier: LGPL-2.1-or-later // Copyright (C) 2010-2013 celeron55, Perttu Ahola #pragma once #include "irrTypes.h" using namespace irr; extern const u16 LATEST_PROTOCOL_VERSION; // Server's supported network protocol range constexpr u16 SERVER_PROTOCOL_VERSION_MIN = 37; // Client's supported network protocol range constexpr u16 CLIENT_PROTOCOL_VERSION_MIN = 37; extern const u16 FORMSPEC_API_VERSION; #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-" typedef u16 session_t; enum ToClientCommand : u16 { TOCLIENT_HELLO = 0x02, /* Sent after TOSERVER_INIT. u8 deployed serialization version u16 unused (network compression, never implemeneted) u16 deployed protocol version u32 supported auth methods std::string unused (used to be username) */ 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_ACCESS_DENIED = 0x0A, /* u8 reason std::string custom reason (if needed, otherwise "") u8 (bool) reconnect */ TOCLIENT_BLOCKDATA = 0x20, TOCLIENT_ADDNODE = 0x21, /* v3s16 position serialized mapnode u8 keep_metadata // Added in protocol version 22 */ TOCLIENT_REMOVENODE = 0x22, TOCLIENT_INVENTORY = 0x27, /* [0] u16 command [2] serialized inventory */ TOCLIENT_TIME_OF_DAY = 0x29, /* u16 time (0-23999) f1000 time_speed */ TOCLIENT_CSM_RESTRICTION_FLAGS = 0x2A, /* u32 CSMRestrictionFlags byteflag */ TOCLIENT_PLAYER_SPEED = 0x2B, /* v3f added_vel */ TOCLIENT_MEDIA_PUSH = 0x2C, /* std::string raw_hash std::string filename u32 callback_token bool should_be_cached */ TOCLIENT_CHAT_MESSAGE = 0x2F, /* u8 version u8 message_type u16 sendername length wstring sendername u16 length wstring message */ TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31, /* u16 count of removed objects for all removed objects { u16 id } u16 count of added objects for all added objects { u16 id u8 type u32 initialization data length string initialization data } */ TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32, /* for all objects { u16 id u16 message length string message } */ TOCLIENT_HP = 0x33, /* u8 hp */ TOCLIENT_MOVE_PLAYER = 0x34, /* v3f1000 player position f1000 player pitch f1000 player yaw */ TOCLIENT_ACCESS_DENIED_LEGACY = 0x35, /* u16 reason_length wstring reason */ TOCLIENT_FOV = 0x36, /* Sends an FOV override/multiplier to client. f32 fov bool is_multiplier f32 transition_time */ TOCLIENT_DEATHSCREEN_LEGACY = 0x37, /* u8 bool unused v3f1000 unused */ TOCLIENT_MEDIA = 0x38, /* u16 total number of texture bunches u16 index of this bunch u32 number of files in this bunch for each file { u16 length of name string name u32 length of data data } u16 length of remote media server url (if applicable) string url */ TOCLIENT_NODEDEF = 0x3a, /* u32 length of the next item serialized NodeDefManager */ TOCLIENT_ANNOUNCE_MEDIA = 0x3c, /* u32 number of files for each texture { u16 length of name string name u16 length of sha1_digest string sha1_digest } */ TOCLIENT_ITEMDEF = 0x3d, /* u32 length of next item serialized ItemDefManager */ TOCLIENT_PLAY_SOUND = 0x3f, /* s32 server_id u16 len u8[len] sound name f32 gain u8 type (SoundLocation: 0=local, 1=positional, 2=object) v3f pos_nodes (in BS-space) u16 object_id u8 loop (bool) f32 fade f32 pitch u8 ephemeral (bool) f32 start_time (in seconds) */ TOCLIENT_STOP_SOUND = 0x40, /* s32 sound_id */ TOCLIENT_PRIVILEGES = 0x41, /* u16 number of privileges for each privilege u16 len u8[len] privilege */ TOCLIENT_INVENTORY_FORMSPEC = 0x42, /* u32 len u8[len] formspec */ TOCLIENT_DETACHED_INVENTORY = 0x43, /* [0] u16 command u16 len u8[len] name [2] serialized inventory */ TOCLIENT_SHOW_FORMSPEC = 0x44, /* [0] u16 command u32 len u8[len] formspec u16 len u8[len] formname */ TOCLIENT_MOVEMENT = 0x45, /* f1000 movement_acceleration_default f1000 movement_acceleration_air f1000 movement_acceleration_fast f1000 movement_speed_walk f1000 movement_speed_crouch f1000 movement_speed_fast f1000 movement_speed_climb f1000 movement_speed_jump f1000 movement_liquid_fluidity f1000 movement_liquid_fluidity_smooth f1000 movement_liquid_sink f1000 movement_gravity */ TOCLIENT_SPAWN_PARTICLE = 0x46, /* using range = RangedParameter { T min, max f32 bias } using tween = TweenedParameter { u8 style u16 reps f32 beginning T start, end } v3f pos v3f velocity v3f acceleration f32 expirationtime f32 size u8 bool collisiondetection u32 len u8[len] texture u8 bool vertical u8 bool collision_removal TileAnimation animation u8 glow u8 bool object_collision u16 node_param0 u8 node_param2 u8 node_tile v3f drag range jitter range bounce texture { u8 flags (ParticleTextureFlags) -- bit 0: animated -- next bits: blend mode (BlendMode) tween alpha tween scale } */ TOCLIENT_ADD_PARTICLESPAWNER = 0x47, /* using range = RangedParameter { T min, max f32 bias } using tween = TweenedParameter { u8 style u16 reps f32 beginning T start, end } u16 amount f32 spawntime if PROTOCOL_VERSION >= 42 { tween> pos, vel, acc, exptime, size } else { v3f minpos v3f maxpos v3f minvel v3f maxvel v3f minacc v3f maxacc f32 minexptime f32 maxexptime f32 minsize f32 maxsize } u8 bool collisiondetection u32 len u8[len] texture u32 spawner_id u8 bool vertical u8 bool collision_removal u32 attached_id TileAnimation animation u8 glow u8 bool object_collision u16 node_param0 u8 node_param2 u8 node_tile if PROTOCOL_VERSION < 42 { f32 pos_start_bias f32 vel_start_bias f32 acc_start_bias f32 exptime_start_bias f32 size_start_bias range pos_end -- i.e v3f pos_end_min -- v3f pos_end_max -- f32 pos_end_bias range vel_end range acc_end range exptime_end range size_end } texture { u8 flags (ParticleTextureFlags) -- bit 0: animated -- next bits: blend mode (BlendMode) tween alpha tween scale if (flags.animated) TileAnimation animation } tween> drag -- i.e. v3f drag_start_min -- v3f drag_start_max -- f32 drag_start_bias -- v3f drag_end_min -- v3f drag_end_max -- f32 drag_end_bias tween> jitter tween> bounce u8 attraction_kind none = 0 point = 1 line = 2 plane = 3 if attraction_kind > none { tween> attract_strength tween attractor_origin u16 attractor_origin_attachment_object_id u8 spawner_flags bit 1: attractor_kill (particles dies on contact) if attraction_mode > point { tween attractor_direction u16 attractor_direction_attachment_object_id } } tween> radius u16 texpool_size texpool_size.times { u8 flags (ParticleTextureFlags) -- bit 0: animated -- next bits: blend mode (BlendMode) tween alpha tween scale u32 len u8[len] texture if (flags.animated) TileAnimation animation } */ TOCLIENT_HUDADD = 0x49, /* u32 id u8 type v2f1000 pos u16 len u8[len] name v2f1000 scale u16 len2 u8[len2] text u32 number u32 item u32 dir v2f1000 align v2f1000 offset v3f1000 world_pos v2s32 size s16 z_index u16 len3 u8[len3] text2 */ TOCLIENT_HUDRM = 0x4a, /* u32 id */ TOCLIENT_HUDCHANGE = 0x4b, /* u32 id u8 stat [v2f1000 data | u32 len u8[len] data | u32 data] */ TOCLIENT_HUD_SET_FLAGS = 0x4c, /* u32 flags u32 mask */ TOCLIENT_HUD_SET_PARAM = 0x4d, /* u16 param u16 len u8[len] value */ TOCLIENT_BREATH = 0x4e, /* u16 breath */ TOCLIENT_SET_SKY = 0x4f, /* Protocol 38: u8[4] base_color (ARGB) u8 len u8[len] type u16 count foreach count: u8 len u8[len] param u8 clouds (boolean) Protocol 39: u8[4] bgcolor (ARGB) std::string type int texture_count std::string[6] param bool clouds bool bgcolor_fog u8[4] day_sky (ARGB) u8[4] day_horizon (ARGB) u8[4] dawn_sky (ARGB) u8[4] dawn_horizon (ARGB) u8[4] night_sky (ARGB) u8[4] night_horizon (ARGB) u8[4] indoors (ARGB) u8[4] fog_sun_tint (ARGB) u8[4] fog_moon_tint (ARGB) std::string fog_tint_type float body_orbit_tilt */ TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO = 0x50, /* u8 do_override (boolean) u16 day-night ratio 0...65535 */ TOCLIENT_LOCAL_PLAYER_ANIMATIONS = 0x51, /* v2s32 stand/idle v2s32 walk v2s32 dig v2s32 walk+dig f1000 frame_speed */ TOCLIENT_EYE_OFFSET = 0x52, /* v3f1000 first v3f1000 third v3f1000 third_front */ TOCLIENT_DELETE_PARTICLESPAWNER = 0x53, /* u32 id */ TOCLIENT_CLOUD_PARAMS = 0x54, /* f1000 density u8[4] color_diffuse (ARGB) u8[4] color_ambient (ARGB) f1000 height f1000 thickness v2f1000 speed */ TOCLIENT_FADE_SOUND = 0x55, /* s32 sound_id 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_SET_SUN = 0x5a, /* bool visible std::string texture std::string tonemap std::string sunrise f32 scale */ TOCLIENT_SET_MOON = 0x5b, /* bool visible std::string texture std::string tonemap f32 scale */ TOCLIENT_SET_STARS = 0x5c, /* bool visible u32 count u8[4] starcolor (ARGB) f32 scale f32 day_opacity */ TOCLIENT_MOVE_PLAYER_REL = 0x5d, /* v3f added_pos */ TOCLIENT_SRP_BYTES_S_B = 0x60, /* Belonging to AUTH_MECHANISM_SRP. std::string bytes_s std::string bytes_B */ TOCLIENT_FORMSPEC_PREPEND = 0x61, /* u16 len u8[len] formspec */ TOCLIENT_MINIMAP_MODES = 0x62, /* u16 count // modes u16 mode // wanted current mode index after change for each mode u16 type std::string label u16 size std::string extra */ TOCLIENT_SET_LIGHTING = 0x63, /* f32 shadow_intensity f32 saturation exposure parameters f32 luminance_min f32 luminance_max f32 exposure_correction f32 speed_dark_bright f32 speed_bright_dark f32 center_weight_power */ TOCLIENT_NUM_MSG_TYPES = 0x64, }; enum ToServerCommand : u16 { TOSERVER_INIT = 0x02, /* Sent first after connected. u8 serialization version (=SER_FMT_VER_HIGHEST_READ) u16 unused (supported network compression modes, never implemeneted) u16 minimum supported network protocol version u16 maximum supported network protocol version std::string player name */ TOSERVER_INIT2 = 0x11, /* Sent as an ACK for TOCLIENT_AUTH_ACCEPT. After this, the server can send data. */ 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_PLAYERPOS = 0x23, /* [0] u16 command [2] v3s32 position*100 [2+12] v3s32 speed*100 [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+4] u8 fov*80 [2+12+12+4+4+4+1] u8 ceil(wanted_range / MAP_BLOCKSIZE) [2+12+12+4+4+4+1+1] u8 camera_inverted (bool) [2+12+12+4+4+4+1+1+1] f32 movement_speed [2+12+12+4+4+4+1+1+1+4] f32 movement_direction */ TOSERVER_GOTBLOCKS = 0x24, /* [0] u16 command [2] u8 count [3] v3s16 pos_0 [3+6] v3s16 pos_1 ... */ TOSERVER_DELETEDBLOCKS = 0x25, /* [0] u16 command [2] u8 count [3] v3s16 pos_0 [3+6] v3s16 pos_1 ... */ TOSERVER_INVENTORY_ACTION = 0x31, /* See InventoryAction in inventorymanager.h */ TOSERVER_CHAT_MESSAGE = 0x32, /* u16 length wstring message */ TOSERVER_DAMAGE = 0x35, /* u8 amount */ TOSERVER_PLAYERITEM = 0x37, /* Sent to change selected item. [0] u16 TOSERVER_PLAYERITEM [2] u16 item */ TOSERVER_RESPAWN_LEGACY = 0x38, TOSERVER_INTERACT = 0x39, /* [0] u16 command [2] u8 action [3] u16 item [5] u32 length of the next item [9] serialized PointedThing actions: 0: start digging (from undersurface) or use 1: stop digging (all parameters ignored) 2: digging completed 3: place block or item (to abovesurface) 4: use item */ TOSERVER_REMOVED_SOUNDS = 0x3a, /* u16 len s32[len] sound_id */ TOSERVER_NODEMETA_FIELDS = 0x3b, /* v3s16 p u16 len u8[len] form name (reserved for future use) u16 number of fields for each field: u16 len u8[len] field name u32 len u8[len] field value */ TOSERVER_INVENTORY_FIELDS = 0x3c, /* u16 len u8[len] form name (reserved for future use) u16 number of fields for each field: u16 len u8[len] field name u32 len u8[len] field value */ TOSERVER_REQUEST_MEDIA = 0x40, /* u16 number of files requested for each file { u16 length of name string name } */ TOSERVER_HAVE_MEDIA = 0x41, /* u8 number of callback tokens for each: u32 token */ TOSERVER_CLIENT_READY = 0x43, /* u8 major u8 minor u8 patch u8 reserved u16 len u8[len] full_version_string */ 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_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_SRP. std::string bytes_M */ TOSERVER_UPDATE_CLIENT_INFO = 0x53, /* v2s16 render_target_size f32 gui_scaling f32 hud_scaling v2f32 max_fs_info */ TOSERVER_NUM_MSG_TYPES = 0x54, }; 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 : u8 { 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 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, }; enum InteractAction : u8 { INTERACT_START_DIGGING, // 0: start digging (from undersurface) or use INTERACT_STOP_DIGGING, // 1: stop digging (all parameters ignored) INTERACT_DIGGING_COMPLETED, // 2: digging completed INTERACT_PLACE, // 3: place block or item (to abovesurface) INTERACT_USE, // 4: use item INTERACT_ACTIVATE // 5: rightclick air ("activate") };