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