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