]> git.lizzy.rs Git - minetest.git/blob - src/network/networkprotocol.h
Fix OSX building issue caused by ad884f2
[minetest.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 #ifndef NETWORKPROTOCOL_HEADER
21 #define NETWORKPROTOCOL_HEADER
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         PROTOCOL_VERSION 10:
54                 TOCLIENT_PRIVILEGES
55                 Version raised to force 'fly' and 'fast' privileges into effect.
56                 Node metadata change (came in later; somewhat incompatible)
57         PROTOCOL_VERSION 11:
58                 TileDef in ContentFeatures
59                 Nodebox drawtype
60                 (some dev snapshot)
61                 TOCLIENT_INVENTORY_FORMSPEC
62                 (0.4.0, 0.4.1)
63         PROTOCOL_VERSION 12:
64                 TOSERVER_INVENTORY_FIELDS
65                 16-bit node ids
66                 TOCLIENT_DETACHED_INVENTORY
67         PROTOCOL_VERSION 13:
68                 InventoryList field "Width" (deserialization fails with old versions)
69         PROTOCOL_VERSION 14:
70                 Added transfer of player pressed keys to the server
71                 Added new messages for mesh and bone animation, as well as attachments
72                 GENERIC_CMD_SET_ANIMATION
73                 GENERIC_CMD_SET_BONE_POSITION
74                 GENERIC_CMD_SET_ATTACHMENT
75         PROTOCOL_VERSION 15:
76                 Serialization format changes
77         PROTOCOL_VERSION 16:
78                 TOCLIENT_SHOW_FORMSPEC
79         PROTOCOL_VERSION 17:
80                 Serialization format change: include backface_culling flag in TileDef
81                 Added rightclickable field in nodedef
82                 TOCLIENT_SPAWN_PARTICLE
83                 TOCLIENT_ADD_PARTICLESPAWNER
84                 TOCLIENT_DELETE_PARTICLESPAWNER
85         PROTOCOL_VERSION 18:
86                 damageGroups added to ToolCapabilities
87                 sound_place added to ItemDefinition
88         PROTOCOL_VERSION 19:
89                 GENERIC_CMD_SET_PHYSICS_OVERRIDE
90         PROTOCOL_VERSION 20:
91                 TOCLIENT_HUDADD
92                 TOCLIENT_HUDRM
93                 TOCLIENT_HUDCHANGE
94                 TOCLIENT_HUD_SET_FLAGS
95         PROTOCOL_VERSION 21:
96                 TOCLIENT_BREATH
97                 TOSERVER_BREATH
98                 range added to ItemDefinition
99                 drowning, leveled and liquid_range added to ContentFeatures
100                 stepheight and collideWithObjects added to object properties
101                 version, heat and humidity transfer in MapBock
102                 automatic_face_movement_dir and automatic_face_movement_dir_offset
103                         added to object properties
104         PROTOCOL_VERSION 22:
105                 add swap_node
106         PROTOCOL_VERSION 23:
107                 TOSERVER_CLIENT_READY
108         PROTOCOL_VERSION 24:
109                 ContentFeatures version 7
110                 ContentFeatures: change number of special tiles to 6 (CF_SPECIAL_COUNT)
111         PROTOCOL_VERSION 25:
112                 Rename TOCLIENT_ACCESS_DENIED to TOCLIENT_ACCESS_DENIED_LEGAGY
113                 Rename TOCLIENT_DELETE_PARTICLESPAWNER to
114                         TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY
115                 Rename TOSERVER_PASSWORD to TOSERVER_PASSWORD_LEGACY
116                 Rename TOSERVER_INIT to TOSERVER_INIT_LEGACY
117                 Rename TOCLIENT_INIT to TOCLIENT_INIT_LEGACY
118                 Add TOCLIENT_ACCESS_DENIED new opcode (0x0A), using error codes
119                         for standard error, keeping customisation possible. This
120                         permit translation
121                 Add TOCLIENT_DELETE_PARTICLESPAWNER (0x53), fixing the u16 read and
122                         reading u32
123                 Add new opcode TOSERVER_INIT for client presentation to server
124                 Add new opcodes TOSERVER_FIRST_SRP, TOSERVER_SRP_BYTES_A,
125                         TOSERVER_SRP_BYTES_M, TOCLIENT_SRP_BYTES_S_B
126                         for the three supported auth mechanisms around srp
127                 Add new opcodes TOCLIENT_ACCEPT_SUDO_MODE and TOCLIENT_DENY_SUDO_MODE
128                         for sudo mode handling (auth mech generic way of changing password).
129                 Add TOCLIENT_HELLO for presenting server to client after client
130                         presentation
131                 Add TOCLIENT_AUTH_ACCEPT to accept connection from client
132                 Rename GENERIC_CMD_SET_ATTACHMENT to GENERIC_CMD_ATTACH_TO
133         PROTOCOL_VERSION 26:
134                 Add TileDef tileable_horizontal, tileable_vertical flags
135         PROTOCOL_VERSION 27:
136                 backface_culling: backwards compatibility for playing with
137                 newer client on pre-27 servers.
138 */
139
140 #define LATEST_PROTOCOL_VERSION 27
141
142 // Server's supported network protocol range
143 #define SERVER_PROTOCOL_VERSION_MIN 13
144 #define SERVER_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
145
146 // Client's supported network protocol range
147 #define CLIENT_PROTOCOL_VERSION_MIN 13
148 #define CLIENT_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
149
150 // Constant that differentiates the protocol from random data and other protocols
151 #define PROTOCOL_ID 0x4f457403
152
153 #define PASSWORD_SIZE 28       // Maximum password length. Allows for
154                                // base64-encoded SHA-1 (27+\0).
155
156 #define FORMSPEC_API_VERSION 1
157 #define FORMSPEC_VERSION_STRING "formspec_version[" TOSTRING(FORMSPEC_API_VERSION) "]"
158
159 #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.-"
160
161 enum ToClientCommand
162 {
163         TOCLIENT_HELLO = 0x02,
164         /*
165                 Sent after TOSERVER_INIT.
166
167                 u8 deployed serialisation version
168                 u16 deployed network compression mode
169                 u16 deployed protocol version
170                 u32 supported auth methods
171                 std::string username that should be used for legacy hash (for proper casing)
172         */
173         TOCLIENT_AUTH_ACCEPT = 0x03,
174         /*
175                 Message from server to accept auth.
176
177                 v3s16 player's position + v3f(0,BS/2,0) floatToInt'd
178                 u64 map seed
179                 f1000 recommended send interval
180                 u32 : supported auth methods for sudo mode
181                       (where the user can change their password)
182         */
183         TOCLIENT_ACCEPT_SUDO_MODE = 0x04,
184         /*
185                 Sent to client to show it is in sudo mode now.
186         */
187         TOCLIENT_DENY_SUDO_MODE = 0x05,
188         /*
189                 Signals client that sudo mode auth failed.
190         */
191         TOCLIENT_INIT_LEGACY = 0x10,
192         /*
193                 Server's reply to TOSERVER_INIT.
194                 Sent second after connected.
195
196                 [0] u16 TOSERVER_INIT
197                 [2] u8 deployed version
198                 [3] v3s16 player's position + v3f(0,BS/2,0) floatToInt'd
199                 [12] u64 map seed (new as of 2011-02-27)
200                 [20] f1000 recommended send interval (in seconds) (new as of 14)
201
202                 NOTE: The position in here is deprecated; position is
203                       explicitly sent afterwards
204         */
205         TOCLIENT_ACCESS_DENIED = 0x0A,
206         /*
207                 u8 reason
208                 std::string custom reason (if needed, otherwise "")
209                 u8 (bool) reconnect
210         */
211         TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
212         TOCLIENT_ADDNODE = 0x21,
213         /*
214                 v3s16 position
215                 serialized mapnode
216                 u8 keep_metadata // Added in protocol version 22
217         */
218         TOCLIENT_REMOVENODE = 0x22,
219
220         TOCLIENT_PLAYERPOS = 0x23, // Obsolete
221         /*
222                 [0] u16 command
223                 // Followed by an arbitary number of these:
224                 // Number is determined from packet length.
225                 [N] u16 peer_id
226                 [N+2] v3s32 position*100
227                 [N+2+12] v3s32 speed*100
228                 [N+2+12+12] s32 pitch*100
229                 [N+2+12+12+4] s32 yaw*100
230         */
231
232         TOCLIENT_PLAYERINFO = 0x24, // Obsolete
233         /*
234                 [0] u16 command
235                 // Followed by an arbitary number of these:
236                 // Number is determined from packet length.
237                 [N] u16 peer_id
238                 [N] char[20] name
239         */
240
241         TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
242
243         TOCLIENT_SECTORMETA = 0x26, // Obsolete
244         /*
245                 [0] u16 command
246                 [2] u8 sector count
247                 [3...] v2s16 pos + sector metadata
248         */
249
250         TOCLIENT_INVENTORY = 0x27,
251         /*
252                 [0] u16 command
253                 [2] serialized inventory
254         */
255
256         TOCLIENT_OBJECTDATA = 0x28, // Obsolete
257         /*
258                 Sent as unreliable.
259
260                 u16 number of player positions
261                 for each player:
262                         u16 peer_id
263                         v3s32 position*100
264                         v3s32 speed*100
265                         s32 pitch*100
266                         s32 yaw*100
267                 u16 count of blocks
268                 for each block:
269                         v3s16 blockpos
270                         block objects
271         */
272
273         TOCLIENT_TIME_OF_DAY = 0x29,
274         /*
275                 u16 time (0-23999)
276                 Added in a later version:
277                 f1000 time_speed
278         */
279
280         // (oops, there is some gap here)
281
282         TOCLIENT_CHAT_MESSAGE = 0x30,
283         /*
284                 u16 length
285                 wstring message
286         */
287
288         TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
289         /*
290                 u16 count of removed objects
291                 for all removed objects {
292                         u16 id
293                 }
294                 u16 count of added objects
295                 for all added objects {
296                         u16 id
297                         u8 type
298                         u32 initialization data length
299                         string initialization data
300                 }
301         */
302
303         TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32,
304         /*
305                 for all objects
306                 {
307                         u16 id
308                         u16 message length
309                         string message
310                 }
311         */
312
313         TOCLIENT_HP = 0x33,
314         /*
315                 u8 hp
316         */
317
318         TOCLIENT_MOVE_PLAYER = 0x34,
319         /*
320                 v3f1000 player position
321                 f1000 player pitch
322                 f1000 player yaw
323         */
324
325         TOCLIENT_ACCESS_DENIED_LEGACY = 0x35,
326         /*
327                 u16 reason_length
328                 wstring reason
329         */
330
331         TOCLIENT_PLAYERITEM = 0x36, // Obsolete
332         /*
333                 u16 count of player items
334                 for all player items {
335                         u16 peer id
336                         u16 length of serialized item
337                         string serialized item
338                 }
339         */
340
341         TOCLIENT_DEATHSCREEN = 0x37,
342         /*
343                 u8 bool set camera point target
344                 v3f1000 camera point target (to point the death cause or whatever)
345         */
346
347         TOCLIENT_MEDIA = 0x38,
348         /*
349                 u16 total number of texture bunches
350                 u16 index of this bunch
351                 u32 number of files in this bunch
352                 for each file {
353                         u16 length of name
354                         string name
355                         u32 length of data
356                         data
357                 }
358                 u16 length of remote media server url (if applicable)
359                 string url
360         */
361
362         TOCLIENT_TOOLDEF = 0x39,
363         /*
364                 u32 length of the next item
365                 serialized ToolDefManager
366         */
367
368         TOCLIENT_NODEDEF = 0x3a,
369         /*
370                 u32 length of the next item
371                 serialized NodeDefManager
372         */
373
374         TOCLIENT_CRAFTITEMDEF = 0x3b,
375         /*
376                 u32 length of the next item
377                 serialized CraftiItemDefManager
378         */
379
380         TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
381
382         /*
383                 u32 number of files
384                 for each texture {
385                         u16 length of name
386                         string name
387                         u16 length of sha1_digest
388                         string sha1_digest
389                 }
390         */
391
392         TOCLIENT_ITEMDEF = 0x3d,
393         /*
394                 u32 length of next item
395                 serialized ItemDefManager
396         */
397
398         TOCLIENT_PLAY_SOUND = 0x3f,
399         /*
400                 s32 sound_id
401                 u16 len
402                 u8[len] sound name
403                 s32 gain*1000
404                 u8 type (0=local, 1=positional, 2=object)
405                 s32[3] pos_nodes*10000
406                 u16 object_id
407                 u8 loop (bool)
408         */
409
410         TOCLIENT_STOP_SOUND = 0x40,
411         /*
412                 s32 sound_id
413         */
414
415         TOCLIENT_PRIVILEGES = 0x41,
416         /*
417                 u16 number of privileges
418                 for each privilege
419                         u16 len
420                         u8[len] privilege
421         */
422
423         TOCLIENT_INVENTORY_FORMSPEC = 0x42,
424         /*
425                 u32 len
426                 u8[len] formspec
427         */
428
429         TOCLIENT_DETACHED_INVENTORY = 0x43,
430         /*
431                 [0] u16 command
432                 u16 len
433                 u8[len] name
434                 [2] serialized inventory
435         */
436
437         TOCLIENT_SHOW_FORMSPEC = 0x44,
438         /*
439                 [0] u16 command
440                 u32 len
441                 u8[len] formspec
442                 u16 len
443                 u8[len] formname
444         */
445
446         TOCLIENT_MOVEMENT = 0x45,
447         /*
448                 f1000 movement_acceleration_default
449                 f1000 movement_acceleration_air
450                 f1000 movement_acceleration_fast
451                 f1000 movement_speed_walk
452                 f1000 movement_speed_crouch
453                 f1000 movement_speed_fast
454                 f1000 movement_speed_climb
455                 f1000 movement_speed_jump
456                 f1000 movement_liquid_fluidity
457                 f1000 movement_liquid_fluidity_smooth
458                 f1000 movement_liquid_sink
459                 f1000 movement_gravity
460         */
461
462         TOCLIENT_SPAWN_PARTICLE = 0x46,
463         /*
464                 v3f1000 pos
465                 v3f1000 velocity
466                 v3f1000 acceleration
467                 f1000 expirationtime
468                 f1000 size
469                 u8 bool collisiondetection
470                 u8 bool vertical
471                 u32 len
472                 u8[len] texture
473         */
474
475         TOCLIENT_ADD_PARTICLESPAWNER = 0x47,
476         /*
477                 u16 amount
478                 f1000 spawntime
479                 v3f1000 minpos
480                 v3f1000 maxpos
481                 v3f1000 minvel
482                 v3f1000 maxvel
483                 v3f1000 minacc
484                 v3f1000 maxacc
485                 f1000 minexptime
486                 f1000 maxexptime
487                 f1000 minsize
488                 f1000 maxsize
489                 u8 bool collisiondetection
490                 u8 bool vertical
491                 u32 len
492                 u8[len] texture
493                 u32 id
494         */
495
496         TOCLIENT_DELETE_PARTICLESPAWNER_LEGACY = 0x48,
497         /*
498                 u16 id
499         */
500
501         TOCLIENT_HUDADD = 0x49,
502         /*
503                 u32 id
504                 u8 type
505                 v2f1000 pos
506                 u32 len
507                 u8[len] name
508                 v2f1000 scale
509                 u32 len2
510                 u8[len2] text
511                 u32 number
512                 u32 item
513                 u32 dir
514                 v2f1000 align
515                 v2f1000 offset
516                 v3f1000 world_pos
517                 v2s32 size
518         */
519
520         TOCLIENT_HUDRM = 0x4a,
521         /*
522                 u32 id
523         */
524
525         TOCLIENT_HUDCHANGE = 0x4b,
526         /*
527                 u32 id
528                 u8 stat
529                 [v2f1000 data |
530                  u32 len
531                  u8[len] data |
532                  u32 data]
533         */
534
535         TOCLIENT_HUD_SET_FLAGS = 0x4c,
536         /*
537                 u32 flags
538                 u32 mask
539         */
540
541         TOCLIENT_HUD_SET_PARAM = 0x4d,
542         /*
543                 u16 param
544                 u16 len
545                 u8[len] value
546         */
547
548         TOCLIENT_BREATH = 0x4e,
549         /*
550                 u16 breath
551         */
552
553         TOCLIENT_SET_SKY = 0x4f,
554         /*
555                 u8[4] color (ARGB)
556                 u8 len
557                 u8[len] type
558                 u16 count
559                 foreach count:
560                         u8 len
561                         u8[len] param
562         */
563
564         TOCLIENT_OVERRIDE_DAY_NIGHT_RATIO = 0x50,
565         /*
566                 u8 do_override (boolean)
567                 u16 day-night ratio 0...65535
568         */
569
570         TOCLIENT_LOCAL_PLAYER_ANIMATIONS = 0x51,
571         /*
572                 v2s32 stand/idle
573                 v2s32 walk
574                 v2s32 dig
575                 v2s32 walk+dig
576                 f1000 frame_speed
577         */
578
579         TOCLIENT_EYE_OFFSET = 0x52,
580         /*
581                 v3f1000 first
582                 v3f1000 third
583         */
584
585         TOCLIENT_DELETE_PARTICLESPAWNER = 0x53,
586         /*
587                 u32 id
588         */
589
590         TOCLIENT_SRP_BYTES_S_B = 0x60,
591         /*
592                 Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP.
593
594                 std::string bytes_s
595                 std::string bytes_B
596         */
597
598         TOCLIENT_NUM_MSG_TYPES = 0x61,
599 };
600
601 enum ToServerCommand
602 {
603         TOSERVER_INIT = 0x02,
604         /*
605                 Sent first after connected.
606
607                 u8 serialisation version (=SER_FMT_VER_HIGHEST_READ)
608                 u16 supported network compression modes
609                 u16 minimum supported network protocol version
610                 u16 maximum supported network protocol version
611                 std::string player name
612         */
613
614         TOSERVER_INIT_LEGACY = 0x10,
615         /*
616                 Sent first after connected.
617
618                 [0] u16 TOSERVER_INIT_LEGACY
619                 [2] u8 SER_FMT_VER_HIGHEST_READ
620                 [3] u8[20] player_name
621                 [23] u8[28] password (new in some version)
622                 [51] u16 minimum supported network protocol version (added sometime)
623                 [53] u16 maximum supported network protocol version (added later than the previous one)
624         */
625
626         TOSERVER_INIT2 = 0x11,
627         /*
628                 Sent as an ACK for TOCLIENT_INIT.
629                 After this, the server can send data.
630
631                 [0] u16 TOSERVER_INIT2
632         */
633
634         TOSERVER_GETBLOCK=0x20, // Obsolete
635         TOSERVER_ADDNODE = 0x21, // Obsolete
636         TOSERVER_REMOVENODE = 0x22, // Obsolete
637
638         TOSERVER_PLAYERPOS = 0x23,
639         /*
640                 [0] u16 command
641                 [2] v3s32 position*100
642                 [2+12] v3s32 speed*100
643                 [2+12+12] s32 pitch*100
644                 [2+12+12+4] s32 yaw*100
645                 [2+12+12+4+4] u32 keyPressed
646         */
647
648         TOSERVER_GOTBLOCKS = 0x24,
649         /*
650                 [0] u16 command
651                 [2] u8 count
652                 [3] v3s16 pos_0
653                 [3+6] v3s16 pos_1
654                 ...
655         */
656
657         TOSERVER_DELETEDBLOCKS = 0x25,
658         /*
659                 [0] u16 command
660                 [2] u8 count
661                 [3] v3s16 pos_0
662                 [3+6] v3s16 pos_1
663                 ...
664         */
665
666         TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
667         /*
668                 [0] u16 command
669                 [2] v3s16 pos
670                 [8] u16 i
671         */
672
673         TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
674         /*
675                 length: 13
676                 [0] u16 command
677                 [2] u8 button (0=left, 1=right)
678                 [3] v3s16 blockpos
679                 [9] s16 id
680                 [11] u16 item
681         */
682
683         TOSERVER_GROUND_ACTION = 0x28, // Obsolete
684         /*
685                 length: 17
686                 [0] u16 command
687                 [2] u8 action
688                 [3] v3s16 nodepos_undersurface
689                 [9] v3s16 nodepos_abovesurface
690                 [15] u16 item
691                 actions:
692                 0: start digging (from undersurface)
693                 1: place block (to abovesurface)
694                 2: stop digging (all parameters ignored)
695                 3: digging completed
696         */
697
698         TOSERVER_RELEASE = 0x29, // Obsolete
699
700         // (oops, there is some gap here)
701
702         TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
703         /*
704                 v3s16 blockpos
705                 s16 id
706                 u16 textlen
707                 textdata
708         */
709
710         TOSERVER_INVENTORY_ACTION = 0x31,
711         /*
712                 See InventoryAction in inventorymanager.h
713         */
714
715         TOSERVER_CHAT_MESSAGE = 0x32,
716         /*
717                 u16 length
718                 wstring message
719         */
720
721         TOSERVER_SIGNNODETEXT = 0x33, // obsolete
722         /*
723                 v3s16 p
724                 u16 textlen
725                 textdata
726         */
727
728         TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
729         /*
730                 length: 7
731                 [0] u16 command
732                 [2] u8 button (0=left, 1=right)
733                 [3] u16 id
734                 [5] u16 item
735         */
736
737         TOSERVER_DAMAGE = 0x35,
738         /*
739                 u8 amount
740         */
741
742         TOSERVER_PASSWORD_LEGACY = 0x36,
743         /*
744                 Sent to change password.
745
746                 [0] u16 TOSERVER_PASSWORD
747                 [2] u8[28] old password
748                 [30] u8[28] new password
749         */
750
751         TOSERVER_PLAYERITEM = 0x37,
752         /*
753                 Sent to change selected item.
754
755                 [0] u16 TOSERVER_PLAYERITEM
756                 [2] u16 item
757         */
758
759         TOSERVER_RESPAWN = 0x38,
760         /*
761                 u16 TOSERVER_RESPAWN
762         */
763
764         TOSERVER_INTERACT = 0x39,
765         /*
766                 [0] u16 command
767                 [2] u8 action
768                 [3] u16 item
769                 [5] u32 length of the next item
770                 [9] serialized PointedThing
771                 actions:
772                 0: start digging (from undersurface) or use
773                 1: stop digging (all parameters ignored)
774                 2: digging completed
775                 3: place block or item (to abovesurface)
776                 4: use item
777
778                 (Obsoletes TOSERVER_GROUND_ACTION and TOSERVER_CLICK_ACTIVEOBJECT.)
779         */
780
781         TOSERVER_REMOVED_SOUNDS = 0x3a,
782         /*
783                 u16 len
784                 s32[len] sound_id
785         */
786
787         TOSERVER_NODEMETA_FIELDS = 0x3b,
788         /*
789                 v3s16 p
790                 u16 len
791                 u8[len] form name (reserved for future use)
792                 u16 number of fields
793                 for each field:
794                         u16 len
795                         u8[len] field name
796                         u32 len
797                         u8[len] field value
798         */
799
800         TOSERVER_INVENTORY_FIELDS = 0x3c,
801         /*
802                 u16 len
803                 u8[len] form name (reserved for future use)
804                 u16 number of fields
805                 for each field:
806                         u16 len
807                         u8[len] field name
808                         u32 len
809                         u8[len] field value
810         */
811
812         TOSERVER_REQUEST_MEDIA = 0x40,
813         /*
814                 u16 number of files requested
815                 for each file {
816                         u16 length of name
817                         string name
818                 }
819          */
820
821         TOSERVER_RECEIVED_MEDIA = 0x41,
822         /*
823                 <no payload data>
824         */
825
826         TOSERVER_BREATH = 0x42,
827         /*
828                 u16 breath
829         */
830
831         TOSERVER_CLIENT_READY = 0x43,
832         /*
833                 u8 major
834                 u8 minor
835                 u8 patch
836                 u8 reserved
837                 u16 len
838                 u8[len] full_version_string
839         */
840
841         TOSERVER_FIRST_SRP = 0x50,
842         /*
843                 Belonging to AUTH_MECHANISM_FIRST_SRP.
844
845                 std::string srp salt
846                 std::string srp verification key
847                 u8 is_empty (=1 if password is empty, 0 otherwise)
848         */
849
850         TOSERVER_SRP_BYTES_A = 0x51,
851         /*
852                 Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP,
853                         depending on current_login_based_on.
854
855                 std::string bytes_A
856                 u8 current_login_based_on : on which version of the password's
857                                             hash this login is based on (0 legacy hash,
858                                             or 1 directly the password)
859         */
860
861         TOSERVER_SRP_BYTES_M = 0x52,
862         /*
863                 Belonging to AUTH_MECHANISM_LEGACY_PASSWORD and AUTH_MECHANISM_SRP.
864
865                 std::string bytes_M
866         */
867
868         TOSERVER_NUM_MSG_TYPES = 0x53,
869 };
870
871 enum AuthMechanism
872 {
873         // reserved
874         AUTH_MECHANISM_NONE = 0,
875
876         // SRP based on the legacy hash
877         AUTH_MECHANISM_LEGACY_PASSWORD = 1 << 0,
878
879         // SRP based on the srp verification key
880         AUTH_MECHANISM_SRP = 1 << 1,
881
882         // Establishes a srp verification key, for first login and password changing
883         AUTH_MECHANISM_FIRST_SRP = 1 << 2,
884 };
885
886 enum AccessDeniedCode {
887         SERVER_ACCESSDENIED_WRONG_PASSWORD,
888         SERVER_ACCESSDENIED_UNEXPECTED_DATA,
889         SERVER_ACCESSDENIED_SINGLEPLAYER,
890         SERVER_ACCESSDENIED_WRONG_VERSION,
891         SERVER_ACCESSDENIED_WRONG_CHARS_IN_NAME,
892         SERVER_ACCESSDENIED_WRONG_NAME,
893         SERVER_ACCESSDENIED_TOO_MANY_USERS,
894         SERVER_ACCESSDENIED_EMPTY_PASSWORD,
895         SERVER_ACCESSDENIED_ALREADY_CONNECTED,
896         SERVER_ACCESSDENIED_SERVER_FAIL,
897         SERVER_ACCESSDENIED_CUSTOM_STRING,
898         SERVER_ACCESSDENIED_SHUTDOWN,
899         SERVER_ACCESSDENIED_CRASH,
900         SERVER_ACCESSDENIED_MAX,
901 };
902
903 enum NetProtoCompressionMode {
904         NETPROTO_COMPRESSION_NONE = 0,
905 };
906
907 const static std::string accessDeniedStrings[SERVER_ACCESSDENIED_MAX] = {
908         "Invalid password",
909         "Your client sent something the server didn't expect.  Try reconnecting or updating your client",
910         "The server is running in simple singleplayer mode.  You cannot connect.",
911         "Your client's version is not supported.\nPlease contact server administrator.",
912         "Player name contains disallowed characters.",
913         "Player name not allowed.",
914         "Too many users.",
915         "Empty passwords are disallowed.  Set a password and try again.",
916         "Another client is connected with this name.  If your client closed unexpectedly, try again in a minute.",
917         "Server authentication failed.  This is likely a server error.",
918         "",
919         "Server shutting down.",
920         "This server has experienced an internal error. You will now be disconnected."
921 };
922
923 #endif