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