]> git.lizzy.rs Git - dragonfireclient.git/blob - src/network/networkprotocol.h
Merge branch 'master' of https://github.com/minetest/minetest
[dragonfireclient.git] / src / network / networkprotocol.h
1 /*
2 Minetest
3 Copyright (C) 2010-2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19
20 #pragma once
21
22 #include "util/string.h"
23
24 /*
25         changes by PROTOCOL_VERSION:
26
27         PROTOCOL_VERSION 3:
28                 Base for writing changes here
29         PROTOCOL_VERSION 4:
30                 Add TOCLIENT_MEDIA
31                 Add TOCLIENT_TOOLDEF
32                 Add TOCLIENT_NODEDEF
33                 Add TOCLIENT_CRAFTITEMDEF
34                 Add TOSERVER_INTERACT
35                 Obsolete TOSERVER_CLICK_ACTIVEOBJECT
36                 Obsolete TOSERVER_GROUND_ACTION
37         PROTOCOL_VERSION 5:
38                 Make players to be handled mostly as ActiveObjects
39         PROTOCOL_VERSION 6:
40                 Only non-cached textures are sent
41         PROTOCOL_VERSION 7:
42                 Add TOCLIENT_ITEMDEF
43                 Obsolete TOCLIENT_TOOLDEF
44                 Obsolete TOCLIENT_CRAFTITEMDEF
45                 Compress the contents of TOCLIENT_ITEMDEF and TOCLIENT_NODEDEF
46         PROTOCOL_VERSION 8:
47                 Digging based on item groups
48                 Many things
49         PROTOCOL_VERSION 9:
50                 ContentFeatures and NodeDefManager use a different serialization
51                     format; better for future version cross-compatibility
52                 Many things
53                 Obsolete TOCLIENT_PLAYERITEM
54         PROTOCOL_VERSION 10:
55                 TOCLIENT_PRIVILEGES
56                 Version raised to force 'fly' and 'fast' privileges into effect.
57                 Node metadata change (came in later; somewhat incompatible)
58         PROTOCOL_VERSION 11:
59                 TileDef in ContentFeatures
60                 Nodebox drawtype
61                 (some dev snapshot)
62                 TOCLIENT_INVENTORY_FORMSPEC
63                 (0.4.0, 0.4.1)
64         PROTOCOL_VERSION 12:
65                 TOSERVER_INVENTORY_FIELDS
66                 16-bit node ids
67                 TOCLIENT_DETACHED_INVENTORY
68         PROTOCOL_VERSION 13:
69                 InventoryList field "Width" (deserialization fails with old versions)
70         PROTOCOL_VERSION 14:
71                 Added transfer of player pressed keys to the server
72                 Added new messages for mesh and bone animation, as well as attachments
73                 AO_CMD_SET_ANIMATION
74                 AO_CMD_SET_BONE_POSITION
75                 GENERIC_CMD_SET_ATTACHMENT
76         PROTOCOL_VERSION 15:
77                 Serialization format changes
78         PROTOCOL_VERSION 16:
79                 TOCLIENT_SHOW_FORMSPEC
80         PROTOCOL_VERSION 17:
81                 Serialization format change: include backface_culling flag in TileDef
82                 Added rightclickable field in nodedef
83                 TOCLIENT_SPAWN_PARTICLE
84                 TOCLIENT_ADD_PARTICLESPAWNER
85                 TOCLIENT_DELETE_PARTICLESPAWNER
86         PROTOCOL_VERSION 18:
87                 damageGroups added to ToolCapabilities
88                 sound_place added to ItemDefinition
89         PROTOCOL_VERSION 19:
90                 AO_CMD_SET_PHYSICS_OVERRIDE
91         PROTOCOL_VERSION 20:
92                 TOCLIENT_HUDADD
93                 TOCLIENT_HUDRM
94                 TOCLIENT_HUDCHANGE
95                 TOCLIENT_HUD_SET_FLAGS
96         PROTOCOL_VERSION 21:
97                 TOCLIENT_BREATH
98                 TOSERVER_BREATH
99                 range added to ItemDefinition
100                 drowning, leveled and liquid_range added to ContentFeatures
101                 stepheight and collideWithObjects added to object properties
102                 version, heat and humidity transfer in MapBock
103                 automatic_face_movement_dir and automatic_face_movement_dir_offset
104                         added to object properties
105         PROTOCOL_VERSION 22:
106                 add swap_node
107         PROTOCOL_VERSION 23:
108                 Obsolete TOSERVER_RECEIVED_MEDIA
109                 Server: Stop using TOSERVER_CLIENT_READY
110         PROTOCOL_VERSION 24:
111                 ContentFeatures version 7
112                 ContentFeatures: change number of special tiles to 6 (CF_SPECIAL_COUNT)
113         PROTOCOL_VERSION 25:
114                 Rename TOCLIENT_ACCESS_DENIED to TOCLIENT_ACCESS_DENIED_LEGAGY
115                 Rename TOCLIENT_DELETE_PARTICLESPAWNER to
116                         TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY
117                 Rename TOSERVER_PASSWORD to TOSERVER_PASSWORD_LEGACY
118                 Rename TOSERVER_INIT to TOSERVER_INIT_LEGACY
119                 Rename TOCLIENT_INIT to TOCLIENT_INIT_LEGACY
120                 Add TOCLIENT_ACCESS_DENIED new opcode (0x0A), using error codes
121                         for standard error, keeping customisation possible. This
122                         permit translation
123                 Add TOCLIENT_DELETE_PARTICLESPAWNER (0x53), fixing the u16 read and
124                         reading u32
125                 Add new opcode TOSERVER_INIT for client presentation to server
126                 Add new opcodes TOSERVER_FIRST_SRP, TOSERVER_SRP_BYTES_A,
127                         TOSERVER_SRP_BYTES_M, TOCLIENT_SRP_BYTES_S_B
128                         for the three supported auth mechanisms around srp
129                 Add new opcodes TOCLIENT_ACCEPT_SUDO_MODE and TOCLIENT_DENY_SUDO_MODE
130                         for sudo mode handling (auth mech generic way of changing password).
131                 Add TOCLIENT_HELLO for presenting server to client after client
132                         presentation
133                 Add TOCLIENT_AUTH_ACCEPT to accept connection from client
134                 Rename GENERIC_CMD_SET_ATTACHMENT to AO_CMD_ATTACH_TO
135         PROTOCOL_VERSION 26:
136                 Add TileDef tileable_horizontal, tileable_vertical flags
137         PROTOCOL_VERSION 27:
138                 backface_culling: backwards compatibility for playing with
139                 newer client on pre-27 servers.
140                 Add nodedef v3 - connected nodeboxes
141         PROTOCOL_VERSION 28:
142                 CPT2_MESHOPTIONS
143         PROTOCOL_VERSION 29:
144                 Server doesn't accept TOSERVER_BREATH anymore
145                 serialization of TileAnimation params changed
146                 TAT_SHEET_2D
147                 Removed client-sided chat perdiction
148         PROTOCOL VERSION 30:
149                 New ContentFeatures serialization version
150                 Add node and tile color and palette
151                 Fix plantlike visual_scale being applied squared and add compatibility
152                         with pre-30 clients by sending sqrt(visual_scale)
153         PROTOCOL VERSION 31:
154                 Add tile overlay
155                 Stop sending TOSERVER_CLIENT_READY
156         PROTOCOL VERSION 32:
157                 Add fading sounds
158         PROTOCOL VERSION 33:
159                 Add TOCLIENT_UPDATE_PLAYER_LIST and send the player list to the client,
160                         instead of guessing based on the active object list.
161         PROTOCOL VERSION 34:
162                 Add sound pitch
163         PROTOCOL VERSION 35:
164                 Rename TOCLIENT_CHAT_MESSAGE to TOCLIENT_CHAT_MESSAGE_OLD (0x30)
165                 Add TOCLIENT_CHAT_MESSAGE (0x2F)
166                         This chat message is a signalisation message containing various
167                         informations:
168                         * timestamp
169                         * sender
170                         * type (RAW, NORMAL, ANNOUNCE, SYSTEM)
171                         * content
172                 Add TOCLIENT_CSM_RESTRICTION_FLAGS to define which CSM features should be
173                         limited
174                 Add settable player collisionbox. Breaks compatibility with older
175                         clients as a 1-node vertical offset has been removed from player's
176                         position
177                 Add settable player stepheight using existing object property.
178                         Breaks compatibility with older clients.
179         PROTOCOL VERSION 36:
180                 Backwards compatibility drop
181                 Add 'can_zoom' to player object properties
182                 Add glow to object properties
183                 Change TileDef serialization format.
184                 Add world-aligned tiles.
185                 Mod channels
186                 Raise ObjectProperties version to 3 for removing 'can_zoom' and adding
187                         'zoom_fov'.
188                 Nodebox version 5
189                 Add disconnected nodeboxes
190                 Add TOCLIENT_FORMSPEC_PREPEND
191         PROTOCOL VERSION 37:
192                 Redo detached inventory sending
193                 Add TOCLIENT_NODEMETA_CHANGED
194                 New network float format
195                 ContentFeatures version 13
196                 Add full Euler rotations instead of just yaw
197                 Add TOCLIENT_PLAYER_SPEED
198         PROTOCOL VERSION 38:
199                 Incremental inventory sending mode
200                 Unknown inventory serialization fields no longer throw an error
201                 Mod-specific formspec version
202                 Player FOV override API
203                 "ephemeral" added to TOCLIENT_PLAY_SOUND
204         PROTOCOL VERSION 39:
205                 Updated set_sky packet
206                 Adds new sun, moon and stars packets
207                 Minimap modes
208 */
209
210 #define LATEST_PROTOCOL_VERSION 40
211 #define LATEST_PROTOCOL_VERSION_STRING TOSTRING(LATEST_PROTOCOL_VERSION)
212
213 // Server's supported network protocol range
214 #define SERVER_PROTOCOL_VERSION_MIN 37
215 #define SERVER_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
216
217 // Client's supported network protocol range
218 // The minimal version depends on whether
219 // send_pre_v25_init is enabled or not
220 #define CLIENT_PROTOCOL_VERSION_MIN 37
221 #define CLIENT_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
222
223 // Constant that differentiates the protocol from random data and other protocols
224 #define PROTOCOL_ID 0x4f457403
225
226 #define PASSWORD_SIZE 28       // Maximum password length. Allows for
227                                // base64-encoded SHA-1 (27+\0).
228
229 /*
230         Changes by FORMSPEC_API_VERSION:
231
232         FORMSPEC VERSION 1:
233                 (too much)
234         FORMSPEC VERSION 2:
235                 Forced real coordinates
236                 background9[]: 9-slice scaling parameters
237         FORMSPEC VERSION 3:
238                 Formspec elements are drawn in the order of definition
239                 bgcolor[]: use 3 parameters (bgcolor, formspec (now an enum), fbgcolor)
240                 box[] and image[] elements enable clipping by default
241                 new element: scroll_container[]
242         FORMSPEC VERSION 4:
243                 Allow dropdown indexing events
244 */
245 #define FORMSPEC_API_VERSION 4
246
247 #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-"
248
249 typedef u16 session_t;
250
251 enum ToClientCommand
252 {
253         TOCLIENT_HELLO = 0x02,
254         /*
255                 Sent after TOSERVER_INIT.
256
257                 u8 deployed serialisation version
258                 u16 deployed network compression mode
259                 u16 deployed protocol version
260                 u32 supported auth methods
261                 std::string username that should be used for legacy hash (for proper casing)
262         */
263         TOCLIENT_AUTH_ACCEPT = 0x03,
264         /*
265                 Message from server to accept auth.
266
267                 v3s16 player's position + v3f(0,BS/2,0) floatToInt'd
268                 u64 map seed
269                 f1000 recommended send interval
270                 u32 : supported auth methods for sudo mode
271                       (where the user can change their password)
272         */
273         TOCLIENT_ACCEPT_SUDO_MODE = 0x04,
274         /*
275                 Sent to client to show it is in sudo mode now.
276         */
277         TOCLIENT_DENY_SUDO_MODE = 0x05,
278         /*
279                 Signals client that sudo mode auth failed.
280         */
281         TOCLIENT_ACCESS_DENIED = 0x0A,
282         /*
283                 u8 reason
284                 std::string custom reason (if needed, otherwise "")
285                 u8 (bool) reconnect
286         */
287
288         TOCLIENT_INIT_LEGACY = 0x10, // Obsolete
289
290         TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
291         TOCLIENT_ADDNODE = 0x21,
292         /*
293                 v3s16 position
294                 serialized mapnode
295                 u8 keep_metadata // Added in protocol version 22
296         */
297         TOCLIENT_REMOVENODE = 0x22,
298
299         TOCLIENT_PLAYERPOS = 0x23, // Obsolete
300         TOCLIENT_PLAYERINFO = 0x24, // Obsolete
301         TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
302         TOCLIENT_SECTORMETA = 0x26, // Obsolete
303
304         TOCLIENT_INVENTORY = 0x27,
305         /*
306                 [0] u16 command
307                 [2] serialized inventory
308         */
309
310         TOCLIENT_OBJECTDATA = 0x28, // Obsolete
311
312         TOCLIENT_TIME_OF_DAY = 0x29,
313         /*
314                 u16 time (0-23999)
315                 Added in a later version:
316                 f1000 time_speed
317         */
318
319         TOCLIENT_CSM_RESTRICTION_FLAGS = 0x2A,
320         /*
321                 u32 CSMRestrictionFlags byteflag
322          */
323
324         TOCLIENT_PLAYER_SPEED = 0x2B,
325         /*
326                 v3f added_vel
327          */
328
329         TOCLIENT_MEDIA_PUSH = 0x2C,
330         /*
331                 std::string raw_hash
332                 std::string filename
333                 bool should_be_cached
334                 u32 len
335                 char filedata[len]
336         */
337
338         // (oops, there is some gap here)
339
340         TOCLIENT_CHAT_MESSAGE = 0x2F,
341         /*
342                 u8 version
343                 u8 message_type
344                 u16 sendername length
345                 wstring sendername
346                 u16 length
347                 wstring message
348         */
349
350         TOCLIENT_CHAT_MESSAGE_OLD = 0x30, // Obsolete
351
352         TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
353         /*
354                 u16 count of removed objects
355                 for all removed objects {
356                         u16 id
357                 }
358                 u16 count of added objects
359                 for all added objects {
360                         u16 id
361                         u8 type
362                         u32 initialization data length
363                         string initialization data
364                 }
365         */
366
367         TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32,
368         /*
369                 for all objects
370                 {
371                         u16 id
372                         u16 message length
373                         string message
374                 }
375         */
376
377         TOCLIENT_HP = 0x33,
378         /*
379                 u8 hp
380         */
381
382         TOCLIENT_MOVE_PLAYER = 0x34,
383         /*
384                 v3f1000 player position
385                 f1000 player pitch
386                 f1000 player yaw
387         */
388
389         TOCLIENT_ACCESS_DENIED_LEGACY = 0x35,
390         /*
391                 u16 reason_length
392                 wstring reason
393         */
394
395         TOCLIENT_FOV = 0x36,
396         /*
397                 Sends an FOV override/multiplier to client.
398
399                 f32 fov
400                 bool is_multiplier
401                 f32 transition_time
402         */
403
404         TOCLIENT_DEATHSCREEN = 0x37,
405         /*
406                 u8 bool set camera point target
407                 v3f1000 camera point target (to point the death cause or whatever)
408         */
409
410         TOCLIENT_MEDIA = 0x38,
411         /*
412                 u16 total number of texture bunches
413                 u16 index of this bunch
414                 u32 number of files in this bunch
415                 for each file {
416                         u16 length of name
417                         string name
418                         u32 length of data
419                         data
420                 }
421                 u16 length of remote media server url (if applicable)
422                 string url
423         */
424
425         TOCLIENT_TOOLDEF = 0x39,
426         /*
427                 u32 length of the next item
428                 serialized ToolDefManager
429         */
430
431         TOCLIENT_NODEDEF = 0x3a,
432         /*
433                 u32 length of the next item
434                 serialized NodeDefManager
435         */
436
437         TOCLIENT_CRAFTITEMDEF = 0x3b,
438         /*
439                 u32 length of the next item
440                 serialized CraftiItemDefManager
441         */
442
443         TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
444
445         /*
446                 u32 number of files
447                 for each texture {
448                         u16 length of name
449                         string name
450                         u16 length of sha1_digest
451                         string sha1_digest
452                 }
453         */
454
455         TOCLIENT_ITEMDEF = 0x3d,
456         /*
457                 u32 length of next item
458                 serialized ItemDefManager
459         */
460
461         TOCLIENT_PLAY_SOUND = 0x3f,
462         /*
463                 s32 sound_id
464                 u16 len
465                 u8[len] sound name
466                 s32 gain*1000
467                 u8 type (0=local, 1=positional, 2=object)
468                 s32[3] pos_nodes*10000
469                 u16 object_id
470                 u8 loop (bool)
471                 u8 ephemeral (bool)
472         */
473
474         TOCLIENT_STOP_SOUND = 0x40,
475         /*
476                 s32 sound_id
477         */
478
479         TOCLIENT_PRIVILEGES = 0x41,
480         /*
481                 u16 number of privileges
482                 for each privilege
483                         u16 len
484                         u8[len] privilege
485         */
486
487         TOCLIENT_INVENTORY_FORMSPEC = 0x42,
488         /*
489                 u32 len
490                 u8[len] formspec
491         */
492
493         TOCLIENT_DETACHED_INVENTORY = 0x43,
494         /*
495                 [0] u16 command
496                 u16 len
497                 u8[len] name
498                 [2] serialized inventory
499         */
500
501         TOCLIENT_SHOW_FORMSPEC = 0x44,
502         /*
503                 [0] u16 command
504                 u32 len
505                 u8[len] formspec
506                 u16 len
507                 u8[len] formname
508         */
509
510         TOCLIENT_MOVEMENT = 0x45,
511         /*
512                 f1000 movement_acceleration_default
513                 f1000 movement_acceleration_air
514                 f1000 movement_acceleration_fast
515                 f1000 movement_speed_walk
516                 f1000 movement_speed_crouch
517                 f1000 movement_speed_fast
518                 f1000 movement_speed_climb
519                 f1000 movement_speed_jump
520                 f1000 movement_liquid_fluidity
521                 f1000 movement_liquid_fluidity_smooth
522                 f1000 movement_liquid_sink
523                 f1000 movement_gravity
524         */
525
526         TOCLIENT_SPAWN_PARTICLE = 0x46,
527         /*
528                 v3f1000 pos
529                 v3f1000 velocity
530                 v3f1000 acceleration
531                 f1000 expirationtime
532                 f1000 size
533                 u8 bool collisiondetection
534                 u32 len
535                 u8[len] texture
536                 u8 bool vertical
537                 u8 collision_removal
538                 TileAnimation animation
539                 u8 glow
540                 u8 object_collision
541         */
542
543         TOCLIENT_ADD_PARTICLESPAWNER = 0x47,
544         /*
545                 u16 amount
546                 f1000 spawntime
547                 v3f1000 minpos
548                 v3f1000 maxpos
549                 v3f1000 minvel
550                 v3f1000 maxvel
551                 v3f1000 minacc
552                 v3f1000 maxacc
553                 f1000 minexptime
554                 f1000 maxexptime
555                 f1000 minsize
556                 f1000 maxsize
557                 u8 bool collisiondetection
558                 u32 len
559                 u8[len] texture
560                 u8 bool vertical
561                 u8 collision_removal
562                 u32 id
563                 TileAnimation animation
564                 u8 glow
565                 u8 object_collision
566         */
567
568         TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48, // Obsolete
569
570         TOCLIENT_HUDADD = 0x49,
571         /*
572                 u32 id
573                 u8 type
574                 v2f1000 pos
575                 u16 len
576                 u8[len] name
577                 v2f1000 scale
578                 u16 len2
579                 u8[len2] text
580                 u32 number
581                 u32 item
582                 u32 dir
583                 v2f1000 align
584                 v2f1000 offset
585                 v3f1000 world_pos
586                 v2s32 size
587                 s16 z_index
588                 u16 len3
589                 u8[len3] text2
590         */
591
592         TOCLIENT_HUDRM = 0x4a,
593         /*
594                 u32 id
595         */
596
597         TOCLIENT_HUDCHANGE = 0x4b,
598         /*
599                 u32 id
600                 u8 stat
601                 [v2f1000 data |
602                  u32 len
603                  u8[len] data |
604                  u32 data]
605         */
606
607         TOCLIENT_HUD_SET_FLAGS = 0x4c,
608         /*
609                 u32 flags
610                 u32 mask
611         */
612
613         TOCLIENT_HUD_SET_PARAM = 0x4d,
614         /*
615                 u16 param
616                 u16 len
617                 u8[len] value
618         */
619
620         TOCLIENT_BREATH = 0x4e,
621         /*
622                 u16 breath
623         */
624
625         TOCLIENT_SET_SKY = 0x4f,
626         /*
627                 Protocol 38:
628                 u8[4] base_color (ARGB)
629                 u8 len
630                 u8[len] type
631                 u16 count
632                 foreach count:
633                         u8 len
634                         u8[len] param
635                 u8 clouds (boolean)
636
637                 Protocol 39:
638                 u8[4] bgcolor (ARGB)
639                 std::string type
640                 int texture_count
641                 std::string[6] param
642                 bool clouds
643                 bool bgcolor_fog
644                 u8[4] day_sky (ARGB)
645                 u8[4] day_horizon (ARGB)
646                 u8[4] dawn_sky (ARGB)
647                 u8[4] dawn_horizon (ARGB)
648                 u8[4] night_sky (ARGB)
649                 u8[4] night_horizon (ARGB)
650                 u8[4] indoors (ARGB)
651                 u8[4] fog_sun_tint (ARGB)
652                 u8[4] fog_moon_tint (ARGB)
653                 std::string fog_tint_type
654         */
655
656         TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO = 0x50,
657         /*
658                 u8 do_override (boolean)
659                 u16 day-night ratio 0...65535
660         */
661
662         TOCLIENT_LOCAL_PLAYER_ANIMATIONS = 0x51,
663         /*
664                 v2s32 stand/idle
665                 v2s32 walk
666                 v2s32 dig
667                 v2s32 walk+dig
668                 f1000 frame_speed
669         */
670
671         TOCLIENT_EYE_OFFSET = 0x52,
672         /*
673                 v3f1000 first
674                 v3f1000 third
675         */
676
677         TOCLIENT_DELETE_PARTICLESPAWNER = 0x53,
678         /*
679                 u32 id
680         */
681
682         TOCLIENT_CLOUD_PARAMS = 0x54,
683         /*
684                 f1000 density
685                 u8[4] color_diffuse (ARGB)
686                 u8[4] color_ambient (ARGB)
687                 f1000 height
688                 f1000 thickness
689                 v2f1000 speed
690         */
691
692         TOCLIENT_FADE_SOUND = 0x55,
693         /*
694                 s32 sound_id
695                 float step
696                 float gain
697         */
698         TOCLIENT_UPDATE_PLAYER_LIST = 0x56,
699         /*
700                 u8 type
701                 u16 number of players
702                 for each player
703                         u16 len
704                         u8[len] player name
705         */
706
707         TOCLIENT_MODCHANNEL_MSG = 0x57,
708         /*
709                 u16 channel name length
710                 std::string channel name
711                 u16 channel name sender
712                 std::string channel name
713                 u16 message length
714                 std::string message
715         */
716
717         TOCLIENT_MODCHANNEL_SIGNAL = 0x58,
718         /*
719                 u8 signal id
720                 u16 channel name length
721                 std::string channel name
722         */
723
724         TOCLIENT_NODEMETA_CHANGED = 0x59,
725         /*
726                 serialized and compressed node metadata
727         */
728
729         TOCLIENT_SET_SUN = 0x5a,
730         /*
731                 bool visible
732                 std::string texture
733                 std::string tonemap
734                 std::string sunrise
735                 f32 scale
736         */
737
738         TOCLIENT_SET_MOON = 0x5b,
739         /*
740                 bool visible
741                 std::string texture
742                 std::string tonemap
743                 f32 scale
744         */
745
746         TOCLIENT_SET_STARS = 0x5c,
747         /*
748                 bool visible
749                 u32 count
750                 u8[4] starcolor (ARGB)
751                 f32 scale
752         */
753
754         TOCLIENT_SRP_BYTES_S_B = 0x60,
755         /*
756                 Belonging to AUTH_MECHANISM_SRP.
757
758                 std::string bytes_s
759                 std::string bytes_B
760         */
761
762         TOCLIENT_FORMSPEC_PREPEND = 0x61,
763         /*
764                 u16 len
765                 u8[len] formspec
766         */
767
768         TOCLIENT_MINIMAP_MODES = 0x62,
769         /*
770                 u16 count // modes
771                 u16 mode  // wanted current mode index after change
772                 for each mode
773                         u16 type
774                         std::string label
775                         u16 size
776                         std::string extra
777         */
778
779         TOCLIENT_NUM_MSG_TYPES = 0x63,
780 };
781
782 enum ToServerCommand
783 {
784         TOSERVER_INIT = 0x02,
785         /*
786                 Sent first after connected.
787
788                 u8 serialisation version (=SER_FMT_VER_HIGHEST_READ)
789                 u16 supported network compression modes
790                 u16 minimum supported network protocol version
791                 u16 maximum supported network protocol version
792                 std::string player name
793         */
794
795         TOSERVER_INIT_LEGACY = 0x10, // Obsolete
796
797         TOSERVER_INIT2 = 0x11,
798         /*
799                 Sent as an ACK for TOCLIENT_INIT.
800                 After this, the server can send data.
801
802                 [0] u16 TOSERVER_INIT2
803         */
804
805         TOSERVER_MODCHANNEL_JOIN = 0x17,
806         /*
807                 u16 channel name length
808                 std::string channel name
809          */
810
811         TOSERVER_MODCHANNEL_LEAVE = 0x18,
812         /*
813                 u16 channel name length
814                 std::string channel name
815          */
816
817         TOSERVER_MODCHANNEL_MSG = 0x19,
818         /*
819                 u16 channel name length
820                 std::string channel name
821                 u16 message length
822                 std::string message
823          */
824
825         TOSERVER_GETBLOCK = 0x20, // Obsolete
826         TOSERVER_ADDNODE = 0x21, // Obsolete
827         TOSERVER_REMOVENODE = 0x22, // Obsolete
828
829         TOSERVER_PLAYERPOS = 0x23,
830         /*
831                 [0] u16 command
832                 [2] v3s32 position*100
833                 [2+12] v3s32 speed*100
834                 [2+12+12] s32 pitch*100
835                 [2+12+12+4] s32 yaw*100
836                 [2+12+12+4+4] u32 keyPressed
837                 [2+12+12+4+4+1] u8 fov*80
838                 [2+12+12+4+4+4+1] u8 ceil(wanted_range / MAP_BLOCKSIZE)
839         */
840
841         TOSERVER_GOTBLOCKS = 0x24,
842         /*
843                 [0] u16 command
844                 [2] u8 count
845                 [3] v3s16 pos_0
846                 [3+6] v3s16 pos_1
847                 ...
848         */
849
850         TOSERVER_DELETEDBLOCKS = 0x25,
851         /*
852                 [0] u16 command
853                 [2] u8 count
854                 [3] v3s16 pos_0
855                 [3+6] v3s16 pos_1
856                 ...
857         */
858
859         TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
860         TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
861         TOSERVER_GROUND_ACTION = 0x28, // Obsolete
862         TOSERVER_RELEASE = 0x29, // Obsolete
863         TOSERVER_SIGNTEXT = 0x30, // Obsolete
864
865         TOSERVER_INVENTORY_ACTION = 0x31,
866         /*
867                 See InventoryAction in inventorymanager.h
868         */
869
870         TOSERVER_CHAT_MESSAGE = 0x32,
871         /*
872                 u16 length
873                 wstring message
874         */
875
876         TOSERVER_SIGNNODETEXT = 0x33, // Obsolete
877         TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
878
879         TOSERVER_DAMAGE = 0x35,
880         /*
881                 u8 amount
882         */
883
884         TOSERVER_PASSWORD_LEGACY = 0x36, // Obsolete
885
886         TOSERVER_PLAYERITEM = 0x37,
887         /*
888                 Sent to change selected item.
889
890                 [0] u16 TOSERVER_PLAYERITEM
891                 [2] u16 item
892         */
893
894         TOSERVER_RESPAWN = 0x38,
895         /*
896                 u16 TOSERVER_RESPAWN
897         */
898
899         TOSERVER_INTERACT = 0x39,
900         /*
901                 [0] u16 command
902                 [2] u8 action
903                 [3] u16 item
904                 [5] u32 length of the next item
905                 [9] serialized PointedThing
906                 actions:
907                 0: start digging (from undersurface) or use
908                 1: stop digging (all parameters ignored)
909                 2: digging completed
910                 3: place block or item (to abovesurface)
911                 4: use item
912         */
913
914         TOSERVER_REMOVED_SOUNDS = 0x3a,
915         /*
916                 u16 len
917                 s32[len] sound_id
918         */
919
920         TOSERVER_NODEMETA_FIELDS = 0x3b,
921         /*
922                 v3s16 p
923                 u16 len
924                 u8[len] form name (reserved for future use)
925                 u16 number of fields
926                 for each field:
927                         u16 len
928                         u8[len] field name
929                         u32 len
930                         u8[len] field value
931         */
932
933         TOSERVER_INVENTORY_FIELDS = 0x3c,
934         /*
935                 u16 len
936                 u8[len] form name (reserved for future use)
937                 u16 number of fields
938                 for each field:
939                         u16 len
940                         u8[len] field name
941                         u32 len
942                         u8[len] field value
943         */
944
945         TOSERVER_REQUEST_MEDIA = 0x40,
946         /*
947                 u16 number of files requested
948                 for each file {
949                         u16 length of name
950                         string name
951                 }
952         */
953
954         TOSERVER_RECEIVED_MEDIA = 0x41, // Obsolete
955         TOSERVER_BREATH = 0x42, // Obsolete
956
957         TOSERVER_CLIENT_READY = 0x43,
958         /*
959                 u8 major
960                 u8 minor
961                 u8 patch
962                 u8 reserved
963                 u16 len
964                 u8[len] full_version_string
965         */
966
967         TOSERVER_FIRST_SRP = 0x50,
968         /*
969                 Belonging to AUTH_MECHANISM_FIRST_SRP.
970
971                 std::string srp salt
972                 std::string srp verification key
973                 u8 is_empty (=1 if password is empty, 0 otherwise)
974         */
975
976         TOSERVER_SRP_BYTES_A = 0x51,
977         /*
978                 Belonging to AUTH_MECHANISM_SRP,
979                         depending on current_login_based_on.
980
981                 std::string bytes_A
982                 u8 current_login_based_on : on which version of the password's
983                                             hash this login is based on (0 legacy hash,
984                                             or 1 directly the password)
985         */
986
987         TOSERVER_SRP_BYTES_M = 0x52,
988         /*
989                 Belonging to AUTH_MECHANISM_SRP.
990
991                 std::string bytes_M
992         */
993
994         TOSERVER_NUM_MSG_TYPES = 0x53,
995 };
996
997 enum AuthMechanism
998 {
999         // reserved
1000         AUTH_MECHANISM_NONE = 0,
1001
1002         // SRP based on the legacy hash
1003         AUTH_MECHANISM_LEGACY_PASSWORD = 1 << 0,
1004
1005         // SRP based on the srp verification key
1006         AUTH_MECHANISM_SRP = 1 << 1,
1007
1008         // Establishes a srp verification key, for first login and password changing
1009         AUTH_MECHANISM_FIRST_SRP = 1 << 2,
1010 };
1011
1012 enum AccessDeniedCode {
1013         SERVER_ACCESSDENIED_WRONG_PASSWORD,
1014         SERVER_ACCESSDENIED_UNEXPECTED_DATA,
1015         SERVER_ACCESSDENIED_SINGLEPLAYER,
1016         SERVER_ACCESSDENIED_WRONG_VERSION,
1017         SERVER_ACCESSDENIED_WRONG_CHARS_IN_NAME,
1018         SERVER_ACCESSDENIED_WRONG_NAME,
1019         SERVER_ACCESSDENIED_TOO_MANY_USERS,
1020         SERVER_ACCESSDENIED_EMPTY_PASSWORD,
1021         SERVER_ACCESSDENIED_ALREADY_CONNECTED,
1022         SERVER_ACCESSDENIED_SERVER_FAIL,
1023         SERVER_ACCESSDENIED_CUSTOM_STRING,
1024         SERVER_ACCESSDENIED_SHUTDOWN,
1025         SERVER_ACCESSDENIED_CRASH,
1026         SERVER_ACCESSDENIED_MAX,
1027 };
1028
1029 enum NetProtoCompressionMode {
1030         NETPROTO_COMPRESSION_NONE = 0,
1031 };
1032
1033 const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
1034         "Invalid password",
1035         "Your client sent something the server didn't expect.  Try reconnecting or updating your client",
1036         "The server is running in simple singleplayer mode.  You cannot connect.",
1037         "Your client's version is not supported.\nPlease contact server administrator.",
1038         "Player name contains disallowed characters.",
1039         "Player name not allowed.",
1040         "Too many users.",
1041         "Empty passwords are disallowed.  Set a password and try again.",
1042         "Another client is connected with this name.  If your client closed unexpectedly, try again in a minute.",
1043         "Server authentication failed.  This is likely a server error.",
1044         "",
1045         "Server shutting down.",
1046         "This server has experienced an internal error. You will now be disconnected."
1047 };
1048
1049 enum PlayerListModifer : u8
1050 {
1051         PLAYER_LIST_INIT,
1052         PLAYER_LIST_ADD,
1053         PLAYER_LIST_REMOVE,
1054 };
1055
1056 enum CSMRestrictionFlags : u64 {
1057         CSM_RF_NONE = 0x00000000,
1058         // Until server-sent CSM and verifying of builtin are complete,
1059         // 'CSM_RF_LOAD_CLIENT_MODS' also disables loading 'builtin'.
1060         // When those are complete, this should return to only being a restriction on the
1061         // loading of client mods.
1062         CSM_RF_LOAD_CLIENT_MODS = 0x00000001, // Don't load client-provided mods or 'builtin'
1063         CSM_RF_CHAT_MESSAGES = 0x00000002,    // Disable chat message sending from CSM
1064         CSM_RF_READ_ITEMDEFS = 0x00000004,    // Disable itemdef lookups
1065         CSM_RF_READ_NODEDEFS = 0x00000008,    // Disable nodedef lookups
1066         CSM_RF_LOOKUP_NODES = 0x00000010,     // Limit node lookups
1067         CSM_RF_READ_PLAYERINFO = 0x00000020,  // Disable player info lookups
1068         CSM_RF_ALL = 0xFFFFFFFF,
1069 };
1070
1071 enum InteractAction : u8
1072 {
1073         INTERACT_START_DIGGING,     // 0: start digging (from undersurface) or use
1074         INTERACT_STOP_DIGGING,      // 1: stop digging (all parameters ignored)
1075         INTERACT_DIGGING_COMPLETED, // 2: digging completed
1076         INTERACT_PLACE,             // 3: place block or item (to abovesurface)
1077         INTERACT_USE,               // 4: use item
1078         INTERACT_ACTIVATE           // 5: rightclick air ("activate")
1079 };