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