Merge remote branch 'origin/master'
[oweals/minetest.git] / src / clientserver.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 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         PROTOCOL_VERSION 15:
79                 Serialization format changes
80         PROTOCOL_VERSION 16:
81                 TOCLIENT_SHOW_FORMSPEC
82         PROTOCOL_VERSION 17:
83                 Serialization format change: include backface_culling flag in TileDef
84                 Added rightclickable field in nodedef
85                 TOCLIENT_SPAWN_PARTICLE
86                 TOCLIENT_ADD_PARTICLESPAWNER
87                 TOCLIENT_DELETE_PARTICLESPAWNER
88         PROTOCOL_VERSION 18:
89                 damageGroups added to ToolCapabilities
90                 sound_place added to ItemDefinition
91         PROTOCOL_VERSION 19:
92                 GENERIC_CMD_SET_PHYSICS_OVERRIDE
93         PROTOCOL_VERSION 20:
94                 TOCLIENT_HUD_ADD
95                 TOCLIENT_HUD_RM
96                 TOCLIENT_HUD_CHANGE
97 */
98
99 #define LATEST_PROTOCOL_VERSION 20
100
101 // Server's supported network protocol range
102 #define SERVER_PROTOCOL_VERSION_MIN 13
103 #define SERVER_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
104
105 // Client's supported network protocol range
106 #define CLIENT_PROTOCOL_VERSION_MIN 13
107 #define CLIENT_PROTOCOL_VERSION_MAX LATEST_PROTOCOL_VERSION
108
109 // Constant that differentiates the protocol from random data and other protocols
110 #define PROTOCOL_ID 0x4f457403
111
112 #define PASSWORD_SIZE 28       // Maximum password length. Allows for
113                                // base64-encoded SHA-1 (27+\0).
114
115 #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_."
116
117 enum ToClientCommand
118 {
119         TOCLIENT_INIT = 0x10,
120         /*
121                 Server's reply to TOSERVER_INIT.
122                 Sent second after connected.
123
124                 [0] u16 TOSERVER_INIT
125                 [2] u8 deployed version
126                 [3] v3s16 player's position + v3f(0,BS/2,0) floatToInt'd 
127                 [12] u64 map seed (new as of 2011-02-27)
128                 [20] f1000 recommended send interval (in seconds) (new as of 14)
129
130                 NOTE: The position in here is deprecated; position is
131                       explicitly sent afterwards
132         */
133
134         TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
135         TOCLIENT_ADDNODE = 0x21,
136         TOCLIENT_REMOVENODE = 0x22,
137         
138         TOCLIENT_PLAYERPOS = 0x23, // Obsolete
139         /*
140                 [0] u16 command
141                 // Followed by an arbitary number of these:
142                 // Number is determined from packet length.
143                 [N] u16 peer_id
144                 [N+2] v3s32 position*100
145                 [N+2+12] v3s32 speed*100
146                 [N+2+12+12] s32 pitch*100
147                 [N+2+12+12+4] s32 yaw*100
148         */
149
150         TOCLIENT_PLAYERINFO = 0x24, // Obsolete
151         /*
152                 [0] u16 command
153                 // Followed by an arbitary number of these:
154                 // Number is determined from packet length.
155                 [N] u16 peer_id
156                 [N] char[20] name
157         */
158         
159         TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
160
161         TOCLIENT_SECTORMETA = 0x26, // Obsolete
162         /*
163                 [0] u16 command
164                 [2] u8 sector count
165                 [3...] v2s16 pos + sector metadata
166         */
167
168         TOCLIENT_INVENTORY = 0x27,
169         /*
170                 [0] u16 command
171                 [2] serialized inventory
172         */
173         
174         TOCLIENT_OBJECTDATA = 0x28, // Obsolete
175         /*
176                 Sent as unreliable.
177
178                 u16 command
179                 u16 number of player positions
180                 for each player:
181                         u16 peer_id
182                         v3s32 position*100
183                         v3s32 speed*100
184                         s32 pitch*100
185                         s32 yaw*100
186                 u16 count of blocks
187                 for each block:
188                         v3s16 blockpos
189                         block objects
190         */
191
192         TOCLIENT_TIME_OF_DAY = 0x29,
193         /*
194                 u16 command
195                 u16 time (0-23999)
196                 Added in a later version:
197                 f1000 time_speed
198         */
199
200         // (oops, there is some gap here)
201
202         TOCLIENT_CHAT_MESSAGE = 0x30,
203         /*
204                 u16 command
205                 u16 length
206                 wstring message
207         */
208
209         TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
210         /*
211                 u16 command
212                 u16 count of removed objects
213                 for all removed objects {
214                         u16 id
215                 }
216                 u16 count of added objects
217                 for all added objects {
218                         u16 id
219                         u8 type
220                         u32 initialization data length
221                         string initialization data
222                 }
223         */
224         
225         TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32,
226         /*
227                 u16 command
228                 for all objects
229                 {
230                         u16 id
231                         u16 message length
232                         string message
233                 }
234         */
235
236         TOCLIENT_HP = 0x33,
237         /*
238                 u16 command
239                 u8 hp
240         */
241
242         TOCLIENT_MOVE_PLAYER = 0x34,
243         /*
244                 u16 command
245                 v3f1000 player position
246                 f1000 player pitch
247                 f1000 player yaw
248         */
249
250         TOCLIENT_ACCESS_DENIED = 0x35,
251         /*
252                 u16 command
253                 u16 reason_length
254                 wstring reason
255         */
256
257         TOCLIENT_PLAYERITEM = 0x36, // Obsolete
258         /*
259                 u16 command
260                 u16 count of player items
261                 for all player items {
262                         u16 peer id
263                         u16 length of serialized item
264                         string serialized item
265                 }
266         */
267
268         TOCLIENT_DEATHSCREEN = 0x37,
269         /*
270                 u16 command
271                 u8 bool set camera point target
272                 v3f1000 camera point target (to point the death cause or whatever)
273         */
274
275         TOCLIENT_MEDIA = 0x38,
276         /*
277                 u16 command
278                 u16 total number of texture bunches
279                 u16 index of this bunch
280                 u32 number of files in this bunch
281                 for each file {
282                         u16 length of name
283                         string name
284                         u32 length of data
285                         data
286                 }
287                 u16 length of remote media server url (if applicable)
288                 string url
289         */
290         
291         TOCLIENT_TOOLDEF = 0x39,
292         /*
293                 u16 command
294                 u32 length of the next item
295                 serialized ToolDefManager
296         */
297         
298         TOCLIENT_NODEDEF = 0x3a,
299         /*
300                 u16 command
301                 u32 length of the next item
302                 serialized NodeDefManager
303         */
304         
305         TOCLIENT_CRAFTITEMDEF = 0x3b,
306         /*
307                 u16 command
308                 u32 length of the next item
309                 serialized CraftiItemDefManager
310         */
311
312         TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
313
314         /*
315                 u16 command
316                 u32 number of files
317                 for each texture {
318                         u16 length of name
319                         string name
320                         u16 length of sha1_digest
321                         string sha1_digest
322                 }
323         */
324
325         TOCLIENT_ITEMDEF = 0x3d,
326         /*
327                 u16 command
328                 u32 length of next item
329                 serialized ItemDefManager
330         */
331         
332         TOCLIENT_PLAY_SOUND = 0x3f,
333         /*
334                 u16 command
335                 s32 sound_id
336                 u16 len
337                 u8[len] sound name
338                 s32 gain*1000
339                 u8 type (0=local, 1=positional, 2=object)
340                 s32[3] pos_nodes*10000
341                 u16 object_id
342                 u8 loop (bool)
343         */
344
345         TOCLIENT_STOP_SOUND = 0x40,
346         /*
347                 u16 command
348                 s32 sound_id
349         */
350
351         TOCLIENT_PRIVILEGES = 0x41,
352         /*
353                 u16 command
354                 u16 number of privileges
355                 for each privilege
356                         u16 len
357                         u8[len] privilege
358         */
359
360         TOCLIENT_INVENTORY_FORMSPEC = 0x42,
361         /*
362                 u16 command
363                 u32 len
364                 u8[len] formspec
365         */
366
367         TOCLIENT_DETACHED_INVENTORY = 0x43,
368         /*
369                 [0] u16 command
370                 u16 len
371                 u8[len] name
372                 [2] serialized inventory
373         */
374
375         TOCLIENT_SHOW_FORMSPEC = 0x44,
376         /*
377                 [0] u16 command
378                 u32 len
379                 u8[len] formspec
380                 u16 len
381                 u8[len] formname
382         */
383
384         TOCLIENT_MOVEMENT = 0x45,
385         /*
386                 u16 command
387                 f1000 movement_acceleration_default
388                 f1000 movement_acceleration_air
389                 f1000 movement_acceleration_fast
390                 f1000 movement_speed_walk
391                 f1000 movement_speed_crouch
392                 f1000 movement_speed_fast
393                 f1000 movement_speed_climb
394                 f1000 movement_speed_jump
395                 f1000 movement_liquid_fluidity
396                 f1000 movement_liquid_fluidity_smooth
397                 f1000 movement_liquid_sink
398                 f1000 movement_gravity
399         */
400
401         TOCLIENT_SPAWN_PARTICLE = 0x46,
402         /*
403                 u16 command
404                 v3f1000 pos
405                 v3f1000 velocity
406                 v3f1000 acceleration
407                 f1000 expirationtime
408                 f1000 size
409                 u8 bool collisiondetection
410                 u32 len
411                 u8[len] texture
412         */
413
414         TOCLIENT_ADD_PARTICLESPAWNER = 0x47,
415         /*
416                 u16 command
417                 u16 amount
418                 f1000 spawntime
419                 v3f1000 minpos
420                 v3f1000 maxpos
421                 v3f1000 minvel
422                 v3f1000 maxvel
423                 v3f1000 minacc
424                 v3f1000 maxacc
425                 f1000 minexptime
426                 f1000 maxexptime
427                 f1000 minsize
428                 f1000 maxsize
429                 u8 bool collisiondetection
430                 u32 len
431                 u8[len] texture
432                 u32 id
433         */
434
435         TOCLIENT_DELETE_PARTICLESPAWNER = 0x48,
436         /*
437                 u16 command
438                 u32 id
439         */
440
441         TOCLIENT_HUDADD = 0x49,
442         /*
443                 u16 command
444                 u32 id
445                 u8 type
446                 v2f1000 pos
447                 u32 len
448                 u8[len] name
449                 v2f1000 scale
450                 u32 len2
451                 u8[len2] text
452                 u32 number
453                 u32 item
454                 u32 dir
455         */
456
457         TOCLIENT_HUDRM = 0x50,
458         /*
459                 u16 command
460                 u32 id
461         */
462
463         TOCLIENT_HUDCHANGE = 0x51,
464         /*
465                 u16 command
466                 u32 id
467                 u8 stat
468                 [v2f1000 data |
469                  u32 len
470                  u8[len] data |
471                  u32 data]
472         */
473 };
474
475 enum ToServerCommand
476 {
477         TOSERVER_INIT=0x10,
478         /*
479                 Sent first after connected.
480
481                 [0] u16 TOSERVER_INIT
482                 [2] u8 SER_FMT_VER_HIGHEST
483                 [3] u8[20] player_name
484                 [23] u8[28] password (new in some version)
485                 [51] u16 minimum supported network protocol version (added sometime)
486                 [53] u16 maximum supported network protocol version (added later than the previous one)
487         */
488
489         TOSERVER_INIT2 = 0x11,
490         /*
491                 Sent as an ACK for TOCLIENT_INIT.
492                 After this, the server can send data.
493
494                 [0] u16 TOSERVER_INIT2
495         */
496
497         TOSERVER_GETBLOCK=0x20, // Obsolete
498         TOSERVER_ADDNODE = 0x21, // Obsolete
499         TOSERVER_REMOVENODE = 0x22, // Obsolete
500
501         TOSERVER_PLAYERPOS = 0x23,
502         /*
503                 [0] u16 command
504                 [2] v3s32 position*100
505                 [2+12] v3s32 speed*100
506                 [2+12+12] s32 pitch*100
507                 [2+12+12+4] s32 yaw*100
508                 [2+12+12+4+4] u32 keyPressed
509         */
510
511         TOSERVER_GOTBLOCKS = 0x24,
512         /*
513                 [0] u16 command
514                 [2] u8 count
515                 [3] v3s16 pos_0
516                 [3+6] v3s16 pos_1
517                 ...
518         */
519
520         TOSERVER_DELETEDBLOCKS = 0x25,
521         /*
522                 [0] u16 command
523                 [2] u8 count
524                 [3] v3s16 pos_0
525                 [3+6] v3s16 pos_1
526                 ...
527         */
528
529         TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
530         /*
531                 [0] u16 command
532                 [2] v3s16 pos
533                 [8] u16 i
534         */
535
536         TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
537         /*
538                 length: 13
539                 [0] u16 command
540                 [2] u8 button (0=left, 1=right)
541                 [3] v3s16 blockpos
542                 [9] s16 id
543                 [11] u16 item
544         */
545
546         TOSERVER_GROUND_ACTION = 0x28, // Obsolete
547         /*
548                 length: 17
549                 [0] u16 command
550                 [2] u8 action
551                 [3] v3s16 nodepos_undersurface
552                 [9] v3s16 nodepos_abovesurface
553                 [15] u16 item
554                 actions:
555                 0: start digging (from undersurface)
556                 1: place block (to abovesurface)
557                 2: stop digging (all parameters ignored)
558                 3: digging completed
559         */
560         
561         TOSERVER_RELEASE = 0x29, // Obsolete
562
563         // (oops, there is some gap here)
564
565         TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
566         /*
567                 u16 command
568                 v3s16 blockpos
569                 s16 id
570                 u16 textlen
571                 textdata
572         */
573
574         TOSERVER_INVENTORY_ACTION = 0x31,
575         /*
576                 See InventoryAction in inventory.h
577         */
578
579         TOSERVER_CHAT_MESSAGE = 0x32,
580         /*
581                 u16 command
582                 u16 length
583                 wstring message
584         */
585
586         TOSERVER_SIGNNODETEXT = 0x33, // obsolete
587         /*
588                 u16 command
589                 v3s16 p
590                 u16 textlen
591                 textdata
592         */
593
594         TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
595         /*
596                 length: 7
597                 [0] u16 command
598                 [2] u8 button (0=left, 1=right)
599                 [3] u16 id
600                 [5] u16 item
601         */
602         
603         TOSERVER_DAMAGE = 0x35,
604         /*
605                 u16 command
606                 u8 amount
607         */
608
609         TOSERVER_PASSWORD=0x36,
610         /*
611                 Sent to change password.
612
613                 [0] u16 TOSERVER_PASSWORD
614                 [2] u8[28] old password
615                 [30] u8[28] new password
616         */
617
618         TOSERVER_PLAYERITEM=0x37,
619         /*
620                 Sent to change selected item.
621
622                 [0] u16 TOSERVER_PLAYERITEM
623                 [2] u16 item
624         */
625         
626         TOSERVER_RESPAWN=0x38,
627         /*
628                 u16 TOSERVER_RESPAWN
629         */
630
631         TOSERVER_INTERACT = 0x39,
632         /*
633                 [0] u16 command
634                 [2] u8 action
635                 [3] u16 item
636                 [5] u32 length of the next item
637                 [9] serialized PointedThing
638                 actions:
639                 0: start digging (from undersurface) or use
640                 1: stop digging (all parameters ignored)
641                 2: digging completed
642                 3: place block or item (to abovesurface)
643                 4: use item
644
645                 (Obsoletes TOSERVER_GROUND_ACTION and TOSERVER_CLICK_ACTIVEOBJECT.)
646         */
647         
648         TOSERVER_REMOVED_SOUNDS = 0x3a,
649         /*
650                 u16 command
651                 u16 len
652                 s32[len] sound_id
653         */
654
655         TOSERVER_NODEMETA_FIELDS = 0x3b,
656         /*
657                 u16 command
658                 v3s16 p
659                 u16 len
660                 u8[len] form name (reserved for future use)
661                 u16 number of fields
662                 for each field:
663                         u16 len
664                         u8[len] field name
665                         u32 len
666                         u8[len] field value
667         */
668
669         TOSERVER_INVENTORY_FIELDS = 0x3c,
670         /*
671                 u16 command
672                 u16 len
673                 u8[len] form name (reserved for future use)
674                 u16 number of fields
675                 for each field:
676                         u16 len
677                         u8[len] field name
678                         u32 len
679                         u8[len] field value
680         */
681
682         TOSERVER_REQUEST_MEDIA = 0x40,
683         /*
684                 u16 command
685                 u16 number of files requested
686                 for each file {
687                         u16 length of name
688                         string name
689                 }
690          */
691
692         TOSERVER_RECEIVED_MEDIA = 0x41,
693         /*
694                 u16 command
695         */
696 };
697
698 #endif
699