]> git.lizzy.rs Git - dragonfireclient.git/blob - src/clientserver.h
Add dtime_s to entity activation
[dragonfireclient.git] / src / clientserver.h
1 /*
2 Minetest-c55
3 Copyright (C) 2010 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/serialize.h"
24
25 /*
26         changes by PROTOCOL_VERSION:
27
28         PROTOCOL_VERSION 3:
29                 Base for writing changes here
30         PROTOCOL_VERSION 4:
31                 Add TOCLIENT_MEDIA
32                 Add TOCLIENT_TOOLDEF
33                 Add TOCLIENT_NODEDEF
34                 Add TOCLIENT_CRAFTITEMDEF
35                 Add TOSERVER_INTERACT
36                 Obsolete TOSERVER_CLICK_ACTIVEOBJECT
37                 Obsolete TOSERVER_GROUND_ACTION
38         PROTOCOL_VERSION 5:
39                 Make players to be handled mostly as ActiveObjects
40         PROTOCOL_VERSION 6:
41                 Only non-cached textures are sent
42         PROTOCOL_VERSION 7:
43                 Add TOCLIENT_ITEMDEF
44                 Obsolete TOCLIENT_TOOLDEF
45                 Obsolete TOCLIENT_CRAFTITEMDEF
46                 Compress the contents of TOCLIENT_ITEMDEF and TOCLIENT_NODEDEF
47         PROTOCOL_VERSION 8:
48                 Digging based on item groups
49                 Many things
50         PROTOCOL_VERSION 9:
51                 ContentFeatures and NodeDefManager use a different serialization
52                     format; better for future version cross-compatibility
53                 Many things
54         PROTOCOL_VERSION 10:
55                 TOCLIENT_PRIVILEGES
56                 Version raised to force 'fly' and 'fast' privileges into effect.
57                 Node metadata change (came in later; somewhat incompatible)
58         PROTOCOL_VERSION 11:
59                 TileDef in ContentFeatures
60                 Nodebox drawtype
61                 (some dev snapshot)
62                 TOCLIENT_INVENTORY_FORMSPEC
63                 (0.4.0, 0.4.1)
64         PROTOCOL_VERSION 12:
65                 TOSERVER_INVENTORY_FIELDS
66                 16-bit node ids
67                 TOCLIENT_DETACHED_INVENTORY
68         PROTOCOL_VERSION 13:
69                 InventoryList field "Width" (deserialization fails with old versions)
70 */
71
72 #define PROTOCOL_VERSION 13
73
74 #define PROTOCOL_ID 0x4f457403
75
76 #define PASSWORD_SIZE 28       // Maximum password length. Allows for
77                                // base64-encoded SHA-1 (27+\0).
78
79 #define TEXTURENAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_."
80
81 enum ToClientCommand
82 {
83         TOCLIENT_INIT = 0x10,
84         /*
85                 Server's reply to TOSERVER_INIT.
86                 Sent second after connected.
87
88                 [0] u16 TOSERVER_INIT
89                 [2] u8 deployed version
90                 [3] v3s16 player's position + v3f(0,BS/2,0) floatToInt'd 
91                 [12] u64 map seed (new as of 2011-02-27)
92
93                 NOTE: The position in here is deprecated; position is
94                       explicitly sent afterwards
95         */
96
97         TOCLIENT_BLOCKDATA = 0x20, //TODO: Multiple blocks
98         TOCLIENT_ADDNODE = 0x21,
99         TOCLIENT_REMOVENODE = 0x22,
100         
101         TOCLIENT_PLAYERPOS = 0x23, // Obsolete
102         /*
103                 [0] u16 command
104                 // Followed by an arbitary number of these:
105                 // Number is determined from packet length.
106                 [N] u16 peer_id
107                 [N+2] v3s32 position*100
108                 [N+2+12] v3s32 speed*100
109                 [N+2+12+12] s32 pitch*100
110                 [N+2+12+12+4] s32 yaw*100
111         */
112
113         TOCLIENT_PLAYERINFO = 0x24, // Obsolete
114         /*
115                 [0] u16 command
116                 // Followed by an arbitary number of these:
117                 // Number is determined from packet length.
118                 [N] u16 peer_id
119                 [N] char[20] name
120         */
121         
122         TOCLIENT_OPT_BLOCK_NOT_FOUND = 0x25, // Obsolete
123
124         TOCLIENT_SECTORMETA = 0x26, // Obsolete
125         /*
126                 [0] u16 command
127                 [2] u8 sector count
128                 [3...] v2s16 pos + sector metadata
129         */
130
131         TOCLIENT_INVENTORY = 0x27,
132         /*
133                 [0] u16 command
134                 [2] serialized inventory
135         */
136         
137         TOCLIENT_OBJECTDATA = 0x28, // Obsolete
138         /*
139                 Sent as unreliable.
140
141                 u16 command
142                 u16 number of player positions
143                 for each player:
144                         u16 peer_id
145                         v3s32 position*100
146                         v3s32 speed*100
147                         s32 pitch*100
148                         s32 yaw*100
149                 u16 count of blocks
150                 for each block:
151                         v3s16 blockpos
152                         block objects
153         */
154
155         TOCLIENT_TIME_OF_DAY = 0x29,
156         /*
157                 u16 command
158                 u16 time (0-23999)
159                 Added in a later version:
160                 f1000 time_speed
161         */
162
163         // (oops, there is some gap here)
164
165         TOCLIENT_CHAT_MESSAGE = 0x30,
166         /*
167                 u16 command
168                 u16 length
169                 wstring message
170         */
171
172         TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD = 0x31,
173         /*
174                 u16 command
175                 u16 count of removed objects
176                 for all removed objects {
177                         u16 id
178                 }
179                 u16 count of added objects
180                 for all added objects {
181                         u16 id
182                         u8 type
183                         u32 initialization data length
184                         string initialization data
185                 }
186         */
187         
188         TOCLIENT_ACTIVE_OBJECT_MESSAGES = 0x32,
189         /*
190                 u16 command
191                 for all objects
192                 {
193                         u16 id
194                         u16 message length
195                         string message
196                 }
197         */
198
199         TOCLIENT_HP = 0x33,
200         /*
201                 u16 command
202                 u8 hp
203         */
204
205         TOCLIENT_MOVE_PLAYER = 0x34,
206         /*
207                 u16 command
208                 v3f1000 player position
209                 f1000 player pitch
210                 f1000 player yaw
211         */
212
213         TOCLIENT_ACCESS_DENIED = 0x35,
214         /*
215                 u16 command
216                 u16 reason_length
217                 wstring reason
218         */
219
220         TOCLIENT_PLAYERITEM = 0x36, // Obsolete
221         /*
222                 u16 command
223                 u16 count of player items
224                 for all player items {
225                         u16 peer id
226                         u16 length of serialized item
227                         string serialized item
228                 }
229         */
230
231         TOCLIENT_DEATHSCREEN = 0x37,
232         /*
233                 u16 command
234                 u8 bool set camera point target
235                 v3f1000 camera point target (to point the death cause or whatever)
236         */
237
238         TOCLIENT_MEDIA = 0x38,
239         /*
240                 u16 command
241                 u16 total number of texture bunches
242                 u16 index of this bunch
243                 u32 number of files in this bunch
244                 for each file {
245                         u16 length of name
246                         string name
247                         u32 length of data
248                         data
249                 }
250         */
251         
252         TOCLIENT_TOOLDEF = 0x39,
253         /*
254                 u16 command
255                 u32 length of the next item
256                 serialized ToolDefManager
257         */
258         
259         TOCLIENT_NODEDEF = 0x3a,
260         /*
261                 u16 command
262                 u32 length of the next item
263                 serialized NodeDefManager
264         */
265         
266         TOCLIENT_CRAFTITEMDEF = 0x3b,
267         /*
268                 u16 command
269                 u32 length of the next item
270                 serialized CraftiItemDefManager
271         */
272
273         TOCLIENT_ANNOUNCE_MEDIA = 0x3c,
274
275         /*
276                 u16 command
277                 u32 number of files
278                 for each texture {
279                         u16 length of name
280                         string name
281                         u16 length of sha1_digest
282                         string sha1_digest
283                 }
284         */
285
286         TOCLIENT_ITEMDEF = 0x3d,
287         /*
288                 u16 command
289                 u32 length of next item
290                 serialized ItemDefManager
291         */
292         
293         TOCLIENT_PLAY_SOUND = 0x3f,
294         /*
295                 u16 command
296                 s32 sound_id
297                 u16 len
298                 u8[len] sound name
299                 s32 gain*1000
300                 u8 type (0=local, 1=positional, 2=object)
301                 s32[3] pos_nodes*10000
302                 u16 object_id
303                 u8 loop (bool)
304         */
305
306         TOCLIENT_STOP_SOUND = 0x40,
307         /*
308                 u16 command
309                 s32 sound_id
310         */
311
312         TOCLIENT_PRIVILEGES = 0x41,
313         /*
314                 u16 command
315                 u16 number of privileges
316                 for each privilege
317                         u16 len
318                         u8[len] privilege
319         */
320
321         TOCLIENT_INVENTORY_FORMSPEC = 0x42,
322         /*
323                 u16 command
324                 u32 len
325                 u8[len] formspec
326         */
327
328         TOCLIENT_DETACHED_INVENTORY = 0x43,
329         /*
330                 [0] u16 command
331                 u16 len
332                 u8[len] name
333                 [2] serialized inventory
334         */
335 };
336
337 enum ToServerCommand
338 {
339         TOSERVER_INIT=0x10,
340         /*
341                 Sent first after connected.
342
343                 [0] u16 TOSERVER_INIT
344                 [2] u8 SER_FMT_VER_HIGHEST
345                 [3] u8[20] player_name
346                 [23] u8[28] password (new in some version)
347                 [51] u16 client network protocol version (new in some version)
348         */
349
350         TOSERVER_INIT2 = 0x11,
351         /*
352                 Sent as an ACK for TOCLIENT_INIT.
353                 After this, the server can send data.
354
355                 [0] u16 TOSERVER_INIT2
356         */
357
358         TOSERVER_GETBLOCK=0x20, // Obsolete
359         TOSERVER_ADDNODE = 0x21, // Obsolete
360         TOSERVER_REMOVENODE = 0x22, // Obsolete
361
362         TOSERVER_PLAYERPOS = 0x23,
363         /*
364                 [0] u16 command
365                 [2] v3s32 position*100
366                 [2+12] v3s32 speed*100
367                 [2+12+12] s32 pitch*100
368                 [2+12+12+4] s32 yaw*100
369         */
370
371         TOSERVER_GOTBLOCKS = 0x24,
372         /*
373                 [0] u16 command
374                 [2] u8 count
375                 [3] v3s16 pos_0
376                 [3+6] v3s16 pos_1
377                 ...
378         */
379
380         TOSERVER_DELETEDBLOCKS = 0x25,
381         /*
382                 [0] u16 command
383                 [2] u8 count
384                 [3] v3s16 pos_0
385                 [3+6] v3s16 pos_1
386                 ...
387         */
388
389         TOSERVER_ADDNODE_FROM_INVENTORY = 0x26, // Obsolete
390         /*
391                 [0] u16 command
392                 [2] v3s16 pos
393                 [8] u16 i
394         */
395
396         TOSERVER_CLICK_OBJECT = 0x27, // Obsolete
397         /*
398                 length: 13
399                 [0] u16 command
400                 [2] u8 button (0=left, 1=right)
401                 [3] v3s16 blockpos
402                 [9] s16 id
403                 [11] u16 item
404         */
405
406         TOSERVER_GROUND_ACTION = 0x28, // Obsolete
407         /*
408                 length: 17
409                 [0] u16 command
410                 [2] u8 action
411                 [3] v3s16 nodepos_undersurface
412                 [9] v3s16 nodepos_abovesurface
413                 [15] u16 item
414                 actions:
415                 0: start digging (from undersurface)
416                 1: place block (to abovesurface)
417                 2: stop digging (all parameters ignored)
418                 3: digging completed
419         */
420         
421         TOSERVER_RELEASE = 0x29, // Obsolete
422
423         // (oops, there is some gap here)
424
425         TOSERVER_SIGNTEXT = 0x30, // Old signs, obsolete
426         /*
427                 u16 command
428                 v3s16 blockpos
429                 s16 id
430                 u16 textlen
431                 textdata
432         */
433
434         TOSERVER_INVENTORY_ACTION = 0x31,
435         /*
436                 See InventoryAction in inventory.h
437         */
438
439         TOSERVER_CHAT_MESSAGE = 0x32,
440         /*
441                 u16 command
442                 u16 length
443                 wstring message
444         */
445
446         TOSERVER_SIGNNODETEXT = 0x33, // obsolete
447         /*
448                 u16 command
449                 v3s16 p
450                 u16 textlen
451                 textdata
452         */
453
454         TOSERVER_CLICK_ACTIVEOBJECT = 0x34, // Obsolete
455         /*
456                 length: 7
457                 [0] u16 command
458                 [2] u8 button (0=left, 1=right)
459                 [3] u16 id
460                 [5] u16 item
461         */
462         
463         TOSERVER_DAMAGE = 0x35,
464         /*
465                 u16 command
466                 u8 amount
467         */
468
469         TOSERVER_PASSWORD=0x36,
470         /*
471                 Sent to change password.
472
473                 [0] u16 TOSERVER_PASSWORD
474                 [2] u8[28] old password
475                 [30] u8[28] new password
476         */
477
478         TOSERVER_PLAYERITEM=0x37,
479         /*
480                 Sent to change selected item.
481
482                 [0] u16 TOSERVER_PLAYERITEM
483                 [2] u16 item
484         */
485         
486         TOSERVER_RESPAWN=0x38,
487         /*
488                 u16 TOSERVER_RESPAWN
489         */
490
491         TOSERVER_INTERACT = 0x39,
492         /*
493                 [0] u16 command
494                 [2] u8 action
495                 [3] u16 item
496                 [5] u32 length of the next item
497                 [9] serialized PointedThing
498                 actions:
499                 0: start digging (from undersurface) or use
500                 1: stop digging (all parameters ignored)
501                 2: digging completed
502                 3: place block or item (to abovesurface)
503                 4: use item
504
505                 (Obsoletes TOSERVER_GROUND_ACTION and TOSERVER_CLICK_ACTIVEOBJECT.)
506         */
507         
508         TOSERVER_REMOVED_SOUNDS = 0x3a,
509         /*
510                 u16 command
511                 u16 len
512                 s32[len] sound_id
513         */
514
515         TOSERVER_NODEMETA_FIELDS = 0x3b,
516         /*
517                 u16 command
518                 v3s16 p
519                 u16 len
520                 u8[len] form name (reserved for future use)
521                 u16 number of fields
522                 for each field:
523                         u16 len
524                         u8[len] field name
525                         u32 len
526                         u8[len] field value
527         */
528
529         TOSERVER_INVENTORY_FIELDS = 0x3c,
530         /*
531                 u16 command
532                 u16 len
533                 u8[len] form name (reserved for future use)
534                 u16 number of fields
535                 for each field:
536                         u16 len
537                         u8[len] field name
538                         u32 len
539                         u8[len] field value
540         */
541
542         TOSERVER_REQUEST_MEDIA = 0x40,
543         /*
544                 u16 command
545                 u16 number of files requested
546                 for each file {
547                         u16 length of name
548                         string name
549                 }
550          */
551
552 };
553
554 inline SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time, float time_speed)
555 {
556         SharedBuffer<u8> data(2+2+4);
557         writeU16(&data[0], TOCLIENT_TIME_OF_DAY);
558         writeU16(&data[2], time);
559         writeF1000(&data[4], time_speed);
560         return data;
561 }
562
563 #endif
564