0418d10b3a0f312826f0cffe2606c8f1ee5fd2ab
[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                 v2f1000 align
456         */
457
458         TOCLIENT_HUDRM = 0x50,
459         /*
460                 u16 command
461                 u32 id
462         */
463
464         TOCLIENT_HUDCHANGE = 0x51,
465         /*
466                 u16 command
467                 u32 id
468                 u8 stat
469                 [v2f1000 data |
470                  u32 len
471                  u8[len] data |
472                  u32 data]
473         */
474 };
475
476 enum ToServerCommand
477 {
478         TOSERVER_INIT=0x10,
479         /*
480                 Sent first after connected.
481
482                 [0] u16 TOSERVER_INIT
483                 [2] u8 SER_FMT_VER_HIGHEST
484                 [3] u8[20] player_name
485                 [23] u8[28] password (new in some version)
486                 [51] u16 minimum supported network protocol version (added sometime)
487                 [53] u16 maximum supported network protocol version (added later than the previous one)
488         */
489
490         TOSERVER_INIT2 = 0x11,
491         /*
492                 Sent as an ACK for TOCLIENT_INIT.
493                 After this, the server can send data.
494
495                 [0] u16 TOSERVER_INIT2
496         */
497
498         TOSERVER_GETBLOCK=0x20, // Obsolete
499         TOSERVER_ADDNODE = 0x21, // Obsolete
500         TOSERVER_REMOVENODE = 0x22, // Obsolete
501
502         TOSERVER_PLAYERPOS = 0x23,
503         /*
504                 [0] u16 command
505                 [2] v3s32 position*100
506                 [2+12] v3s32 speed*100
507                 [2+12+12] s32 pitch*100
508                 [2+12+12+4] s32 yaw*100
509                 [2+12+12+4+4] u32 keyPressed
510         */
511
512         TOSERVER_GOTBLOCKS = 0x24,
513         /*
514                 [0] u16 command
515                 [2] u8 count
516                 [3] v3s16 pos_0
517                 [3+6] v3s16 pos_1
518                 ...
519         */
520
521         TOSERVER_DELETEDBLOCKS = 0x25,
522         /*
523                 [0] u16 command
524                 [2] u8 count
525                 [3] v3s16 pos_0
526                 [3+6] v3s16 pos_1
527                 ...
528         */
529
530         TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
531         /*
532                 [0] u16 command
533                 [2] v3s16 pos
534                 [8] u16 i
535         */
536
537         TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
538         /*
539                 length: 13
540                 [0] u16 command
541                 [2] u8 button (0=left, 1=right)
542                 [3] v3s16 blockpos
543                 [9] s16 id
544                 [11] u16 item
545         */
546
547         TOSERVER_GROUND_ACTION = 0x28, // Obsolete
548         /*
549                 length: 17
550                 [0] u16 command
551                 [2] u8 action
552                 [3] v3s16 nodepos_undersurface
553                 [9] v3s16 nodepos_abovesurface
554                 [15] u16 item
555                 actions:
556                 0: start digging (from undersurface)
557                 1: place block (to abovesurface)
558                 2: stop digging (all parameters ignored)
559                 3: digging completed
560         */
561         
562         TOSERVER_RELEASE = 0x29, // Obsolete
563
564         // (oops, there is some gap here)
565
566         TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
567         /*
568                 u16 command
569                 v3s16 blockpos
570                 s16 id
571                 u16 textlen
572                 textdata
573         */
574
575         TOSERVER_INVENTORY_ACTION = 0x31,
576         /*
577                 See InventoryAction in inventory.h
578         */
579
580         TOSERVER_CHAT_MESSAGE = 0x32,
581         /*
582                 u16 command
583                 u16 length
584                 wstring message
585         */
586
587         TOSERVER_SIGNNODETEXT = 0x33, // obsolete
588         /*
589                 u16 command
590                 v3s16 p
591                 u16 textlen
592                 textdata
593         */
594
595         TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
596         /*
597                 length: 7
598                 [0] u16 command
599                 [2] u8 button (0=left, 1=right)
600                 [3] u16 id
601                 [5] u16 item
602         */
603         
604         TOSERVER_DAMAGE = 0x35,
605         /*
606                 u16 command
607                 u8 amount
608         */
609
610         TOSERVER_PASSWORD=0x36,
611         /*
612                 Sent to change password.
613
614                 [0] u16 TOSERVER_PASSWORD
615                 [2] u8[28] old password
616                 [30] u8[28] new password
617         */
618
619         TOSERVER_PLAYERITEM=0x37,
620         /*
621                 Sent to change selected item.
622
623                 [0] u16 TOSERVER_PLAYERITEM
624                 [2] u16 item
625         */
626         
627         TOSERVER_RESPAWN=0x38,
628         /*
629                 u16 TOSERVER_RESPAWN
630         */
631
632         TOSERVER_INTERACT = 0x39,
633         /*
634                 [0] u16 command
635                 [2] u8 action
636                 [3] u16 item
637                 [5] u32 length of the next item
638                 [9] serialized PointedThing
639                 actions:
640                 0: start digging (from undersurface) or use
641                 1: stop digging (all parameters ignored)
642                 2: digging completed
643                 3: place block or item (to abovesurface)
644                 4: use item
645
646                 (Obsoletes TOSERVER_GROUND_ACTION and TOSERVER_CLICK_ACTIVEOBJECT.)
647         */
648         
649         TOSERVER_REMOVED_SOUNDS = 0x3a,
650         /*
651                 u16 command
652                 u16 len
653                 s32[len] sound_id
654         */
655
656         TOSERVER_NODEMETA_FIELDS = 0x3b,
657         /*
658                 u16 command
659                 v3s16 p
660                 u16 len
661                 u8[len] form name (reserved for future use)
662                 u16 number of fields
663                 for each field:
664                         u16 len
665                         u8[len] field name
666                         u32 len
667                         u8[len] field value
668         */
669
670         TOSERVER_INVENTORY_FIELDS = 0x3c,
671         /*
672                 u16 command
673                 u16 len
674                 u8[len] form name (reserved for future use)
675                 u16 number of fields
676                 for each field:
677                         u16 len
678                         u8[len] field name
679                         u32 len
680                         u8[len] field value
681         */
682
683         TOSERVER_REQUEST_MEDIA = 0x40,
684         /*
685                 u16 command
686                 u16 number of files requested
687                 for each file {
688                         u16 length of name
689                         string name
690                 }
691          */
692
693         TOSERVER_RECEIVED_MEDIA = 0x41,
694         /*
695                 u16 command
696         */
697 };
698
699 #endif
700