65a14ab386b40c1ecc42b6a67f166e82bbebdc2a
[oweals/minetest.git] / src / clientserver.h
1 /*
2 Minetest-c55
3 Copyright (C) 2010-2012 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 CLIENTSERVER_HEADER
21 #define CLIENTSERVER_HEADER
22
23 #include "util/pointer.h"
24
25 SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time, float time_speed);
26
27 /*
28         changes by PROTOCOL_VERSION:
29
30         PROTOCOL_VERSION 3:
31                 Base for writing changes here
32         PROTOCOL_VERSION 4:
33                 Add TOCLIENT_MEDIA
34                 Add TOCLIENT_TOOLDEF
35                 Add TOCLIENT_NODEDEF
36                 Add TOCLIENT_CRAFTITEMDEF
37                 Add TOSERVER_INTERACT
38                 Obsolete TOSERVER_CLICK_ACTIVEOBJECT
39                 Obsolete TOSERVER_GROUND_ACTION
40         PROTOCOL_VERSION 5:
41                 Make players to be handled mostly as ActiveObjects
42         PROTOCOL_VERSION 6:
43                 Only non-cached textures are sent
44         PROTOCOL_VERSION 7:
45                 Add TOCLIENT_ITEMDEF
46                 Obsolete TOCLIENT_TOOLDEF
47                 Obsolete TOCLIENT_CRAFTITEMDEF
48                 Compress the contents of TOCLIENT_ITEMDEF and TOCLIENT_NODEDEF
49         PROTOCOL_VERSION 8:
50                 Digging based on item groups
51                 Many things
52         PROTOCOL_VERSION 9:
53                 ContentFeatures and NodeDefManager use a different serialization
54                     format; better for future version cross-compatibility
55                 Many things
56         PROTOCOL_VERSION 10:
57                 TOCLIENT_PRIVILEGES
58                 Version raised to force 'fly' and 'fast' privileges into effect.
59                 Node metadata change (came in later; somewhat incompatible)
60         PROTOCOL_VERSION 11:
61                 TileDef in ContentFeatures
62                 Nodebox drawtype
63                 (some dev snapshot)
64                 TOCLIENT_INVENTORY_FORMSPEC
65                 (0.4.0, 0.4.1)
66         PROTOCOL_VERSION 12:
67                 TOSERVER_INVENTORY_FIELDS
68                 16-bit node ids
69                 TOCLIENT_DETACHED_INVENTORY
70         PROTOCOL_VERSION 13:
71                 InventoryList field "Width" (deserialization fails with old versions)
72         PROTOCOL_VERSION 14:
73                 Added transfer of player pressed keys to the server
74                 Added new messages for mesh and bone animation, as well as attachments
75                 GENERIC_CMD_SET_ANIMATION
76                 GENERIC_CMD_SET_BONE_POSITION
77                 GENERIC_CMD_SET_ATTACHMENT
78 */
79
80 // Server always only supports one version
81 #define SERVER_PROTOCOL_VERSION 14
82
83 // Client can support older versions too
84 #define CLIENT_PROTOCOL_VERSION_MIN 13
85 #define CLIENT_PROTOCOL_VERSION_MAX SERVER_PROTOCOL_VERSION
86
87 // Constant that differentiates the protocol from random data and other protocols
88 #define PROTOCOL_ID 0x4f457403
89
90 #define PASSWORD_SIZE 28       // Maximum password length. Allows for
91                                // base64-encoded SHA-1 (27+\0).
92
93 #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_."
94
95 enum ToClientCommand
96 {
97         TOCLIENT_INIT = 0x10,
98         /*
99                 Server's reply to TOSERVER_INIT.
100                 Sent second after connected.
101
102                 [0] u16 TOSERVER_INIT
103                 [2] u8 deployed version
104                 [3] v3s16 player's position + v3f(0,BS/2,0) floatToInt'd 
105                 [12] u64 map seed (new as of 2011-02-27)
106
107                 NOTE: The position in here is deprecated; position is
108                       explicitly sent afterwards
109         */
110
111         TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
112         TOCLIENT_ADDNODE = 0x21,
113         TOCLIENT_REMOVENODE = 0x22,
114         
115         TOCLIENT_PLAYERPOS = 0x23, // Obsolete
116         /*
117                 [0] u16 command
118                 // Followed by an arbitary number of these:
119                 // Number is determined from packet length.
120                 [N] u16 peer_id
121                 [N+2] v3s32 position*100
122                 [N+2+12] v3s32 speed*100
123                 [N+2+12+12] s32 pitch*100
124                 [N+2+12+12+4] s32 yaw*100
125         */
126
127         TOCLIENT_PLAYERINFO = 0x24, // Obsolete
128         /*
129                 [0] u16 command
130                 // Followed by an arbitary number of these:
131                 // Number is determined from packet length.
132                 [N] u16 peer_id
133                 [N] char[20] name
134         */
135         
136         TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
137
138         TOCLIENT_SECTORMETA = 0x26, // Obsolete
139         /*
140                 [0] u16 command
141                 [2] u8 sector count
142                 [3...] v2s16 pos + sector metadata
143         */
144
145         TOCLIENT_INVENTORY = 0x27,
146         /*
147                 [0] u16 command
148                 [2] serialized inventory
149         */
150         
151         TOCLIENT_OBJECTDATA = 0x28, // Obsolete
152         /*
153                 Sent as unreliable.
154
155                 u16 command
156                 u16 number of player positions
157                 for each player:
158                         u16 peer_id
159                         v3s32 position*100
160                         v3s32 speed*100
161                         s32 pitch*100
162                         s32 yaw*100
163                 u16 count of blocks
164                 for each block:
165                         v3s16 blockpos
166                         block objects
167         */
168
169         TOCLIENT_TIME_OF_DAY = 0x29,
170         /*
171                 u16 command
172                 u16 time (0-23999)
173                 Added in a later version:
174                 f1000 time_speed
175         */
176
177         // (oops, there is some gap here)
178
179         TOCLIENT_CHAT_MESSAGE = 0x30,
180         /*
181                 u16 command
182                 u16 length
183                 wstring message
184         */
185
186         TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
187         /*
188                 u16 command
189                 u16 count of removed objects
190                 for all removed objects {
191                         u16 id
192                 }
193                 u16 count of added objects
194                 for all added objects {
195                         u16 id
196                         u8 type
197                         u32 initialization data length
198                         string initialization data
199                 }
200         */
201         
202         TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32,
203         /*
204                 u16 command
205                 for all objects
206                 {
207                         u16 id
208                         u16 message length
209                         string message
210                 }
211         */
212
213         TOCLIENT_HP = 0x33,
214         /*
215                 u16 command
216                 u8 hp
217         */
218
219         TOCLIENT_MOVE_PLAYER = 0x34,
220         /*
221                 u16 command
222                 v3f1000 player position
223                 f1000 player pitch
224                 f1000 player yaw
225         */
226
227         TOCLIENT_ACCESS_DENIED = 0x35,
228         /*
229                 u16 command
230                 u16 reason_length
231                 wstring reason
232         */
233
234         TOCLIENT_PLAYERITEM = 0x36, // Obsolete
235         /*
236                 u16 command
237                 u16 count of player items
238                 for all player items {
239                         u16 peer id
240                         u16 length of serialized item
241                         string serialized item
242                 }
243         */
244
245         TOCLIENT_DEATHSCREEN = 0x37,
246         /*
247                 u16 command
248                 u8 bool set camera point target
249                 v3f1000 camera point target (to point the death cause or whatever)
250         */
251
252         TOCLIENT_MEDIA = 0x38,
253         /*
254                 u16 command
255                 u16 total number of texture bunches
256                 u16 index of this bunch
257                 u32 number of files in this bunch
258                 for each file {
259                         u16 length of name
260                         string name
261                         u32 length of data
262                         data
263                 }
264         */
265         
266         TOCLIENT_TOOLDEF = 0x39,
267         /*
268                 u16 command
269                 u32 length of the next item
270                 serialized ToolDefManager
271         */
272         
273         TOCLIENT_NODEDEF = 0x3a,
274         /*
275                 u16 command
276                 u32 length of the next item
277                 serialized NodeDefManager
278         */
279         
280         TOCLIENT_CRAFTITEMDEF = 0x3b,
281         /*
282                 u16 command
283                 u32 length of the next item
284                 serialized CraftiItemDefManager
285         */
286
287         TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
288
289         /*
290                 u16 command
291                 u32 number of files
292                 for each texture {
293                         u16 length of name
294                         string name
295                         u16 length of sha1_digest
296                         string sha1_digest
297                 }
298         */
299
300         TOCLIENT_ITEMDEF = 0x3d,
301         /*
302                 u16 command
303                 u32 length of next item
304                 serialized ItemDefManager
305         */
306         
307         TOCLIENT_PLAY_SOUND = 0x3f,
308         /*
309                 u16 command
310                 s32 sound_id
311                 u16 len
312                 u8[len] sound name
313                 s32 gain*1000
314                 u8 type (0=local, 1=positional, 2=object)
315                 s32[3] pos_nodes*10000
316                 u16 object_id
317                 u8 loop (bool)
318         */
319
320         TOCLIENT_STOP_SOUND = 0x40,
321         /*
322                 u16 command
323                 s32 sound_id
324         */
325
326         TOCLIENT_PRIVILEGES = 0x41,
327         /*
328                 u16 command
329                 u16 number of privileges
330                 for each privilege
331                         u16 len
332                         u8[len] privilege
333         */
334
335         TOCLIENT_INVENTORY_FORMSPEC = 0x42,
336         /*
337                 u16 command
338                 u32 len
339                 u8[len] formspec
340         */
341
342         TOCLIENT_DETACHED_INVENTORY = 0x43,
343         /*
344                 [0] u16 command
345                 u16 len
346                 u8[len] name
347                 [2] serialized inventory
348         */
349 };
350
351 enum ToServerCommand
352 {
353         TOSERVER_INIT=0x10,
354         /*
355                 Sent first after connected.
356
357                 [0] u16 TOSERVER_INIT
358                 [2] u8 SER_FMT_VER_HIGHEST
359                 [3] u8[20] player_name
360                 [23] u8[28] password (new in some version)
361                 [51] u16 minimum supported network protocol version (added sometime)
362                 [53] u16 maximum supported network protocol version (added later than the previous one)
363         */
364
365         TOSERVER_INIT2 = 0x11,
366         /*
367                 Sent as an ACK for TOCLIENT_INIT.
368                 After this, the server can send data.
369
370                 [0] u16 TOSERVER_INIT2
371         */
372
373         TOSERVER_GETBLOCK=0x20, // Obsolete
374         TOSERVER_ADDNODE = 0x21, // Obsolete
375         TOSERVER_REMOVENODE = 0x22, // Obsolete
376
377         TOSERVER_PLAYERPOS = 0x23,
378         /*
379                 [0] u16 command
380                 [2] v3s32 position*100
381                 [2+12] v3s32 speed*100
382                 [2+12+12] s32 pitch*100
383                 [2+12+12+4] s32 yaw*100
384                 [2+12+12+4+4] u32 keyPressed
385         */
386
387         TOSERVER_GOTBLOCKS = 0x24,
388         /*
389                 [0] u16 command
390                 [2] u8 count
391                 [3] v3s16 pos_0
392                 [3+6] v3s16 pos_1
393                 ...
394         */
395
396         TOSERVER_DELETEDBLOCKS = 0x25,
397         /*
398                 [0] u16 command
399                 [2] u8 count
400                 [3] v3s16 pos_0
401                 [3+6] v3s16 pos_1
402                 ...
403         */
404
405         TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
406         /*
407                 [0] u16 command
408                 [2] v3s16 pos
409                 [8] u16 i
410         */
411
412         TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
413         /*
414                 length: 13
415                 [0] u16 command
416                 [2] u8 button (0=left, 1=right)
417                 [3] v3s16 blockpos
418                 [9] s16 id
419                 [11] u16 item
420         */
421
422         TOSERVER_GROUND_ACTION = 0x28, // Obsolete
423         /*
424                 length: 17
425                 [0] u16 command
426                 [2] u8 action
427                 [3] v3s16 nodepos_undersurface
428                 [9] v3s16 nodepos_abovesurface
429                 [15] u16 item
430                 actions:
431                 0: start digging (from undersurface)
432                 1: place block (to abovesurface)
433                 2: stop digging (all parameters ignored)
434                 3: digging completed
435         */
436         
437         TOSERVER_RELEASE = 0x29, // Obsolete
438
439         // (oops, there is some gap here)
440
441         TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
442         /*
443                 u16 command
444                 v3s16 blockpos
445                 s16 id
446                 u16 textlen
447                 textdata
448         */
449
450         TOSERVER_INVENTORY_ACTION = 0x31,
451         /*
452                 See InventoryAction in inventory.h
453         */
454
455         TOSERVER_CHAT_MESSAGE = 0x32,
456         /*
457                 u16 command
458                 u16 length
459                 wstring message
460         */
461
462         TOSERVER_SIGNNODETEXT = 0x33, // obsolete
463         /*
464                 u16 command
465                 v3s16 p
466                 u16 textlen
467                 textdata
468         */
469
470         TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
471         /*
472                 length: 7
473                 [0] u16 command
474                 [2] u8 button (0=left, 1=right)
475                 [3] u16 id
476                 [5] u16 item
477         */
478         
479         TOSERVER_DAMAGE = 0x35,
480         /*
481                 u16 command
482                 u8 amount
483         */
484
485         TOSERVER_PASSWORD=0x36,
486         /*
487                 Sent to change password.
488
489                 [0] u16 TOSERVER_PASSWORD
490                 [2] u8[28] old password
491                 [30] u8[28] new password
492         */
493
494         TOSERVER_PLAYERITEM=0x37,
495         /*
496                 Sent to change selected item.
497
498                 [0] u16 TOSERVER_PLAYERITEM
499                 [2] u16 item
500         */
501         
502         TOSERVER_RESPAWN=0x38,
503         /*
504                 u16 TOSERVER_RESPAWN
505         */
506
507         TOSERVER_INTERACT = 0x39,
508         /*
509                 [0] u16 command
510                 [2] u8 action
511                 [3] u16 item
512                 [5] u32 length of the next item
513                 [9] serialized PointedThing
514                 actions:
515                 0: start digging (from undersurface) or use
516                 1: stop digging (all parameters ignored)
517                 2: digging completed
518                 3: place block or item (to abovesurface)
519                 4: use item
520
521                 (Obsoletes TOSERVER_GROUND_ACTION and TOSERVER_CLICK_ACTIVEOBJECT.)
522         */
523         
524         TOSERVER_REMOVED_SOUNDS = 0x3a,
525         /*
526                 u16 command
527                 u16 len
528                 s32[len] sound_id
529         */
530
531         TOSERVER_NODEMETA_FIELDS = 0x3b,
532         /*
533                 u16 command
534                 v3s16 p
535                 u16 len
536                 u8[len] form name (reserved for future use)
537                 u16 number of fields
538                 for each field:
539                         u16 len
540                         u8[len] field name
541                         u32 len
542                         u8[len] field value
543         */
544
545         TOSERVER_INVENTORY_FIELDS = 0x3c,
546         /*
547                 u16 command
548                 u16 len
549                 u8[len] form name (reserved for future use)
550                 u16 number of fields
551                 for each field:
552                         u16 len
553                         u8[len] field name
554                         u32 len
555                         u8[len] field value
556         */
557
558         TOSERVER_REQUEST_MEDIA = 0x40,
559         /*
560                 u16 command
561                 u16 number of files requested
562                 for each file {
563                         u16 length of name
564                         string name
565                 }
566          */
567
568 };
569
570 #endif
571