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