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