aboutsummaryrefslogtreecommitdiff
path: root/misc/minetest-icon.ico
blob: 82af67bf918ad7683dfc7b63da97757d8b37d23c (plain)
ofshex dumpascii
0000 00 00 01 00 01 00 30 30 00 00 01 00 20 00 a8 25 00 00 16 00 00 00 28 00 00 00 30 00 00 00 60 00 ......00.......%......(...0...`.
0020 00 00 01 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
00e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 39 59 28 0f 3f ...........................9Y(.?
0160 5c 95 0d 3c 57 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \..<W&..........................
0180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
01a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
01c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
01e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 10 40 50 10 11 3f 5e 95 12 3f 5e f5 33 6c ...................@P..?^..?^.3l
0220 91 f9 11 3e 5d f5 10 3d 5a 8d 15 40 55 0c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...>]..=Z..@U...................
0240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
02a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
02c0 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0f 3b 59 56 11 40 5d eb 2b 62 85 f7 63 aa d8 ff 6e b9 ...............;YV.@].+b..c...n.
02e0 e9 ff 62 a9 d7 ff 27 5d 7e f6 10 3f 5d e8 0d 3c 56 4d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..b...']~..?]..<VM..............
0300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0380 00 00 00 00 00 00 0f 3b 58 34 13 42 61 d3 1d 50 70 f5 58 9c c8 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 .......;X4.Ba..Pp.X...n...n...n.
03a0 e9 ff 6e b9 e9 ff 6e b9 e9 ff 53 95 c0 ff 18 48 69 f4 12 41 60 c1 0e 37 5a 25 00 00 00 00 00 00 ..n...n...S....Hi..A`..7Z%......
03c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
03e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2c 35 ..............................,5
0440 38 57 34 36 33 f2 15 44 61 f5 47 86 af fe 6d b8 e8 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 8W463..Da.G...m...n...n...n...n.
0460 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6b b6 e6 ff 41 7d a4 fd 12 40 5d f6 13 42 60 88 17 46 ..n...n...n...k...A}...@]..B`..F
0480 5d 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]...............................
04a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
04c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
04e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 30 38 20 33 35 32 e5 38 36 ......................008.352.86
0500 2f ff 36 34 2e ff 69 b3 e1 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 /.64..i...n...n...n...n...n...n.
0520 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 65 ad dc ff 2d 65 88 f7 11 40 ..n...n...n...n...n...e...-e...@
0540 5e ec 0c 3b 59 56 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ^..;YV..........................
0560 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0580 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
05a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 31 36 36 bd 37 35 30 ff 41 40 3c ff 4c 4f ..................166.750.A@<.LO
05c0 4c ff 36 34 2e ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 69 a4 c8 ff 5c 6c L.64..n...n...n...n...n...i...\l
05e0 71 ff 69 a4 ca ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 58 9c q.i...n...n...n...n...n...n...X.
0600 c8 ff 1c 4e 6e f4 12 40 60 cf 0a 39 58 31 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...Nn..@`..9X1..................
0620 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0640 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0660 00 00 00 00 00 00 00 00 00 00 2d 35 39 82 36 36 30 fe 3b 3b 35 ff 4e 50 4d ff 43 44 40 ff 38 36 ..........-59.660.;;5.NPM.CD@.86
0680 2f ff 47 5b 65 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6c b0 db ff 5d 6b 71 ff 52 3b 25 ff 7e 5e /.G[e.n...n...n...l...]kq.R;%.~^
06a0 40 ff 51 3a 25 ff 5d 6f 77 ff 6c b2 de ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 @.Q:%.]ow.l...n...n...n...n...n.
06c0 e9 ff 6d b8 e7 ff 45 81 a9 fd 12 40 5e f6 11 41 5d 99 1c 39 4c 1b 00 00 00 00 00 00 00 00 00 00 ..m...E....@^..A]..9L...........
06e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0700 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
0720 00 00 2b 37 37 41 35 36 33 f5 39 37 31 ff 49 4b 48 ff 53 57 55 ff 53 57 55 ff 36 34 2e ff 61 97 ..+77A563.971.IKH.SWU.SWU.64..a.
0740 bb ff 6e b9 e9 ff 6e b9 e9 ff 6e b8 e8 ff 63 8b a3 ff 54 40 2d ff 74 57 3a ff c0 92 68 ff cf 9f ..n...n...n...c...T@-.tW:...h...
0760 72 ff be 91 67 ff 6f 52 38 ff 53 42 2f ff 64 90 aa ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 r...g.oR8.SB/.d...n...n...n...n.
0780 e9 ff 6e b9 e9 ff 6e b9 e9 ff 66 af de ff 32 6a 8e f7 33 36 33 fd 27 37 41 95 00 00 80 02 00 00 ..n...n...f...2j..363.'7A.......
07a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
07c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 31 3d 15 31 34 ..........................$1=.14
07e0 35 dc 37 35 2f ff 43 44 40 ff 52 56 54 ff 53 57 55 ff 53 57 55 ff 51 55 53 ff 36 34 2e ff 69 ad 5.75/.CD@.RVT.SWU.SWU.QUS.64..i.
0800 d8 ff 6e b9 e9 ff 67 9e c1 ff 57 47 38 ff 6a 4e 35 ff b8 8b 62 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..n...g...WG8.jN5...b...r...r...
0820 72 ff cf 9f 72 ff cf 9f 72 ff b2 86 5f ff 62 48 30 ff 59 4f 43 ff 67 9e c1 ff 6e b9 e9 ff 6e b9 r...r...r..._.bH0.YOC.g...n...n.
0840 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 40 41 3d fe 33 3a 3a f6 21 37 ..n...n...n...n...64..@A=.3::.!7
0860 43 5c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C\..............................
0880 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 2e 34 36 ab 37 35 30 ff 3f 3f .......................46.750.??
08a0 3a ff 50 52 51 ff 53 57 55 ff 53 57 55 ff 52 56 54 ff 48 4a 46 ff 38 36 31 ff 3d 43 44 ff 6d b5 :.PRQ.SWU.SWU.RVT.HJF.861.=CD.m.
08c0 e3 ff 6e b9 e9 ff 5e 7c 8b ff 7b 5b 3d ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..n...^|..{[=...r...r...r...r...
08e0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff ce 9e 71 ff 9a 73 50 ff 54 3c 27 ff 5c 68 6b ff 6c af r...r...r...r...q..sP.T<'.\hk.l.
0900 da ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 83 88 86 ff 5f 62 5e ff 39 39 ..n...n...n...n...64......_b^.99
0920 35 ff 2c 3b 42 db 20 39 46 28 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5.,;B..9F(......................
0940 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d 3c 57 26 13 43 60 bf 36 34 2e ff 37 35 30 ff 3e 3e ...............<W&.C`.64..750.>>
0960 3a ff 50 53 50 ff 53 57 55 ff 4c 50 4c ff 3b 3a 34 ff 38 35 30 ff 58 88 a4 ff 6e b9 e9 ff 6e b9 :.PSP.SWU.LPL.;:4.850.X...n...n.
0980 e9 ff 6e b9 e9 ff 5b 72 7c ff 84 63 44 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..n...[r|..cD...r...r...r...r...
09a0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff c6 97 6c ff 81 60 42 ff 52 3c r...r...r...r...r...r...l..`B.R<
09c0 26 ff 60 80 90 ff 6e b8 e6 ff 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 85 8a 88 ff 85 8a 88 ff 7e 83 &.`...n...n...n...64..........~.
09e0 81 ff 52 55 53 ff 37 38 33 fe 29 39 41 aa 1c 39 55 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..RUS.783.)9A..9U...............
0a00 00 00 00 00 00 00 00 55 55 03 13 43 61 a3 13 42 60 f6 47 86 ae fe 36 34 2e ff 36 34 2e ff 36 34 .......UU..Ca..B`.G...64..64..64
0a20 2e ff 37 35 2f ff 3c 3c 37 ff 37 35 2f ff 36 34 2e ff 36 34 2e ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 ..75/.<<7.75/.64..64..n...n...n.
0a40 e9 ff 59 58 53 ff 59 42 2a ff af 84 5c ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..YXS.YB*...\...r...r...r...r...
0a60 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff b7 8c r...r...r...r...r...r...r...r...
0a80 62 ff 68 4e 34 ff 56 49 39 ff 66 99 b7 ff 6e b9 e9 ff 36 34 2e ff 69 6d 6a ff 84 89 87 ff 85 8a b.hN4.VI9.f...n...64..imj.......
0aa0 88 ff 85 8a 88 ff 7a 7e 7b ff 49 4c 49 fe 35 38 36 fd 26 35 3e 87 00 00 00 00 00 00 00 00 00 00 ......z~{.ILI.586.&5>...........
0ac0 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fc 68 b1 df ff 6e b9 e9 ff 36 34 2e ff 36 34 2e ff 36 34 .......9U..<Y.h...n...64..64..64
0ae0 2e ff 36 34 2e ff 36 34 2e ff 35 33 34 ff 36 34 31 ff 36 34 2e ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 ..64..64..534.641.64..n...n...n.
0b00 e9 ff 4b 31 19 ff cc 9c 70 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..K1....p...r...r...r...r...r...
0b20 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0b40 72 ff cf 9f 72 ff a2 7a 54 ff 57 3f 28 ff 5c 60 5c ff 60 99 bb ff 42 4d 4f ff 48 49 46 ff 85 8a r...r..zT.W?(.\`\.`...BMO.HIF...
0b60 88 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 70 73 6f ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..............pso.64............
0b80 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 36 34 2e ff 36 34 .......9U..<Y.n...n...64..64..64
0ba0 2e ff 36 34 2e ff 36 34 2e ff 34 32 4a ff 36 34 3a ff 36 34 2e ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 ..64..64..42J.64:.64..n...n...n.
0bc0 e9 ff 4b 31 19 ff bb 8e 64 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..K1....d...r...r...r...r...r...
0be0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0c00 72 ff cf 9f 72 ff cf 9f 72 ff c9 9a 6e ff 4b 31 19 ff 6e b9 e9 ff 6d b8 e7 ff 36 34 2e ff 85 8a r...r...r...n.K1..n...m...64....
0c20 88 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..................64............
0c40 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 36 34 2e ff 36 34 .......9U..<Y.n...n...64..64..64
0c60 2e ff 36 34 2e ff 36 34 2e ff 36 34 2e ff 38 39 36 ff 40 4c 50 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 ..64..64..64..896.@LP.n...n...n.
0c80 e9 ff 61 7c 89 ff 53 3c 26 ff 82 60 41 ff c6 97 6c ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..a|..S<&..`A...l...r...r...r...
0ca0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0cc0 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff 4b 31 19 ff 6c b3 e0 ff 6e b9 e9 ff 36 34 2e ff 74 78 r...r...r...r.K1..l...n...64..tx
0ce0 75 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 u.................64............
0d00 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 36 34 2e ff 38 39 36 ff 36 34 .......9U..<Y.n...n...64..896.64
0d20 2e ff 36 34 2e ff 38 38 34 ff 3a 3e 3c ff 5a 8a a6 ff 6e b8 e8 ff 6e b9 e9 ff 6e b9 e9 ff 5e ab ..64..884.:><.Z...n...n...n...^.
0d40 cd ff 3a 89 8a ff 5d a1 bf ff 5e 6a 6d ff 53 3c 25 ff 95 6f 4c ff cc 9d 70 ff cf 9f 72 ff cf 9f ..:...]...^jm.S<%..oL...p...r...
0d60 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0d80 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff 76 5a 3e ff 53 3f 2b ff 61 87 9c ff 59 87 a2 ff 3d 40 r...r...r...r.vZ>.S?+.a...Y...=@
0da0 3e ff 52 55 52 ff 85 8a 88 ff 85 8a 88 ff 85 8a 88 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 >.RUR.............64............
0dc0 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 3f 4a 4e ff 60 98 bb ff 36 34 .......9U..<Y.n...n...?JN.`...64
0de0 2e ff 38 39 35 ff 52 74 88 ff 6c b4 e2 ff 6e b9 e9 ff 6e b9 e9 ff 69 b3 de ff 35 85 82 ff 0e 64 ..895.Rt..l...n...n...i...5....d
0e00 3d ff 12 8c 51 ff 0e 64 3d ff 33 84 7f ff 63 9e bd ff 5a 58 50 ff 5b 43 2b ff a7 7d 57 ff cf 9f =...Q..d=.3...c...ZXP.[C+..}W...
0e20 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f r...r...r...r...r...r...r...r...
0e40 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff b3 87 5f ff 4b 31 19 ff 6e b9 e9 ff 6b b3 r...r...r...r...r..._.K1..n...k.
0e60 e1 ff 36 34 2e ff 7d 81 7f ff 85 8a 88 ff 85 8a 88 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..64..}...........64............
0e80 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 6d b8 e7 ff 6e b9 e9 ff 49 61 .......9U..<Y.n...n...m...n...Ia
0ea0 6e ff 68 ab d4 ff 6e b9 e9 ff 6e b9 e9 ff 6e b8 e8 ff 4c 99 ac ff 13 68 45 ff 11 82 4c ff 14 c4 n.h...n...n...n...L....hE...L...
0ec0 6b ff 16 d2 73 ff 15 c7 6d ff 12 85 4f ff 10 65 40 ff 48 97 a4 ff 64 93 af ff 56 48 37 ff 69 4f k...s...m...O..e@.H...d...VH7.iO
0ee0 35 ff b7 8b 62 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 5...b...r...r...r...r...r...r...
0f00 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff b3 87 5f ff 4b 31 19 ff 6e b8 e8 ff 6e b9 r...r...r...r...r..._.K1..n...n.
0f20 e9 ff 52 73 85 ff 3c 3c 37 ff 5f 61 5d ff 83 88 85 ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..Rs..<<7._a].....64............
0f40 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 .......9U..<Y.n...n...n...n...n.
0f60 e9 ff 6e b9 e9 ff 6e b9 e9 ff 5a a7 c5 ff 1c 72 57 ff 10 72 45 ff 13 b6 64 ff 16 d2 73 ff 16 d2 ..n...n...Z....rW..rE...d...s...
0f80 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 14 bb 66 ff 12 78 49 ff 18 6d 4f ff 53 9f b7 ff 62 81 s...s...s...s...f..xI..mO.S...b.
0fa0 92 ff 53 3c 27 ff 7d 5d 3e ff c3 95 6a ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f 72 ff cf 9f ..S<'.}]>...j...r...r...r...r...
0fc0 72 ff cf 9f 72 ff cf 9f 72 ff c1 93 69 ff 77 58 3b ff 4d 3a 22 ff 29 5b 59 ff 1a 71 83 ff 58 a6 r...r...r...i.wX;.M:".)[Y..q..X.
0fe0 ce ff 6e b9 e9 ff 67 a8 d1 ff 4a 5c 64 ff 40 41 3d ff 36 34 2e ff 00 00 00 00 00 00 00 00 00 00 ..n...g...J\d.@A=.64............
1000 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6e b9 .......9U..<Y.n...n...n...n...n.
1020 e9 ff 66 b1 db ff 31 84 7d ff 0e 66 3f ff 12 a2 5a ff 16 d1 72 ff 16 d2 73 ff 16 d2 73 ff 16 d2 ..f...1.}..f?...Z...r...s...s...
1040 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 12 aa 5e ff 10 6b 42 ff 27 7c s...s...s...s...s...s...^..kB.'|
1060 6a ff 5d a0 bd ff 5d 66 68 ff 55 3c 26 ff 9a 73 4f ff cc 9d 70 ff cf 9f 72 ff cf 9f 72 ff cf 9f j.]...]fh.U<&..sO...p...r...r...
1080 72 ff cc 9d 70 ff 94 6f 4c ff 4f 37 20 ff 41 61 58 ff 4c d9 e9 ff 4e e8 fb ff 31 b1 c0 ff 0b 64 r...p..oL.O7..AaX.L...N...1....d
10a0 70 ff 2b 80 97 ff 64 b0 dd ff 6e b9 e9 ff 5f 96 b8 ff 30 38 36 ff 00 00 00 00 00 00 00 00 00 00 p.+...d...n..._...086...........
10c0 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 6e b9 e9 ff 6c b7 e5 ff 41 90 .......9U..<Y.n...n...n...l...A.
10e0 98 ff 0e 63 3c ff 11 8e 51 ff 15 cb 70 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 ...c<...Q...p...s...s...s...s...
1100 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 15 ce 71 ff 11 99 s...s...s...s...s...s...s...q...
1120 56 ff 0e 65 3d ff 36 88 85 ff 63 9c ba ff 59 54 4a ff 5d 45 2d ff ac 82 5b ff cf 9f 72 ff a7 7e V..e=.6...c...YTJ.]E-...[...r..~
1140 58 ff 56 3e 25 ff 47 49 39 ff 47 bc c7 ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 4b e1 X.V>%.GI9.G...O...O...O...O...K.
1160 f3 ff 26 9a a8 ff 0a 61 6d ff 3c 8d aa ff 6b b7 e6 ff 03 57 61 ff 00 00 00 00 00 00 00 00 00 00 ..&....am.<...k....Wa...........
1180 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 6e b9 e9 ff 6e b9 e9 ff 53 a0 b8 ff 16 6c 4b ff 10 7a .......9U..<Y.n...n...S....lK..z
11a0 48 ff 13 bf 69 ff 16 d2 73 ff 16 d2 73 ff 16 d1 73 ff 0f a7 7d ff 11 b9 79 ff 16 d2 73 ff 16 d2 H...i...s...s...s...}...y...s...
11c0 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 s...s...s...s...s...s...s...s...
11e0 73 ff 15 c8 6d ff 11 8a 50 ff 10 65 40 ff 45 94 9f ff 64 97 b3 ff 57 4b 3c ff 52 3a 22 ff 4a 41 s...m...P..e@.E...d...WK<.R:".JA
1200 2e ff 41 a5 ac ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 3e c9 cd ff 35 bb b7 ff 4f e8 fb ff 4f e9 ..A...O...O...O...>...5...O...O.
1220 fc ff 4f e9 fc ff 44 d4 e6 ff 1b 82 90 ff 10 68 76 ff 02 58 62 ff 00 00 00 00 00 00 00 00 00 00 ..O...D........hv..Xb...........
1240 00 00 00 00 00 00 00 39 55 09 0f 3c 59 fb 5f ab cd ff 22 78 61 ff 0f 6c 41 ff 13 af 61 ff 16 d2 .......9U..<Y._..."xa..lA...a...
1260 73 ff 16 d2 73 ff 16 d2 73 ff 13 c0 77 ff 06 6e 8d ff 06 64 96 ff 04 60 92 ff 09 82 88 ff 15 ce s...s...s...w..n...d...`........
1280 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 s...s...s...s...s...s...s...s...
12a0 73 ff 16 d2 73 ff 16 d2 73 ff 14 be 68 ff 11 7a 4a ff 16 6c 4c ff 53 9f b7 ff 13 4f 52 ff 4e e6 s...s...s...h..zJ..lL.S....OR.N.
12c0 f9 ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 1c 8d 71 ff 07 69 3a ff 07 6f 3e ff 12 7c 58 ff 4f e9 ..O...O...O.....q..i:..o>..|X.O.
12e0 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 3b c2 d3 ff 02 58 62 ff 00 00 00 00 00 00 00 00 00 00 ..O...O...O...;....Xb...........
1300 00 00 00 00 00 00 00 33 4d 0a 0b 53 44 fe 0d 65 3c ff 11 a3 5a ff 16 d1 72 ff 16 d2 73 ff 16 d2 .......3M..SD..e<...Z...r...s...
1320 73 ff 16 d2 73 ff 16 d2 73 ff 0f a5 7e ff 07 67 9c ff 11 7d c1 ff 10 7b bf ff 03 5e 90 ff 14 c7 s...s...s...~..g...}...{...^....
1340 76 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 v...s...s...s...s...s...s...s...
1360 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 13 b5 63 ff 0d 69 3e ff 08 5f 40 ff 4f e9 s...s...s...s...s...c..i>.._@.O.
1380 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 97 4d ff 06 9a 4d ff 04 60 31 ff 4f e9 ..O...O...O....`1...M...M..`1.O.
13a0 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 3b c2 d3 ff 03 59 64 ff 00 00 00 00 00 00 00 00 00 00 ..O...O...O...;....Yd...........
13c0 00 00 00 00 00 00 00 55 55 03 0d 5a 42 da 0a 61 37 ff 12 a1 59 ff 16 d1 73 ff 16 d2 73 ff 16 d2 .......UU..ZB..a7...Y...s...s...
13e0 73 ff 16 d2 73 ff 16 d2 73 ff 0f a5 7e ff 08 6a 9e ff 11 7d c1 ff 11 7d c1 ff 04 5f 91 ff 14 c7 s...s...s...~..j...}...}..._....
1400 76 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 v...s...s...s...s...s...s...s...
1420 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 15 c7 6d ff 0f 86 4c ff 0a 61 39 ff 25 95 8f ff 4f e9 s...s...s...s...m...L..a9.%...O.
1440 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 4f e9 ..O...O...O....`1...N...N..`1.O.
1460 fc ff 4f e9 fc ff 44 d4 e6 ff 18 80 8d fe 07 5e 69 fd 08 4c 5d 83 00 00 00 00 00 00 00 00 00 00 ..O...D........^i..L]...........
1480 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0a 4c 42 68 0a 5c 3b f8 0d 6f 40 fe 14 ba 66 ff 16 d2 ...............LBh.\;..o@...f...
14a0 73 ff 16 d2 73 ff 16 d2 73 ff 0f a5 7e ff 08 6a 9d ff 0c 72 8d ff 0e 77 a3 ff 04 5f 91 ff 14 c7 s...s...s...~..j...r...w..._....
14c0 76 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 v...s...s...s...s...s...s...s...
14e0 73 ff 16 d2 73 ff 16 d0 72 ff 12 a1 5a ff 0a 62 38 ff 12 73 5c ff 43 d2 df ff 4f e9 fc ff 4f e9 s...s...r...Z..b8..s\.C...O...O.
1500 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 4c e4 ..O...O...O....`1...N...N..`1.L.
1520 f6 ff 2b a3 b2 ff 06 5d 69 ff 08 53 62 cb 0b 4e 64 17 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..+....]i..Sb..Nd...............
1540 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 40 04 0b 4f 41 a4 0a 5e 38 fe 0f 86 ...................@@..OA..^8...
1560 4d ff 15 c6 6c ff 16 d2 73 ff 0d 96 6e ff 05 65 44 ff 05 6b 3c ff 05 65 38 ff 04 62 52 ff 12 bd M...l...s...n..eD..k<..e8..bR...
1580 70 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 p...s...s...s...s...s...s...s...
15a0 73 ff 12 b3 63 ff 0b 6a 3d ff 0c 63 44 ff 39 bd c6 ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 s...c..j=..cD.9...O...O...O...O.
15c0 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 08 60 ..O...O...O....`1...N...N..`1..`
15e0 6b fe 08 56 66 e7 0a 43 5b 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 k..Vf..C[5......................
1600 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0b 43 4e 17 0b 52 ...........................CN..R
1620 42 ca 08 5e 35 ff 09 77 40 ff 05 66 35 ff 05 81 41 ff 06 99 4e ff 06 96 4c ff 04 76 3e ff 05 69 B..^5..w@..f5...A...N...L..v>..i
1640 36 ff 0f a7 5b ff 16 d1 72 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 10 9a 6...[...r...s...s...s...s...s...
1660 55 ff 0a 5c 33 ff 3c 84 93 ff 1f 54 75 ff 1a 59 75 ff 40 c2 d7 ff 4f e9 fc ff 4f e9 fc ff 4f e9 U..\3.<....Tu..Yu.@...O...O...O.
1680 fc ff 4f e9 fc ff 4f e9 fc ff 4f e9 fc ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 05 49 ..O...O...O....`1...N...N..`1..I
16a0 5d 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]e..............................
16c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 40 04 05 61 ............................@..a
16e0 33 69 04 62 32 f4 05 76 3c ff 06 96 4c ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 90 3i.b2..v<...L...N...N...N...N...
1700 49 ff 05 72 3a ff 06 72 3b ff 11 b5 62 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 15 c7 I..r:..r;...b...s...s...s...s...
1720 6d ff 0f 82 4b ff 0a 5d 38 ff 31 78 81 ff 49 8b b2 ff 15 47 64 ff 24 75 8f ff 48 d6 ea ff 4f e9 m...K..]8.1x..I....Gd.$u..H...O.
1740 fc ff 4f e9 fc ff 4f e9 fc ff 49 df f0 ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 00 00 ..O...O...I....`1...N...N..`1...
1760 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1780 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 62 2f 51 03 63 33 e8 05 71 .......................b/Q.c3..q
17a0 39 f6 06 92 4b ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 9...K...N...N...N...N...N...N...
17c0 4e ff 06 9a 4e ff 05 8a 46 ff 05 6c 37 ff 09 7f 42 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...F..l7...B...s...s...s...
17e0 73 ff 16 d2 73 ff 13 b5 63 ff 0c 6d 3e ff 0f 60 43 ff 47 8d a9 ff 34 6f 93 ff 12 44 61 ff 33 9b s...s...c..m>..`C.G...4o...Da.3.
1800 b3 ff 4b e2 f6 ff 2d a7 b8 ff 06 5d 68 ff 04 60 31 ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 00 00 ..K...-....]h..`1...N...N..`1...
1820 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1840 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 05 8b 47 ff 06 9a .......................`1...G...
1860 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1880 4e ff 06 9a 4e ff 06 9a 4e ff 06 99 4d ff 04 60 31 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...N...M..`1...s...s...s...
18a0 73 ff 16 d2 73 ff 16 d2 73 ff 16 d1 73 ff 11 9e 57 ff 0a 60 37 ff 18 65 57 ff 52 96 bc ff 2b 62 s...s...s...s...W..`7..eW.R...+b
18c0 84 ff 10 44 5f ff 09 57 67 ed 08 48 5b 43 04 60 31 ff 05 95 4c ff 06 9a 4d ff 04 60 31 ff 00 00 ...D_..Wg..H[C.`1...L...M..`1...
18e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1900 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1920 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1940 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...N...N..`1...s...s...s...
1960 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 cb 6f ff 0f 8c 4e ff 0a 5e 36 ff 26 6e s...s...s...s...s...o...N..^6.&n
1980 70 ff 0d 3b 56 ff 00 00 00 00 00 00 00 00 04 61 32 90 04 62 33 f6 04 69 36 f2 04 63 33 cf 00 00 p..;V..........a2..b3..i6..c3...
19a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
19c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
19e0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1a00 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...N...N..`1...s...s...s...
1a20 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 14 c3 6b ff 0b 69 s...s...s...s...s...s...s...k..i
1a40 3a fe 0a 59 39 fe 00 00 00 00 00 00 00 00 00 00 00 00 04 5e 31 39 03 61 32 57 00 00 00 01 00 00 :..Y9..............^19.a2W......
1a60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1a80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1aa0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1ac0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 14 bd 68 ff 16 d2 73 ff 16 d2 73 ff 16 d2 N...N...N...N..`1...h...s...s...
1ae0 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 14 bb 67 ff 0c 73 40 f3 09 62 s...s...s...s...s...s...g..s@..b
1b00 35 da 0a 57 39 4c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5..W9L..........................
1b20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1b40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1b60 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1b80 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 09 5d 35 ff 11 93 54 ff 15 cc 70 ff 16 d2 N...N...N...N..`1..]5...T...p...
1ba0 73 ff 16 d2 73 ff 16 d2 73 ff 16 d2 73 ff 16 ca 6e ff 0f 91 4f f6 09 60 35 f2 08 5b 33 79 00 55 s...s...s...s...n...O..`5..[3y.U
1bc0 2b 06 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +...............................
1be0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1c00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1c20 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1c40 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 0d 51 43 26 0c 59 3f dc 0a 61 37 ff 11 a5 N...N...N...N..`1..QC&.Y?..a7...
1c60 5b ff 16 d1 72 ff 16 d1 72 ff 11 a6 5a fc 09 62 35 f5 09 5f 35 a7 0c 5d 2e 16 00 00 00 00 00 00 [...r...r...Z..b5.._5..]........
1c80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1ca0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1cc0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 06 9a 4e ff 06 9a .......................`1...N...
1ce0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1d00 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 04 60 31 ff 00 00 00 00 00 00 00 00 0a 4d 43 4c 0b 5e N...N...N...N..`1..........MCL.^
1d20 38 da 0a 68 3a f3 0a 67 39 f3 09 61 35 bd 07 5e 2f 26 00 00 00 00 00 00 00 00 00 00 00 00 00 00 8..h:..g9..a5..^/&..............
1d40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1d60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1d80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 60 31 ff 05 8b 47 ff 06 9a .......................`1...G...
1da0 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a N...N...N...N...N...N...N...N...
1dc0 4e ff 06 9a 4e ff 06 9a 4e ff 06 99 4d ff 04 60 31 ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 N...N...N...M..`1...............
1de0 00 00 0a 5a 34 4a 07 5c 34 45 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ...Z4J.\4E......................
1e00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1e20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1e40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 62 2f 51 03 63 33 e8 05 71 .......................b/Q.c3..q
1e60 39 f5 06 92 4b ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 9...K...N...N...N...N...N...N...
1e80 4e ff 06 9a 4e ff 05 8a 46 ff 04 67 34 f4 04 64 32 c1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 N...N...F..g4..d2...............
1ea0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1ec0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1ee0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1f00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 62 27 0d 04 62 ...........................b'..b
1f20 32 8f 04 63 33 f5 05 81 40 fa 06 98 4d ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 06 9a 4e ff 05 94 2..c3...@...M...N...N...N...N...
1f40 4a ff 05 74 3a f5 04 62 33 ed 03 61 30 5f 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 J..t:..b3..a0_..................
1f60 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1f80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1fa0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1fc0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
1fe0 00 00 08 5d 2e 21 04 62 32 bd 04 66 34 f5 05 88 45 ff 06 9a 4e ff 06 98 4d ff 05 7e 40 fa 04 63 ...].!.b2..f4...E...N...M..~@..c
2000 33 f5 04 61 33 86 00 55 39 09 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3..a3..U9.......................
2020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
20a0 00 00 00 00 00 00 00 00 00 00 05 61 33 37 04 64 33 d4 04 69 36 f2 04 63 33 f4 03 62 31 a6 00 60 ...........a37.d3..i6..c3..b1..`
20c0 35 18 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 5...............................
20e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2100 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2120 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2140 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 03 5f 30 5b 05 60 30 35 00 00 00 00 00 00 ..................._0[.`05......
2180 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
21a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
21c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
21e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2240 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2260 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2280 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
22a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
22c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
22e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2300 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2320 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2340 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2360 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2380 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
23a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
23c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
23e0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................................
2420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ................................
2440 ff ff ff ff 00 00 ff ff ff 7f ff ff 00 00 ff ff fc 1f ff ff 00 00 ff ff f8 0f ff ff 00 00 ff ff ................................
2460 e0 03 ff ff 00 00 ff ff 80 00 ff ff 00 00 ff fe 00 00 7f ff 00 00 ff f8 00 00 1f ff 00 00 ff e0 ................................
2480 00 00 07 ff 00 00 ff c0 00 00 01 ff 00 00 ff 00 00 00 00 ff 00 00 fc 00 00 00 00 3f 00 00 f8 00 ...........................?....
24a0 00 00 00 0f 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 ................................
24c0 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 ................................
24e0 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 ................................
2500 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 e0 00 00 00 00 03 00 00 f8 00 00 00 00 0f 00 00 fc 00 ................................
2520 00 00 00 3f 00 00 ff 00 00 00 00 ff 00 00 ff 80 00 00 00 ff 00 00 fe 00 00 00 00 ff 00 00 fc 00 ...?............................
2540 00 00 10 ff 00 00 fc 00 00 00 30 ff 00 00 fc 00 00 00 3f ff 00 00 fc 00 00 00 7f ff 00 00 fc 00 ..........0.......?.............
2560 00 01 ff ff 00 00 fc 00 04 03 ff ff 00 00 fc 00 07 0f ff ff 00 00 fc 00 07 ff ff ff 00 00 fe 00 ................................
2580 07 ff ff ff 00 00 ff 00 1f ff ff ff 00 00 ff c0 3f ff ff ff 00 00 ff f0 ff ff ff ff 00 00 ff ff ................?...............
25a0 ff ff ff ff 00 00 ff ff ff ff ff ff 00 00 ff ff ff ff ff ff 00 00 ff ff ff ff ff ff 00 00 ..............................
/span> "Unknown"; m_con->Disconnect(); } } void Client::handleCommand_AuthAccept(NetworkPacket* pkt) { deleteAuthData(); v3f playerpos; *pkt >> playerpos >> m_map_seed >> m_recommended_send_interval >> m_sudo_auth_methods; playerpos -= v3f(0, BS / 2, 0); // Set player position LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); player->setPosition(playerpos); infostream << "Client: received map seed: " << m_map_seed << std::endl; infostream << "Client: received recommended send interval " << m_recommended_send_interval<<std::endl; // Reply to server std::string lang = gettext("LANG_CODE"); if (lang == "LANG_CODE") lang = ""; NetworkPacket resp_pkt(TOSERVER_INIT2, sizeof(u16) + lang.size()); resp_pkt << lang; Send(&resp_pkt); m_state = LC_Init; } void Client::handleCommand_AcceptSudoMode(NetworkPacket* pkt) { deleteAuthData(); m_password = m_new_password; verbosestream << "Client: Recieved TOCLIENT_ACCEPT_SUDO_MODE." << std::endl; // send packet to actually set the password startAuth(AUTH_MECHANISM_FIRST_SRP); // reset again m_chosen_auth_mech = AUTH_MECHANISM_NONE; } void Client::handleCommand_DenySudoMode(NetworkPacket* pkt) { ChatMessage *chatMessage = new ChatMessage(CHATMESSAGE_TYPE_SYSTEM, L"Password change denied. Password NOT changed."); pushToChatQueue(chatMessage); // reset everything and be sad deleteAuthData(); } void Client::handleCommand_AccessDenied(NetworkPacket* pkt) { // The server didn't like our password. Note, this needs // to be processed even if the serialisation format has // not been agreed yet, the same as TOCLIENT_INIT. m_access_denied = true; m_access_denied_reason = "Unknown"; if (pkt->getCommand() != TOCLIENT_ACCESS_DENIED) { // 13/03/15 Legacy code from 0.4.12 and lesser but is still used // in some places of the server code if (pkt->getSize() >= 2) { std::wstring wide_reason; *pkt >> wide_reason; m_access_denied_reason = wide_to_utf8(wide_reason); } return; } if (pkt->getSize() < 1) return; u8 denyCode = SERVER_ACCESSDENIED_UNEXPECTED_DATA; *pkt >> denyCode; if (denyCode == SERVER_ACCESSDENIED_SHUTDOWN || denyCode == SERVER_ACCESSDENIED_CRASH) { *pkt >> m_access_denied_reason; if (m_access_denied_reason.empty()) { m_access_denied_reason = accessDeniedStrings[denyCode]; } u8 reconnect; *pkt >> reconnect; m_access_denied_reconnect = reconnect & 1; } else if (denyCode == SERVER_ACCESSDENIED_CUSTOM_STRING) { *pkt >> m_access_denied_reason; } else if (denyCode < SERVER_ACCESSDENIED_MAX) { m_access_denied_reason = accessDeniedStrings[denyCode]; } else { // Allow us to add new error messages to the // protocol without raising the protocol version, if we want to. // Until then (which may be never), this is outside // of the defined protocol. *pkt >> m_access_denied_reason; if (m_access_denied_reason.empty()) { m_access_denied_reason = "Unknown"; } } } void Client::handleCommand_RemoveNode(NetworkPacket* pkt) { if (pkt->getSize() < 6) return; v3s16 p; *pkt >> p; removeNode(p); } void Client::handleCommand_AddNode(NetworkPacket* pkt) { if (pkt->getSize() < 6 + MapNode::serializedLength(m_server_ser_ver)) return; v3s16 p; *pkt >> p; MapNode n; n.deSerialize(pkt->getU8Ptr(6), m_server_ser_ver); bool remove_metadata = true; u32 index = 6 + MapNode::serializedLength(m_server_ser_ver); if ((pkt->getSize() >= index + 1) && pkt->getU8(index)) { remove_metadata = false; } addNode(p, n, remove_metadata); } void Client::handleCommand_NodemetaChanged(NetworkPacket *pkt) { if (pkt->getSize() < 1) return; std::istringstream is(pkt->readLongString(), std::ios::binary); std::stringstream sstr; decompressZlib(is, sstr); NodeMetadataList meta_updates_list(false); meta_updates_list.deSerialize(sstr, m_itemdef, true); Map &map = m_env.getMap(); for (NodeMetadataMap::const_iterator i = meta_updates_list.begin(); i != meta_updates_list.end(); ++i) { v3s16 pos = i->first; if (map.isValidPosition(pos) && map.setNodeMetadata(pos, i->second)) continue; // Prevent from deleting metadata // Meta couldn't be set, unused metadata delete i->second; } } void Client::handleCommand_BlockData(NetworkPacket* pkt) { // Ignore too small packet if (pkt->getSize() < 6) return; v3s16 p; *pkt >> p; std::string datastring(pkt->getString(6), pkt->getSize() - 6); std::istringstream istr(datastring, std::ios_base::binary); MapSector *sector; MapBlock *block; v2s16 p2d(p.X, p.Z); sector = m_env.getMap().emergeSector(p2d); assert(sector->getPos() == p2d); block = sector->getBlockNoCreateNoEx(p.Y); if (block) { /* Update an existing block */ block->deSerialize(istr, m_server_ser_ver, false); block->deSerializeNetworkSpecific(istr); } else { /* Create a new block */ block = new MapBlock(&m_env.getMap(), p, this); block->deSerialize(istr, m_server_ser_ver, false); block->deSerializeNetworkSpecific(istr); sector->insertBlock(block); } if (m_localdb) { ServerMap::saveBlock(block, m_localdb); } /* Add it to mesh update queue and set it to be acknowledged after update. */ addUpdateMeshTaskWithEdge(p, true); } void Client::handleCommand_Inventory(NetworkPacket* pkt) { if (pkt->getSize() < 1) return; std::string datastring(pkt->getString(0), pkt->getSize()); std::istringstream is(datastring, std::ios_base::binary); LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); player->inventory.deSerialize(is); m_update_wielded_item = true; delete m_inventory_from_server; m_inventory_from_server = new Inventory(player->inventory); m_inventory_from_server_age = 0.0; } void Client::handleCommand_TimeOfDay(NetworkPacket* pkt) { if (pkt->getSize() < 2) return; u16 time_of_day; *pkt >> time_of_day; time_of_day = time_of_day % 24000; float time_speed = 0; if (pkt->getSize() >= 2 + 4) { *pkt >> time_speed; } else { // Old message; try to approximate speed of time by ourselves float time_of_day_f = (float)time_of_day / 24000.0f; float tod_diff_f = 0; if (time_of_day_f < 0.2 && m_last_time_of_day_f > 0.8) tod_diff_f = time_of_day_f - m_last_time_of_day_f + 1.0f; else tod_diff_f = time_of_day_f - m_last_time_of_day_f; m_last_time_of_day_f = time_of_day_f; float time_diff = m_time_of_day_update_timer; m_time_of_day_update_timer = 0; if (m_time_of_day_set) { time_speed = (3600.0f * 24.0f) * tod_diff_f / time_diff; infostream << "Client: Measured time_of_day speed (old format): " << time_speed << " tod_diff_f=" << tod_diff_f << " time_diff=" << time_diff << std::endl; } } // Update environment m_env.setTimeOfDay(time_of_day); m_env.setTimeOfDaySpeed(time_speed); m_time_of_day_set = true; u32 dr = m_env.getDayNightRatio(); infostream << "Client: time_of_day=" << time_of_day << " time_speed=" << time_speed << " dr=" << dr << std::endl; } void Client::handleCommand_ChatMessage(NetworkPacket *pkt) { /* u8 version u8 message_type u16 sendername length wstring sendername u16 length wstring message */ ChatMessage *chatMessage = new ChatMessage(); u8 version, message_type; *pkt >> version >> message_type; if (version != 1 || message_type >= CHATMESSAGE_TYPE_MAX) { delete chatMessage; return; } u64 timestamp; *pkt >> chatMessage->sender >> chatMessage->message >> timestamp; chatMessage->timestamp = static_cast<std::time_t>(timestamp); chatMessage->type = (ChatMessageType) message_type; // @TODO send this to CSM using ChatMessage object if (modsLoaded() && m_script->on_receiving_message( wide_to_utf8(chatMessage->message))) { // Message was consumed by CSM and should not be handled by client delete chatMessage; } else { pushToChatQueue(chatMessage); } } void Client::handleCommand_ActiveObjectRemoveAdd(NetworkPacket* pkt) { /* u16 count of removed objects for all removed objects { u16 id } u16 count of added objects for all added objects { u16 id u8 type u32 initialization data length string initialization data } */ try { u8 type; u16 removed_count, added_count, id; // Read removed objects *pkt >> removed_count; for (u16 i = 0; i < removed_count; i++) { *pkt >> id; m_env.removeActiveObject(id); } // Read added objects *pkt >> added_count; for (u16 i = 0; i < added_count; i++) { *pkt >> id >> type; m_env.addActiveObject(id, type, pkt->readLongString()); } } catch (PacketError &e) { infostream << "handleCommand_ActiveObjectRemoveAdd: " << e.what() << ". The packet is unreliable, ignoring" << std::endl; } // m_activeobjects_received is false before the first // TOCLIENT_ACTIVE_OBJECT_REMOVE_ADD packet is received m_activeobjects_received = true; } void Client::handleCommand_ActiveObjectMessages(NetworkPacket* pkt) { /* for all objects { u16 id u16 message length string message } */ std::string datastring(pkt->getString(0), pkt->getSize()); std::istringstream is(datastring, std::ios_base::binary); try { while (is.good()) { u16 id = readU16(is); if (!is.good()) break; std::string message = deSerializeString(is); // Pass on to the environment m_env.processActiveObjectMessage(id, message); } } catch (SerializationError &e) { errorstream << "Client::handleCommand_ActiveObjectMessages: " << "caught SerializationError: " << e.what() << std::endl; } } void Client::handleCommand_Movement(NetworkPacket* pkt) { LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); float mad, maa, maf, msw, mscr, msf, mscl, msj, lf, lfs, ls, g; *pkt >> mad >> maa >> maf >> msw >> mscr >> msf >> mscl >> msj >> lf >> lfs >> ls >> g; player->movement_acceleration_default = mad * BS; player->movement_acceleration_air = maa * BS; player->movement_acceleration_fast = maf * BS; player->movement_speed_walk = msw * BS; player->movement_speed_crouch = mscr * BS; player->movement_speed_fast = msf * BS; player->movement_speed_climb = mscl * BS; player->movement_speed_jump = msj * BS; player->movement_liquid_fluidity = lf * BS; player->movement_liquid_fluidity_smooth = lfs * BS; player->movement_liquid_sink = ls * BS; player->movement_gravity = g * BS; } void Client::handleCommand_Fov(NetworkPacket *pkt) { f32 fov; bool is_multiplier; *pkt >> fov >> is_multiplier; LocalPlayer *player = m_env.getLocalPlayer(); player->setFov({ fov, is_multiplier }); } void Client::handleCommand_HP(NetworkPacket *pkt) { LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); u16 oldhp = player->hp; u16 hp; *pkt >> hp; player->hp = hp; if (modsLoaded()) m_script->on_hp_modification(hp); if (hp < oldhp) { // Add to ClientEvent queue ClientEvent *event = new ClientEvent(); event->type = CE_PLAYER_DAMAGE; event->player_damage.amount = oldhp - hp; m_client_event_queue.push(event); } } void Client::handleCommand_Breath(NetworkPacket* pkt) { LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); u16 breath; *pkt >> breath; player->setBreath(breath); } void Client::handleCommand_MovePlayer(NetworkPacket* pkt) { LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); v3f pos; f32 pitch, yaw; *pkt >> pos >> pitch >> yaw; player->setPosition(pos); infostream << "Client got TOCLIENT_MOVE_PLAYER" << " pos=(" << pos.X << "," << pos.Y << "," << pos.Z << ")" << " pitch=" << pitch << " yaw=" << yaw << std::endl; /* Add to ClientEvent queue. This has to be sent to the main program because otherwise it would just force the pitch and yaw values to whatever the camera points to. */ ClientEvent *event = new ClientEvent(); event->type = CE_PLAYER_FORCE_MOVE; event->player_force_move.pitch = pitch; event->player_force_move.yaw = yaw; m_client_event_queue.push(event); } void Client::handleCommand_DeathScreen(NetworkPacket* pkt) { bool set_camera_point_target; v3f camera_point_target; *pkt >> set_camera_point_target; *pkt >> camera_point_target; ClientEvent *event = new ClientEvent(); event->type = CE_DEATHSCREEN; event->deathscreen.set_camera_point_target = set_camera_point_target; event->deathscreen.camera_point_target_x = camera_point_target.X; event->deathscreen.camera_point_target_y = camera_point_target.Y; event->deathscreen.camera_point_target_z = camera_point_target.Z; m_client_event_queue.push(event); } void Client::handleCommand_AnnounceMedia(NetworkPacket* pkt) { u16 num_files; *pkt >> num_files; infostream << "Client: Received media announcement: packet size: " << pkt->getSize() << std::endl; if (m_media_downloader == NULL || m_media_downloader->isStarted()) { const char *problem = m_media_downloader ? "we already saw another announcement" : "all media has been received already"; errorstream << "Client: Received media announcement but " << problem << "! " << " files=" << num_files << " size=" << pkt->getSize() << std::endl; return; } // Mesh update thread must be stopped while // updating content definitions sanity_check(!m_mesh_update_thread.isRunning()); for (u16 i = 0; i < num_files; i++) { std::string name, sha1_base64; *pkt >> name >> sha1_base64; std::string sha1_raw = base64_decode(sha1_base64); m_media_downloader->addFile(name, sha1_raw); } try { std::string str; *pkt >> str; Strfnd sf(str); while(!sf.at_end()) { std::string baseurl = trim(sf.next(",")); if (!baseurl.empty()) m_media_downloader->addRemoteServer(baseurl); } } catch(SerializationError& e) { // not supported by server or turned off } m_media_downloader->step(this); } void Client::handleCommand_Media(NetworkPacket* pkt) { /* u16 command u16 total number of file bunches u16 index of this bunch u32 number of files in this bunch for each file { u16 length of name string name u32 length of data data } */ u16 num_bunches; u16 bunch_i; u32 num_files; *pkt >> num_bunches >> bunch_i >> num_files; infostream << "Client: Received files: bunch " << bunch_i << "/" << num_bunches << " files=" << num_files << " size=" << pkt->getSize() << std::endl; if (num_files == 0) return; if (!m_media_downloader || !m_media_downloader->isStarted()) { const char *problem = m_media_downloader ? "media has not been requested" : "all media has been received already"; errorstream << "Client: Received media but " << problem << "! " << " bunch " << bunch_i << "/" << num_bunches << " files=" << num_files << " size=" << pkt->getSize() << std::endl; return; } // Mesh update thread must be stopped while // updating content definitions sanity_check(!m_mesh_update_thread.isRunning()); for (u32 i=0; i < num_files; i++) { std::string name; *pkt >> name; std::string data = pkt->readLongString(); m_media_downloader->conventionalTransferDone( name, data, this); } } void Client::handleCommand_NodeDef(NetworkPacket* pkt) { infostream << "Client: Received node definitions: packet size: " << pkt->getSize() << std::endl; // Mesh update thread must be stopped while // updating content definitions sanity_check(!m_mesh_update_thread.isRunning()); // Decompress node definitions std::istringstream tmp_is(pkt->readLongString(), std::ios::binary); std::ostringstream tmp_os; decompressZlib(tmp_is, tmp_os); // Deserialize node definitions std::istringstream tmp_is2(tmp_os.str()); m_nodedef->deSerialize(tmp_is2); m_nodedef_received = true; } void Client::handleCommand_ItemDef(NetworkPacket* pkt) { infostream << "Client: Received item definitions: packet size: " << pkt->getSize() << std::endl; // Mesh update thread must be stopped while // updating content definitions sanity_check(!m_mesh_update_thread.isRunning()); // Decompress item definitions std::istringstream tmp_is(pkt->readLongString(), std::ios::binary); std::ostringstream tmp_os; decompressZlib(tmp_is, tmp_os); // Deserialize node definitions std::istringstream tmp_is2(tmp_os.str()); m_itemdef->deSerialize(tmp_is2); m_itemdef_received = true; } void Client::handleCommand_PlaySound(NetworkPacket* pkt) { /* [0] u32 server_id [4] u16 name length [6] char name[len] [ 6 + len] f32 gain [10 + len] u8 type [11 + len] (f32 * 3) pos [23 + len] u16 object_id [25 + len] bool loop [26 + len] f32 fade [30 + len] f32 pitch */ s32 server_id; std::string name; float gain; u8 type; // 0=local, 1=positional, 2=object v3f pos; u16 object_id; bool loop; float fade = 0.0f; float pitch = 1.0f; *pkt >> server_id >> name >> gain >> type >> pos >> object_id >> loop; try { *pkt >> fade; *pkt >> pitch; } catch (PacketError &e) {}; // Start playing int client_id = -1; switch(type) { case 0: // local client_id = m_sound->playSound(name, loop, gain, fade, pitch); break; case 1: // positional client_id = m_sound->playSoundAt(name, loop, gain, pos, pitch); break; case 2: { // object ClientActiveObject *cao = m_env.getActiveObject(object_id); if (cao) pos = cao->getPosition(); client_id = m_sound->playSoundAt(name, loop, gain, pos, pitch); // TODO: Set up sound to move with object break; } default: break; } if (client_id != -1) { m_sounds_server_to_client[server_id] = client_id; m_sounds_client_to_server[client_id] = server_id; if (object_id != 0) m_sounds_to_objects[client_id] = object_id; } } void Client::handleCommand_StopSound(NetworkPacket* pkt) { s32 server_id; *pkt >> server_id; std::unordered_map<s32, int>::iterator i = m_sounds_server_to_client.find(server_id); if (i != m_sounds_server_to_client.end()) { int client_id = i->second; m_sound->stopSound(client_id); } } void Client::handleCommand_FadeSound(NetworkPacket *pkt) { s32 sound_id; float step; float gain; *pkt >> sound_id >> step >> gain; std::unordered_map<s32, int>::const_iterator i = m_sounds_server_to_client.find(sound_id); if (i != m_sounds_server_to_client.end()) m_sound->fadeSound(i->second, step, gain); } void Client::handleCommand_Privileges(NetworkPacket* pkt) { m_privileges.clear(); infostream << "Client: Privileges updated: "; u16 num_privileges; *pkt >> num_privileges; for (u16 i = 0; i < num_privileges; i++) { std::string priv; *pkt >> priv; m_privileges.insert(priv); infostream << priv << " "; } infostream << std::endl; } void Client::handleCommand_InventoryFormSpec(NetworkPacket* pkt) { LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); // Store formspec in LocalPlayer player->inventory_formspec = pkt->readLongString(); } void Client::handleCommand_DetachedInventory(NetworkPacket* pkt) { std::string name; bool keep_inv = true; *pkt >> name >> keep_inv; infostream << "Client: Detached inventory update: \"" << name << "\", mode=" << (keep_inv ? "update" : "remove") << std::endl; const auto &inv_it = m_detached_inventories.find(name); if (!keep_inv) { if (inv_it != m_detached_inventories.end()) { delete inv_it->second; m_detached_inventories.erase(inv_it); } return; } Inventory *inv = nullptr; if (inv_it == m_detached_inventories.end()) { inv = new Inventory(m_itemdef); m_detached_inventories[name] = inv; } else { inv = inv_it->second; } u16 ignore; *pkt >> ignore; // this used to be the length of the following string, ignore it std::string contents(pkt->getRemainingString(), pkt->getRemainingBytes()); std::istringstream is(contents, std::ios::binary); inv->deSerialize(is); } void Client::handleCommand_ShowFormSpec(NetworkPacket* pkt) { std::string formspec = pkt->readLongString(); std::string formname; *pkt >> formname; ClientEvent *event = new ClientEvent(); event->type = CE_SHOW_FORMSPEC; // pointer is required as event is a struct only! // adding a std:string to a struct isn't possible event->show_formspec.formspec = new std::string(formspec); event->show_formspec.formname = new std::string(formname); m_client_event_queue.push(event); } void Client::handleCommand_SpawnParticle(NetworkPacket* pkt) { std::string datastring(pkt->getString(0), pkt->getSize()); std::istringstream is(datastring, std::ios_base::binary); v3f pos = readV3F32(is); v3f vel = readV3F32(is); v3f acc = readV3F32(is); float expirationtime = readF32(is); float size = readF32(is); bool collisiondetection = readU8(is); std::string texture = deSerializeLongString(is); bool vertical = false; bool collision_removal = false; TileAnimationParams animation; animation.type = TAT_NONE; u8 glow = 0; bool object_collision = false; try { vertical = readU8(is); collision_removal = readU8(is); animation.deSerialize(is, m_proto_ver); glow = readU8(is); object_collision = readU8(is); } catch (...) {} ClientEvent *event = new ClientEvent(); event->type = CE_SPAWN_PARTICLE; event->spawn_particle.pos = new v3f (pos); event->spawn_particle.vel = new v3f (vel); event->spawn_particle.acc = new v3f (acc); event->spawn_particle.expirationtime = expirationtime; event->spawn_particle.size = size; event->spawn_particle.collisiondetection = collisiondetection; event->spawn_particle.collision_removal = collision_removal; event->spawn_particle.object_collision = object_collision; event->spawn_particle.vertical = vertical; event->spawn_particle.texture = new std::string(texture); event->spawn_particle.animation = animation; event->spawn_particle.glow = glow; m_client_event_queue.push(event); } void Client::handleCommand_AddParticleSpawner(NetworkPacket* pkt) { u16 amount; float spawntime; v3f minpos; v3f maxpos; v3f minvel; v3f maxvel; v3f minacc; v3f maxacc; float minexptime; float maxexptime; float minsize; float maxsize; bool collisiondetection; u32 server_id; *pkt >> amount >> spawntime >> minpos >> maxpos >> minvel >> maxvel >> minacc >> maxacc >> minexptime >> maxexptime >> minsize >> maxsize >> collisiondetection; std::string texture = pkt->readLongString(); *pkt >> server_id; bool vertical = false; bool collision_removal = false; u16 attached_id = 0; TileAnimationParams animation; animation.type = TAT_NONE; u8 glow = 0; bool object_collision = false; try { *pkt >> vertical; *pkt >> collision_removal; *pkt >> attached_id; // This is horrible but required (why are there two ways to deserialize pkts?) std::string datastring(pkt->getRemainingString(), pkt->getRemainingBytes()); std::istringstream is(datastring, std::ios_base::binary); animation.deSerialize(is, m_proto_ver); glow = readU8(is); object_collision = readU8(is); } catch (...) {} auto event = new ClientEvent(); event->type = CE_ADD_PARTICLESPAWNER; event->add_particlespawner.amount = amount; event->add_particlespawner.spawntime = spawntime; event->add_particlespawner.minpos = new v3f (minpos); event->add_particlespawner.maxpos = new v3f (maxpos); event->add_particlespawner.minvel = new v3f (minvel); event->add_particlespawner.maxvel = new v3f (maxvel); event->add_particlespawner.minacc = new v3f (minacc); event->add_particlespawner.maxacc = new v3f (maxacc); event->add_particlespawner.minexptime = minexptime; event->add_particlespawner.maxexptime = maxexptime; event->add_particlespawner.minsize = minsize; event->add_particlespawner.maxsize = maxsize; event->add_particlespawner.collisiondetection = collisiondetection; event->add_particlespawner.collision_removal = collision_removal; event->add_particlespawner.object_collision = object_collision; event->add_particlespawner.attached_id = attached_id; event->add_particlespawner.vertical = vertical; event->add_particlespawner.texture = new std::string(texture); event->add_particlespawner.id = server_id; event->add_particlespawner.animation = animation; event->add_particlespawner.glow = glow; m_client_event_queue.push(event); } void Client::handleCommand_DeleteParticleSpawner(NetworkPacket* pkt) { u32 server_id; *pkt >> server_id; ClientEvent *event = new ClientEvent(); event->type = CE_DELETE_PARTICLESPAWNER; event->delete_particlespawner.id = server_id; m_client_event_queue.push(event); } void Client::handleCommand_HudAdd(NetworkPacket* pkt) { std::string datastring(pkt->getString(0), pkt->getSize()); std::istringstream is(datastring, std::ios_base::binary); u32 server_id; u8 type; v2f pos; std::string name; v2f scale; std::string text; u32 number; u32 item; u32 dir; v2f align; v2f offset; v3f world_pos; v2s32 size; *pkt >> server_id >> type >> pos >> name >> scale >> text >> number >> item >> dir >> align >> offset; try { *pkt >> world_pos; } catch(SerializationError &e) {}; try { *pkt >> size; } catch(SerializationError &e) {}; ClientEvent *event = new ClientEvent(); event->type = CE_HUDADD; event->hudadd.server_id = server_id; event->hudadd.type = type; event->hudadd.pos = new v2f(pos); event->hudadd.name = new std::string(name); event->hudadd.scale = new v2f(scale); event->hudadd.text = new std::string(text); event->hudadd.number = number; event->hudadd.item = item; event->hudadd.dir = dir; event->hudadd.align = new v2f(align); event->hudadd.offset = new v2f(offset); event->hudadd.world_pos = new v3f(world_pos); event->hudadd.size = new v2s32(size); m_client_event_queue.push(event); } void Client::handleCommand_HudRemove(NetworkPacket* pkt) { u32 server_id; *pkt >> server_id; auto i = m_hud_server_to_client.find(server_id); if (i != m_hud_server_to_client.end()) { int client_id = i->second; m_hud_server_to_client.erase(i); ClientEvent *event = new ClientEvent(); event->type = CE_HUDRM; event->hudrm.id = client_id; m_client_event_queue.push(event); } } void Client::handleCommand_HudChange(NetworkPacket* pkt) { std::string sdata; v2f v2fdata; v3f v3fdata; u32 intdata = 0; v2s32 v2s32data; u32 server_id; u8 stat; *pkt >> server_id >> stat; if (stat == HUD_STAT_POS || stat == HUD_STAT_SCALE || stat == HUD_STAT_ALIGN || stat == HUD_STAT_OFFSET) *pkt >> v2fdata; else if (stat == HUD_STAT_NAME || stat == HUD_STAT_TEXT) *pkt >> sdata; else if (stat == HUD_STAT_WORLD_POS) *pkt >> v3fdata; else if (stat == HUD_STAT_SIZE ) *pkt >> v2s32data; else *pkt >> intdata; std::unordered_map<u32, u32>::const_iterator i = m_hud_server_to_client.find(server_id); if (i != m_hud_server_to_client.end()) { ClientEvent *event = new ClientEvent(); event->type = CE_HUDCHANGE; event->hudchange.id = i->second; event->hudchange.stat = (HudElementStat)stat; event->hudchange.v2fdata = new v2f(v2fdata); event->hudchange.v3fdata = new v3f(v3fdata); event->hudchange.sdata = new std::string(sdata); event->hudchange.data = intdata; event->hudchange.v2s32data = new v2s32(v2s32data); m_client_event_queue.push(event); } } void Client::handleCommand_HudSetFlags(NetworkPacket* pkt) { u32 flags, mask; *pkt >> flags >> mask; LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); bool was_minimap_visible = player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE; bool was_minimap_radar_visible = player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE; player->hud_flags &= ~mask; player->hud_flags |= flags; m_minimap_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_VISIBLE); bool m_minimap_radar_disabled_by_server = !(player->hud_flags & HUD_FLAG_MINIMAP_RADAR_VISIBLE); // Hide minimap if it has been disabled by the server if (m_minimap && m_minimap_disabled_by_server && was_minimap_visible) // defers a minimap update, therefore only call it if really // needed, by checking that minimap was visible before m_minimap->setMinimapMode(MINIMAP_MODE_OFF); // Switch to surface mode if radar disabled by server if (m_minimap && m_minimap_radar_disabled_by_server && was_minimap_radar_visible) m_minimap->setMinimapMode(MINIMAP_MODE_SURFACEx1); } void Client::handleCommand_HudSetParam(NetworkPacket* pkt) { u16 param; std::string value; *pkt >> param >> value; LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); if (param == HUD_PARAM_HOTBAR_ITEMCOUNT && value.size() == 4) { s32 hotbar_itemcount = readS32((u8*) value.c_str()); if (hotbar_itemcount > 0 && hotbar_itemcount <= HUD_HOTBAR_ITEMCOUNT_MAX) player->hud_hotbar_itemcount = hotbar_itemcount; } else if (param == HUD_PARAM_HOTBAR_IMAGE) { // If value not empty verify image exists in texture source if (!value.empty() && !getTextureSource()->isKnownSourceImage(value)) { errorstream << "Server sent wrong Hud hotbar image (sent value: '" << value << "')" << std::endl; return; } player->hotbar_image = value; } else if (param == HUD_PARAM_HOTBAR_SELECTED_IMAGE) { // If value not empty verify image exists in texture source if (!value.empty() && !getTextureSource()->isKnownSourceImage(value)) { errorstream << "Server sent wrong Hud hotbar selected image (sent value: '" << value << "')" << std::endl; return; } player->hotbar_selected_image = value; } } void Client::handleCommand_HudSetSky(NetworkPacket* pkt) { std::string datastring(pkt->getString(0), pkt->getSize()); std::istringstream is(datastring, std::ios_base::binary); video::SColor *bgcolor = new video::SColor(readARGB8(is)); std::string *type = new std::string(deSerializeString(is)); u16 count = readU16(is); std::vector<std::string> *params = new std::vector<std::string>; for (size_t i = 0; i < count; i++) params->push_back(deSerializeString(is)); bool clouds = true; try { clouds = readU8(is); } catch (...) {} ClientEvent *event = new ClientEvent(); event->type = CE_SET_SKY; event->set_sky.bgcolor = bgcolor; event->set_sky.type = type; event->set_sky.params = params; event->set_sky.clouds = clouds; m_client_event_queue.push(event); } void Client::handleCommand_CloudParams(NetworkPacket* pkt) { f32 density; video::SColor color_bright; video::SColor color_ambient; f32 height; f32 thickness; v2f speed; *pkt >> density >> color_bright >> color_ambient >> height >> thickness >> speed; ClientEvent *event = new ClientEvent(); event->type = CE_CLOUD_PARAMS; event->cloud_params.density = density; // use the underlying u32 representation, because we can't // use struct members with constructors here, and this way // we avoid using new() and delete() for no good reason event->cloud_params.color_bright = color_bright.color; event->cloud_params.color_ambient = color_ambient.color; event->cloud_params.height = height; event->cloud_params.thickness = thickness; // same here: deconstruct to skip constructor event->cloud_params.speed_x = speed.X; event->cloud_params.speed_y = speed.Y; m_client_event_queue.push(event); } void Client::handleCommand_OverrideDayNightRatio(NetworkPacket* pkt) { bool do_override; u16 day_night_ratio_u; *pkt >> do_override >> day_night_ratio_u; float day_night_ratio_f = (float)day_night_ratio_u / 65536; ClientEvent *event = new ClientEvent(); event->type = CE_OVERRIDE_DAY_NIGHT_RATIO; event->override_day_night_ratio.do_override = do_override; event->override_day_night_ratio.ratio_f = day_night_ratio_f; m_client_event_queue.push(event); } void Client::handleCommand_LocalPlayerAnimations(NetworkPacket* pkt) { LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); *pkt >> player->local_animations[0]; *pkt >> player->local_animations[1]; *pkt >> player->local_animations[2]; *pkt >> player->local_animations[3]; *pkt >> player->local_animation_speed; } void Client::handleCommand_EyeOffset(NetworkPacket* pkt) { LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); *pkt >> player->eye_offset_first >> player->eye_offset_third; } void Client::handleCommand_UpdatePlayerList(NetworkPacket* pkt) { u8 type; u16 num_players; *pkt >> type >> num_players; PlayerListModifer notice_type = (PlayerListModifer) type; for (u16 i = 0; i < num_players; i++) { std::string name; *pkt >> name; switch (notice_type) { case PLAYER_LIST_INIT: case PLAYER_LIST_ADD: m_env.addPlayerName(name); continue; case PLAYER_LIST_REMOVE: m_env.removePlayerName(name); continue; } } } void Client::handleCommand_SrpBytesSandB(NetworkPacket* pkt) { if (m_chosen_auth_mech != AUTH_MECHANISM_SRP && m_chosen_auth_mech != AUTH_MECHANISM_LEGACY_PASSWORD) { errorstream << "Client: Received SRP S_B login message," << " but wasn't supposed to (chosen_mech=" << m_chosen_auth_mech << ")." << std::endl; return; } char *bytes_M = 0; size_t len_M = 0; SRPUser *usr = (SRPUser *) m_auth_data; std::string s; std::string B; *pkt >> s >> B; infostream << "Client: Received TOCLIENT_SRP_BYTES_S_B." << std::endl; srp_user_process_challenge(usr, (const unsigned char *) s.c_str(), s.size(), (const unsigned char *) B.c_str(), B.size(), (unsigned char **) &bytes_M, &len_M); if ( !bytes_M ) { errorstream << "Client: SRP-6a S_B safety check violation!" << std::endl; return; } NetworkPacket resp_pkt(TOSERVER_SRP_BYTES_M, 0); resp_pkt << std::string(bytes_M, len_M); Send(&resp_pkt); } void Client::handleCommand_FormspecPrepend(NetworkPacket *pkt) { LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); // Store formspec in LocalPlayer *pkt >> player->formspec_prepend; } void Client::handleCommand_CSMRestrictionFlags(NetworkPacket *pkt) { *pkt >> m_csm_restriction_flags >> m_csm_restriction_noderange; // Restrictions were received -> load mods if it's enabled // Note: this should be moved after mods receptions from server instead loadMods(); } void Client::handleCommand_PlayerSpeed(NetworkPacket *pkt) { v3f added_vel; *pkt >> added_vel; LocalPlayer *player = m_env.getLocalPlayer(); assert(player != NULL); player->addVelocity(added_vel); } /* * Mod channels */ void Client::handleCommand_ModChannelMsg(NetworkPacket *pkt) { std::string channel_name, sender, channel_msg; *pkt >> channel_name >> sender >> channel_msg; verbosestream << "Mod channel message received from server " << pkt->getPeerId() << " on channel " << channel_name << ". sender: `" << sender << "`, message: " << channel_msg << std::endl; if (!m_modchannel_mgr->channelRegistered(channel_name)) { verbosestream << "Server sent us messages on unregistered channel " << channel_name << ", ignoring." << std::endl; return; } m_script->on_modchannel_message(channel_name, sender, channel_msg); } void Client::handleCommand_ModChannelSignal(NetworkPacket *pkt) { u8 signal_tmp; ModChannelSignal signal; std::string channel; *pkt >> signal_tmp >> channel; signal = (ModChannelSignal)signal_tmp; bool valid_signal = true; // @TODO: send Signal to Lua API switch (signal) { case MODCHANNEL_SIGNAL_JOIN_OK: m_modchannel_mgr->setChannelState(channel, MODCHANNEL_STATE_READ_WRITE); infostream << "Server ack our mod channel join on channel `" << channel << "`, joining." << std::endl; break; case MODCHANNEL_SIGNAL_JOIN_FAILURE: // Unable to join, remove channel m_modchannel_mgr->leaveChannel(channel, 0); infostream << "Server refused our mod channel join on channel `" << channel << "`" << std::endl; break; case MODCHANNEL_SIGNAL_LEAVE_OK: #ifndef NDEBUG infostream << "Server ack our mod channel leave on channel " << channel << "`, leaving." << std::endl; #endif break; case MODCHANNEL_SIGNAL_LEAVE_FAILURE: infostream << "Server refused our mod channel leave on channel `" << channel << "`" << std::endl; break; case MODCHANNEL_SIGNAL_CHANNEL_NOT_REGISTERED: #ifndef NDEBUG // Generally unused, but ensure we don't do an implementation error infostream << "Server tells us we sent a message on channel `" << channel << "` but we are not registered. Message was dropped." << std::endl; #endif break; case MODCHANNEL_SIGNAL_SET_STATE: { u8 state; *pkt >> state; if (state == MODCHANNEL_STATE_INIT || state >= MODCHANNEL_STATE_MAX) { infostream << "Received wrong channel state " << state << ", ignoring." << std::endl; return; } m_modchannel_mgr->setChannelState(channel, (ModChannelState) state); infostream << "Server sets mod channel `" << channel << "` in read-only mode." << std::endl; break; } default: #ifndef NDEBUG warningstream << "Received unhandled mod channel signal ID " << signal << ", ignoring." << std::endl; #endif valid_signal = false; break; } // If signal is valid, forward it to client side mods if (valid_signal) m_script->on_modchannel_signal(channel, signal); }