3 Copyright (C) 2010 celeron55, Perttu Ahola <celeron55@gmail.com>
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.
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.
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.
20 #ifndef CLIENTSERVER_HEADER
21 #define CLIENTSERVER_HEADER
23 #include "util/serialize.h"
26 changes by PROTOCOL_VERSION:
29 Base for writing changes here
34 Add TOCLIENT_CRAFTITEMDEF
36 Obsolete TOSERVER_CLICK_ACTIVEOBJECT
37 Obsolete TOSERVER_GROUND_ACTION
39 Make players to be handled mostly as ActiveObjects
41 Only non-cached textures are sent
44 Obsolete TOCLIENT_TOOLDEF
45 Obsolete TOCLIENT_CRAFTITEMDEF
46 Compress the contents of TOCLIENT_ITEMDEF and TOCLIENT_NODEDEF
48 Digging based on item groups
51 ContentFeatures and NodeDefManager use a different serialization
52 format; better for future version cross-compatibility
56 Version raised to force 'fly' and 'fast' privileges into effect.
57 Node metadata change (came in later; somewhat incompatible)
59 TileDef in ContentFeatures
62 TOCLIENT_INVENTORY_FORMSPEC
65 TOSERVER_INVENTORY_FIELDS
67 TOCLIENT_DETACHED_INVENTORY
69 InventoryList field "Width" (deserialization fails with old versions)
71 Added transfer of player pressed keys to the server
72 Added new messages for mesh and bone animation, as well as attachments
73 GENERIC_CMD_SET_ANIMATION
74 GENERIC_CMD_SET_BONE_POSITION
75 GENERIC_CMD_SET_ATTACHMENT
78 // Server always only supports one version
79 #define SERVER_PROTOCOL_VERSION 14
81 // Client can support older versions too
82 #define CLIENT_PROTOCOL_VERSION_MIN 13
83 #define CLIENT_PROTOCOL_VERSION_MAX SERVER_PROTOCOL_VERSION
85 // Constant that differentiates the protocol from random data and other protocols
86 #define PROTOCOL_ID 0x4f457403
88 #define PASSWORD_SIZE 28 // Maximum password length. Allows for
89 // base64-encoded SHA-1 (27+\0).
91 #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_."
97 Server's reply to TOSERVER_INIT.
98 Sent second after connected.
100 [0] u16 TOSERVER_INIT
101 [2] u8 deployed version
102 [3] v3s16 player's position + v3f(0,BS/2,0) floatToInt'd
103 [12] u64 map seed (new as of 2011-02-27)
105 NOTE: The position in here is deprecated; position is
106 explicitly sent afterwards
109 TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
110 TOCLIENT_ADDNODE = 0x21,
111 TOCLIENT_REMOVENODE = 0x22,
113 TOCLIENT_PLAYERPOS = 0x23, // Obsolete
116 // Followed by an arbitary number of these:
117 // Number is determined from packet length.
119 [N+2] v3s32 position*100
120 [N+2+12] v3s32 speed*100
121 [N+2+12+12] s32 pitch*100
122 [N+2+12+12+4] s32 yaw*100
125 TOCLIENT_PLAYERINFO = 0x24, // Obsolete
128 // Followed by an arbitary number of these:
129 // Number is determined from packet length.
134 TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
136 TOCLIENT_SECTORMETA = 0x26, // Obsolete
140 [3...] v2s16 pos + sector metadata
143 TOCLIENT_INVENTORY = 0x27,
146 [2] serialized inventory
149 TOCLIENT_OBJECTDATA = 0x28, // Obsolete
154 u16 number of player positions
167 TOCLIENT_TIME_OF_DAY = 0x29,
171 Added in a later version:
175 // (oops, there is some gap here)
177 TOCLIENT_CHAT_MESSAGE = 0x30,
184 TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
187 u16 count of removed objects
188 for all removed objects {
191 u16 count of added objects
192 for all added objects {
195 u32 initialization data length
196 string initialization data
200 TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32,
217 TOCLIENT_MOVE_PLAYER = 0x34,
220 v3f1000 player position
225 TOCLIENT_ACCESS_DENIED = 0x35,
232 TOCLIENT_PLAYERITEM = 0x36, // Obsolete
235 u16 count of player items
236 for all player items {
238 u16 length of serialized item
239 string serialized item
243 TOCLIENT_DEATHSCREEN = 0x37,
246 u8 bool set camera point target
247 v3f1000 camera point target (to point the death cause or whatever)
250 TOCLIENT_MEDIA = 0x38,
253 u16 total number of texture bunches
254 u16 index of this bunch
255 u32 number of files in this bunch
264 TOCLIENT_TOOLDEF = 0x39,
267 u32 length of the next item
268 serialized ToolDefManager
271 TOCLIENT_NODEDEF = 0x3a,
274 u32 length of the next item
275 serialized NodeDefManager
278 TOCLIENT_CRAFTITEMDEF = 0x3b,
281 u32 length of the next item
282 serialized CraftiItemDefManager
285 TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
293 u16 length of sha1_digest
298 TOCLIENT_ITEMDEF = 0x3d,
301 u32 length of next item
302 serialized ItemDefManager
305 TOCLIENT_PLAY_SOUND = 0x3f,
312 u8 type (0=local, 1=positional, 2=object)
313 s32[3] pos_nodes*10000
318 TOCLIENT_STOP_SOUND = 0x40,
324 TOCLIENT_PRIVILEGES = 0x41,
327 u16 number of privileges
333 TOCLIENT_INVENTORY_FORMSPEC = 0x42,
340 TOCLIENT_DETACHED_INVENTORY = 0x43,
345 [2] serialized inventory
353 Sent first after connected.
355 [0] u16 TOSERVER_INIT
356 [2] u8 SER_FMT_VER_HIGHEST
357 [3] u8[20] player_name
358 [23] u8[28] password (new in some version)
359 [51] u16 minimum supported network protocol version (added sometime)
360 [53] u16 maximum supported network protocol version (added later than the previous one)
363 TOSERVER_INIT2 = 0x11,
365 Sent as an ACK for TOCLIENT_INIT.
366 After this, the server can send data.
368 [0] u16 TOSERVER_INIT2
371 TOSERVER_GETBLOCK=0x20, // Obsolete
372 TOSERVER_ADDNODE = 0x21, // Obsolete
373 TOSERVER_REMOVENODE = 0x22, // Obsolete
375 TOSERVER_PLAYERPOS = 0x23,
378 [2] v3s32 position*100
379 [2+12] v3s32 speed*100
380 [2+12+12] s32 pitch*100
381 [2+12+12+4] s32 yaw*100
382 [2+12+12+4+4] u32 keyPressed
385 TOSERVER_GOTBLOCKS = 0x24,
394 TOSERVER_DELETEDBLOCKS = 0x25,
403 TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
410 TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
414 [2] u8 button (0=left, 1=right)
420 TOSERVER_GROUND_ACTION = 0x28, // Obsolete
425 [3] v3s16 nodepos_undersurface
426 [9] v3s16 nodepos_abovesurface
429 0: start digging (from undersurface)
430 1: place block (to abovesurface)
431 2: stop digging (all parameters ignored)
435 TOSERVER_RELEASE = 0x29, // Obsolete
437 // (oops, there is some gap here)
439 TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
448 TOSERVER_INVENTORY_ACTION = 0x31,
450 See InventoryAction in inventory.h
453 TOSERVER_CHAT_MESSAGE = 0x32,
460 TOSERVER_SIGNNODETEXT = 0x33, // obsolete
468 TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
472 [2] u8 button (0=left, 1=right)
477 TOSERVER_DAMAGE = 0x35,
483 TOSERVER_PASSWORD=0x36,
485 Sent to change password.
487 [0] u16 TOSERVER_PASSWORD
488 [2] u8[28] old password
489 [30] u8[28] new password
492 TOSERVER_PLAYERITEM=0x37,
494 Sent to change selected item.
496 [0] u16 TOSERVER_PLAYERITEM
500 TOSERVER_RESPAWN=0x38,
505 TOSERVER_INTERACT = 0x39,
510 [5] u32 length of the next item
511 [9] serialized PointedThing
513 0: start digging (from undersurface) or use
514 1: stop digging (all parameters ignored)
516 3: place block or item (to abovesurface)
519 (Obsoletes TOSERVER_GROUND_ACTION and TOSERVER_CLICK_ACTIVEOBJECT.)
522 TOSERVER_REMOVED_SOUNDS = 0x3a,
529 TOSERVER_NODEMETA_FIELDS = 0x3b,
534 u8[len] form name (reserved for future use)
543 TOSERVER_INVENTORY_FIELDS = 0x3c,
547 u8[len] form name (reserved for future use)
556 TOSERVER_REQUEST_MEDIA = 0x40,
559 u16 number of files requested
568 inline SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time, float time_speed)
570 SharedBuffer<u8> data(2+2+4);
571 writeU16(&data[0], TOCLIENT_TIME_OF_DAY);
572 writeU16(&data[2], time);
573 writeF1000(&data[4], time_speed);