aboutsummaryrefslogtreecommitdiff
path: root/assets/advtrains_across.xcf
blob: 58e4e72d5f585146f4d4d66c6a844071d07fa396 (plain)
ofshex dumpascii
0000 67 69 6d 70 20 78 63 66 20 66 69 6c 65 00 00 00 00 40 00 00 00 40 00 00 00 00 00 00 00 11 00 00 gimp.xcf.file....@...@..........
0020 00 01 01 00 00 00 13 00 00 00 08 42 90 04 9c 42 90 04 9c 00 00 00 14 00 00 00 04 00 00 00 38 00 ...........B...B..............8.
0040 00 00 16 00 00 00 04 00 00 00 01 00 00 00 15 00 00 01 1c 00 00 00 10 67 69 6d 70 2d 69 6d 61 67 .......................gimp-imag
0060 65 2d 67 72 69 64 00 00 00 00 01 00 00 01 00 28 73 74 79 6c 65 20 73 6f 6c 69 64 29 0a 28 66 67 e-grid.........(style.solid).(fg
0080 63 6f 6c 6f 72 20 28 63 6f 6c 6f 72 2d 72 67 62 61 20 30 2e 30 30 30 30 30 30 20 30 2e 30 30 30 color.(color-rgba.0.000000.0.000
00a0 30 30 30 20 30 2e 30 30 30 30 30 30 20 31 2e 30 30 30 30 30 30 29 29 0a 28 62 67 63 6f 6c 6f 72 000.0.000000.1.000000)).(bgcolor
00c0 20 28 63 6f 6c 6f 72 2d 72 67 62 61 20 31 2e 30 30 30 30 30 30 20 31 2e 30 30 30 30 30 30 20 31 .(color-rgba.1.000000.1.000000.1
00e0 2e 30 30 30 30 30 30 20 31 2e 30 30 30 30 30 30 29 29 0a 28 78 73 70 61 63 69 6e 67 20 31 30 2e .000000.1.000000)).(xspacing.10.
0100 30 30 30 30 30 30 29 0a 28 79 73 70 61 63 69 6e 67 20 31 30 2e 30 30 30 30 30 30 29 0a 28 73 70 000000).(yspacing.10.000000).(sp
0120 61 63 69 6e 67 2d 75 6e 69 74 20 69 6e 63 68 65 73 29 0a 28 78 6f 66 66 73 65 74 20 30 2e 30 30 acing-unit.inches).(xoffset.0.00
0140 30 30 30 30 29 0a 28 79 6f 66 66 73 65 74 20 30 2e 30 30 30 30 30 30 29 0a 28 6f 66 66 73 65 74 0000).(yoffset.0.000000).(offset
0160 2d 75 6e 69 74 20 69 6e 63 68 65 73 29 0a 00 00 00 00 00 00 00 00 00 00 00 01 9f 00 00 2d 3c 00 -unit.inches)................-<.
0180 00 2e ca 00 00 2f b1 00 00 30 98 00 00 31 7c 00 00 32 5a 00 00 00 00 00 00 34 2f 00 00 00 00 00 ...../...0...1|..2Z......4/.....
01a0 00 00 40 00 00 00 40 00 00 00 01 00 00 00 11 61 6e 64 72 65 61 73 6b 72 65 75 7a 2e 70 6e 67 00 ..@...@........andreaskreuz.png.
01c0 00 00 00 06 00 00 00 04 00 00 00 ff 00 00 00 08 00 00 00 04 00 00 00 00 00 00 00 09 00 00 00 04 ................................
01e0 00 00 00 00 00 00 00 1c 00 00 00 04 00 00 00 00 00 00 00 0a 00 00 00 04 00 00 00 00 00 00 00 0b ................................
0200 00 00 00 04 00 00 00 00 00 00 00 0c 00 00 00 04 00 00 00 00 00 00 00 0d 00 00 00 04 00 00 00 00 ................................
0220 00 00 00 0f 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 04 00 00 00 00 00 00 00 14 ................................
0240 00 00 00 04 00 00 00 02 00 00 00 00 00 00 00 00 00 00 02 58 00 00 00 00 00 00 00 40 00 00 00 40 ...................X.......@...@
0260 00 00 00 04 00 00 02 6c 00 00 00 00 00 00 00 40 00 00 00 40 00 00 02 7c 00 00 00 00 40 00 01 e7 .......l.......@...@...|....@...
0280 01 00 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 ......8.........8.........8.....
02a0 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fa e7 f1 00 00 3d 00 26 00 01 e7 02 ....8.........8..........=.&....
02c0 00 01 e7 07 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 08 00 02 e7 16 00 01 e7 02 00 01 e7 ..............=.................
02e0 07 00 01 e7 01 00 fa e7 f1 00 00 3d 00 01 00 fc e7 00 00 e7 01 e7 fd 37 e7 00 01 00 02 e7 1b 00 ...........=...........7........
0300 01 e7 07 00 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 02 e7 fe 37 00 02 00 01 e7 1c 00 01 e7 07 00 .............=......7...........
0320 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 02 e9 fe 3e 00 02 00 fe e9 00 02 00 fe f0 e9 10 e9 01 00 .........=......>...............
0340 fe e7 00 02 00 01 e7 07 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca 00 23 00 fe e7 00 0c 00 01 e7 ..................=....#........
0360 01 00 f7 e7 f1 00 00 3d 00 00 ca 00 23 00 fe e7 00 0c 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca .......=....#...............=...
0380 00 03 00 01 e7 01 3d fd e7 43 00 05 00 fe ec e7 02 e7 fe d7 00 0b 00 fe e7 00 03 00 01 e7 06 00 ......=..C......................
03a0 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca 00 02 00 fe e7 00 04 00 fe 43 00 03 00 07 e7 04 00 fc e8 .........=............C.........
03c0 e7 a4 00 02 00 fe e7 00 02 00 02 e7 06 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 7f 00 02 00 fe 52 .......................=.......R
03e0 00 04 00 fe e7 00 03 00 07 e7 02 00 fe 22 00 02 00 fe 65 00 01 00 fe e7 00 02 00 02 e7 06 00 01 ............."....e.............
0400 e7 01 00 fa e7 f1 00 00 3d 00 04 00 fe e7 00 0a 00 fe ee e7 06 e7 fe a0 00 06 00 fb e7 00 00 e7 ........=.......................
0420 00 02 00 02 e7 06 00 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 fe e7 00 0a 00 fe ee e7 06 e7 fe a0 ................=...............
0440 00 09 00 fe e7 00 02 00 02 e9 06 00 01 e7 01 00 f3 e7 f1 00 00 3d 00 00 ca e7 00 00 f0 00 05 00 .....................=..........
0460 fe ed 00 02 00 fe b8 e7 06 e7 fe 62 00 09 00 fe e7 00 0c 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ...........b.................=..
0480 ca e7 00 01 00 fe e7 00 04 00 fe e7 00 03 00 07 e7 08 00 fb e7 00 00 e7 00 0c 00 01 e7 01 00 f6 ................................
04a0 e7 f1 00 00 3d 00 00 ca e7 00 01 00 fd 91 e7 00 02 00 fe e7 00 05 00 05 e7 03 00 fe d6 00 06 00 ....=...........................
04c0 fe e7 00 02 00 fe e7 00 07 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 03 00 02 e7 fe 86 00 ...................=............
04e0 07 00 fb e8 e7 e7 ea 00 05 00 fc ee e7 e7 00 02 00 fe e7 00 02 00 fb e7 00 00 ea 00 04 00 01 e7 ................................
0500 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 27 00 fb e7 00 00 ea 00 04 00 01 e7 01 00 f6 e7 f1 00 00 .......=.....'..................
0520 3d 00 00 ca e7 00 27 00 fb e7 00 00 ea 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 =.....'..................=......
0540 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 0c 00 fe e7 00 07 00 01 e7 01 00 ..................._............
0560 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f .....=........................._
0580 00 0c 00 fe e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 .................=..............
05a0 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 05 00 fe e7 00 04 00 fe e7 00 07 00 01 e7 01 00 f4 e7 f1 ..........._....................
05c0 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 f6 5f 00 00 e7 ..=........................._...
05e0 e7 4d 00 00 e7 00 04 00 fb e7 00 00 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 .M.......................=......
0600 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 00 ..................._....M.....T.
0620 01 00 fb e7 00 00 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 ...................=............
0640 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 00 01 00 fb e7 00 00 ............._....M.....T.......
0660 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 .............=..................
0680 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 00 01 00 fb e7 00 00 e7 00 04 00 01 e7 ......._....M.....T.............
06a0 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 .......=........................
06c0 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 00 01 00 fe e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 ._....M.....T.................=.
06e0 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 ........................_....M..
0700 38 00 00 54 00 01 00 fe e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 8..T.................=..........
0720 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 00 01 00 fb e7 ..............._....M.....T.....
0740 00 00 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ...............=................
0760 ee e7 02 e7 01 00 03 e7 fe 5f 00 0c 00 fb e7 00 00 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 ........._....................=.
0780 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 0f 00 fe e7 00 04 ........................_.......
07a0 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 ..........=.....................
07c0 00 03 e7 fb 5f 00 00 f1 00 0c 00 fe e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 ...._....................=......
07e0 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 ef 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 ..................._............
0800 00 00 e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ...............=................
0820 ee e7 02 e7 01 00 03 e7 ef 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 07 00 01 e7 01 00 ........._......................
0840 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f .....=........................._
0860 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d ...............................=
0880 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 ........................._......
08a0 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 .........................=......
08c0 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 ..................._............
08e0 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 1b 00 ee f1 00 00 e7 ...................=............
0900 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 1b .........................=......
0920 00 ee f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 f2 f2 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d ...............................=
0940 00 00 ca e7 00 00 66 03 66 01 00 03 66 01 00 fe 68 66 02 66 01 00 03 66 eb 4b 00 00 f1 00 00 e7 ......f.f...f...hf.f...f.K......
0960 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 .........................=......
0980 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 ..................._............
09a0 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 ...................=............
09c0 e7 01 00 fe ee e7 02 e7 01 00 03 e7 ef 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 07 00 ............._..................
09e0 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 .........=......................
0a00 03 e7 ef 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d ..._...........................=
0a20 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 ........................._......
0a40 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 .........................=......
0a60 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 ..................._............
0a80 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 ...................=............
0aa0 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 ............._..................
0ac0 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 .............=..................
0ae0 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 ......._........................
0b00 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 .......=........................
0b20 eb 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 ._..............................
0b40 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 .=........................._....
0b60 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 ...........................=....
0b80 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 16 00 01 e7 01 00 f4 e7 f1 ....................._..........
0ba0 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 16 00 ..=........................._...
0bc0 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 .........=......................
0be0 03 e7 fe 5f 00 02 00 01 7a 11 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 ..._....z...........=...........
0c00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fb 5f 00 00 eb e7 02 e7 10 00 01 e7 01 00 f4 e7 f1 00 00 .............._.................
0c20 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fc 5f 00 00 e7 04 e7 =........................._.....
0c40 01 00 02 e7 01 00 fe e7 00 06 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 ....................=...........
0c60 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fc 5f 00 00 e7 04 e7 01 00 02 e7 01 00 fe e7 00 06 00 01 .............._.................
0c80 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 ........=.......................
0ca0 e7 fc 5f 00 00 e7 04 e7 01 00 02 e7 01 00 fe e7 00 06 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca .._.........................=...
0cc0 e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fc 5f 00 00 e7 03 e7 fc e8 00 00 ......................_.........
0ce0 e7 01 e7 01 00 fe 38 00 06 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 ......8............=............
0d00 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 01 00 02 e7 fe ef 00 01 00 02 e7 01 00 fe e7 00 45 ............._.................E
0d20 00 40 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 .@.........8.........8.........8
0d40 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fa e7 f1 00 00 3d 00 .........8.........8..........=.
0d60 26 00 01 e7 02 00 01 e7 07 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 08 00 02 e7 16 00 01 &..................=............
0d80 e7 02 00 01 e7 07 00 01 e7 01 00 fa e7 f1 00 00 3d 00 01 00 fc e7 00 00 e7 01 e7 fd 37 e7 00 01 ................=...........7...
0da0 00 02 e7 1b 00 01 e7 07 00 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 02 e7 fe 37 00 02 00 01 e7 1c ..................=......7......
0dc0 00 01 e7 07 00 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 02 e9 fe 3e 00 02 00 fe e9 00 02 00 fe f0 ..............=......>..........
0de0 e9 10 e9 01 00 fe e7 00 02 00 01 e7 07 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca 00 23 00 fe e7 .......................=....#...
0e00 00 0c 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca 00 23 00 fe e7 00 0c 00 01 e7 01 00 f7 e7 f1 00 ............=....#..............
0e20 00 3d 00 00 ca 00 03 00 01 e7 01 3d fd e7 43 00 05 00 fe ec e7 02 e7 fe d7 00 0b 00 fe e7 00 03 .=.........=..C.................
0e40 00 01 e7 06 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca 00 02 00 fe e7 00 04 00 fe 43 00 03 00 07 ..............=............C....
0e60 e7 04 00 fc e8 e7 a4 00 02 00 fe e7 00 02 00 02 e7 06 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 7f ............................=...
0e80 00 02 00 fe 52 00 04 00 fe e7 00 03 00 07 e7 02 00 fe 22 00 02 00 fe 65 00 01 00 fe e7 00 02 00 ....R............."....e........
0ea0 02 e7 06 00 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 fe e7 00 0a 00 fe ee e7 06 e7 fe a0 00 06 00 .............=..................
0ec0 fb e7 00 00 e7 00 02 00 02 e7 06 00 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 fe e7 00 0a 00 fe ee .....................=..........
0ee0 e7 06 e7 fe a0 00 09 00 fe e7 00 02 00 02 e9 06 00 01 e7 01 00 f3 e7 f1 00 00 3d 00 00 ca e7 00 ..........................=.....
0f00 00 f0 00 05 00 fe ed 00 02 00 fe b8 e7 06 e7 fe 62 00 09 00 fe e7 00 0c 00 01 e7 01 00 f6 e7 f1 ................b...............
0f20 00 00 3d 00 00 ca e7 00 01 00 fe e7 00 04 00 fe e7 00 03 00 07 e7 08 00 fb e7 00 00 e7 00 0c 00 ..=.............................
0f40 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 01 00 fd 91 e7 00 02 00 fe e7 00 05 00 05 e7 03 00 .........=......................
0f60 fe d6 00 06 00 fe e7 00 02 00 fe e7 00 07 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 03 00 ........................=.......
0f80 02 e7 fe 86 00 07 00 fb e8 e7 e7 ea 00 05 00 fc ee e7 e7 00 02 00 fe e7 00 02 00 fb e7 00 00 ea ................................
0fa0 00 04 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 27 00 fb e7 00 00 ea 00 04 00 01 e7 01 00 ............=.....'.............
0fc0 f6 e7 f1 00 00 3d 00 00 ca e7 00 27 00 fb e7 00 00 ea 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 .....=.....'..................=.
0fe0 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 0c 00 fe e7 00 07 ........................_.......
1000 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 ..........=.....................
1020 00 03 e7 fe 5f 00 0c 00 fe e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 ...._.................=.........
1040 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 05 00 fe e7 00 04 00 fe e7 00 07 00 01 e7 ................_...............
1060 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 .......=........................
1080 f6 5f 00 00 e7 e7 4d 00 00 e7 00 04 00 fb e7 00 00 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 ._....M.......................=.
10a0 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 ........................_....M..
10c0 e7 00 00 54 00 01 00 fb e7 00 00 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 ...T....................=.......
10e0 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 00 01 .................._....M.....T..
1100 00 fb e7 00 00 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 ..................=.............
1120 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 00 01 00 fb e7 00 00 e7 ............_....M.....T........
1140 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 ............=...................
1160 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 00 01 00 fe e7 00 07 00 01 e7 01 00 f4 e7 ......_....M.....T..............
1180 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 ...=........................._..
11a0 00 f8 4d 00 00 38 00 00 54 00 01 00 fe e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 ..M..8..T.................=.....
11c0 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 02 00 f8 4d 00 00 e7 00 00 54 ...................._....M.....T
11e0 00 01 00 fb e7 00 00 e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 ....................=...........
1200 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 0c 00 fb e7 00 00 e7 00 04 00 01 e7 01 00 f4 e7 .............._.................
1220 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 0f ...=........................._..
1240 00 fe e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ...............=................
1260 ee e7 02 e7 01 00 03 e7 fb 5f 00 00 f1 00 0c 00 fe e7 00 04 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 ........._....................=.
1280 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 ef 5f 00 00 f1 00 00 e7 00 ........................_.......
12a0 00 e7 00 00 e7 00 00 e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 ....................=...........
12c0 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 ef 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 07 .............._.................
12e0 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 ..........=.....................
1300 00 03 e7 eb 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 ...._...........................
1320 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 ....=........................._.
1340 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 ..............................=.
1360 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 00 ........................_.......
1380 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 1b 00 ........................=.......
13a0 ee f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 ..............................=.
13c0 00 ca e7 00 1b 00 ee f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 f2 f2 00 03 00 01 e7 01 00 f4 ................................
13e0 e7 f1 00 00 3d 00 00 ca e7 00 00 66 03 66 01 00 03 66 01 00 fe 68 66 02 66 01 00 03 66 eb 4b 00 ....=......f.f...f...hf.f...f.K.
1400 00 f1 00 00 e7 00 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 ..............................=.
1420 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 eb 5f 00 00 f1 00 00 e7 00 ........................_.......
1440 00 e7 00 00 e7 00 00 e7 00 00 e7 e7 00 03 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 ........................=.......
1460 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 ef 5f 00 00 f1 00 00 e7 00 00 e7 00 00 e7 00 .................._.............
1480 00 e7 00 07 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee ..............=.................
14a0 for(i=m_queue.begin(); i!=m_queue.end(); i++) { QueuedBlockEmerge *q = *i; if(q->pos == pos) { q->peer_ids[peer_id] = flags; return; } } } /* Add the block */ QueuedBlockEmerge *q = new QueuedBlockEmerge; q->pos = pos; if(peer_id != 0) q->peer_ids[peer_id] = flags; m_queue.push_back(q); } // Returned pointer must be deleted // Returns NULL if queue is empty QueuedBlockEmerge * pop() { JMutexAutoLock lock(m_mutex); core::list<QueuedBlockEmerge*>::Iterator i = m_queue.begin(); if(=........................._.....
1640 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 .......=........................
1660 fe 5f 00 16 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee ._............=.................
1680 e7 02 e7 01 00 03 e7 fe 5f 00 02 00 01 7a 11 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 ........_....z...........=......
16a0 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fb 5f 00 00 eb e7 02 e7 10 00 01 e7 01 00 ..................._............
16c0 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fc 5f .....=........................._
16e0 00 00 e7 04 e7 01 00 02 e7 01 00 fe e7 00 06 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 .........................=......
1700 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fc 5f 00 00 e7 04 e7 01 00 02 e7 01 00 fe ..................._............
1720 e7 00 06 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 .............=..................
1740 02 e7 01 00 03 e7 fc 5f 00 00 e7 04 e7 01 00 02 e7 01 00 fe e7 00 06 00 01 e7 01 00 f4 e7 f1 00 ......._........................
1760 00 3d 00 00 ca e7 00 00 e7 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fc 5f 00 00 e7 03 .=........................._....
1780 e7 fc e8 00 00 e7 01 e7 01 00 fe 38 00 06 00 01 e7 01 00 f4 e7 f1 00 00 3d 00 00 ca e7 00 00 e7 ...........8............=.......
17a0 03 e7 01 00 03 e7 01 00 fe ee e7 02 e7 01 00 03 e7 fe 5f 00 01 00 02 e7 fe ef 00 01 00 02 e7 01 .................._.............
17c0 00 fe e7 00 45 00 40 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 ....E.@.........8.........8.....
17e0 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fd e7 f1 00 38 00 01 e7 01 00 fa e7 ....8.........8.........8.......
1800 f1 00 00 3d 00 26 00 01 e7 02 00 01 e7 07 00 01 e7 01 00 f6 e7 f1 00 00 3d 00 00 ca e7 00 08 00 ...=.&..................=.......
1820 02 e7 16 00 01 e7 02 00 01 e7 07 00 01 e7 01 00 fa e7 f1 00 00 3d 00 01 00 fc e7 00 00 e7 01 e7 .....................=..........
1840 fd 37 e7 00 01 00 02 e7 1b 00 01 e7 07 00 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 02 e7 fe 37 00 .7.....................=......7.
1860 02 00 01 e7 1c 00 01 e7 07 00 01 e7 01 00 fa e7 f1 00 00 3d 00 04 00 02 e9 fe 3e 00 02 00 fe e9 ...................=......>.....
1880 00 02 00 fe f0 e9 10 e9 01 00 fe e7 00 02 00 01 e7 07 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca ............................=...
18a0 00 23 00 fe e7 00 0c 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca 00 23 00 fe e7 00 0c 00 01 e7 01 .#...............=....#.........
18c0 00 f7 e7 f1 00 00 3d 00 00 ca 00 03 00 01 e7 01 3d fd e7 43 00 05 00 fe ec e7 02 e7 fe d7 00 0b ......=.........=..C............
18e0 00 fe e7 00 03 00 01 e7 06 00 01 e7 01 00 f7 e7 f1 00 00 3d 00 00 ca 00 02 00 fe e7 00 04 00 fe ...................=............
if(IsRunning() == false) { Start(); } } }; struct PlayerInfo { u16 id; char name[PLAYERNAME_SIZE]; v3f position; Address address; float avg_rtt; PlayerInfo(); void PrintLine(std::ostream *s); }; /* Used for queueing and sorting block transfers in containers Lower priority number means higher priority. */ struct PrioritySortedBlockTransfer { PrioritySortedBlockTransfer(float a_priority, v3s16 a_pos, u16 a_peer_id) { priority = a_priority; pos = a_pos; peer_id = a_peer_id; } bool operator < (PrioritySortedBlockTransfer &other) { return priority < other.priority; } float priority; v3s16 pos; u16 peer_id; }; struct TextureRequest { std::string name; TextureRequest(const std::string &name_=""): name(name_) {} }; struct TextureInformation { std::string path; std::string sha1_digest; TextureInformation(const std::string path_="", const std::string sha1_digest_=""): path(path_), sha1_digest(sha1_digest_) { } }; class RemoteClient { public: // peer_id=0 means this client has no associated peer // NOTE: If client is made allowed to exist while peer doesn't, // this has to be set to 0 when there is no peer. // Also, the client must be moved to some other container. u16 peer_id; // The serialization version to use with the client u8 serialization_version; // u16 net_proto_version; // Version is stored in here after INIT before INIT2 u8 pending_serialization_version; bool definitions_sent; RemoteClient(): m_time_from_building(9999), m_excess_gotblocks(0) { peer_id = 0; serialization_version = SER_FMT_VER_INVALID; net_proto_version = 0; pending_serialization_version = SER_FMT_VER_INVALID; definitions_sent = false; m_nearest_unsent_d = 0; m_nearest_unsent_reset_timer = 0.0; m_nothing_to_send_counter = 0; m_nothing_to_send_pause_timer = 0; } ~RemoteClient() { } /* Finds block that should be sent next to the client. Environment should be locked when this is called. dtime is used for resetting send radius at slow interval */ void GetNextBlocks(Server *server, float dtime, core::array<PrioritySortedBlockTransfer> &dest); void GotBlock(v3s16 p); void SentBlock(v3s16 p); void SetBlockNotSent(v3s16 p); void SetBlocksNotSent(core::map<v3s16, MapBlock*> &blocks); s32 SendingCount() { return m_blocks_sending.size(); } // Increments timeouts and removes timed-out blocks from list // NOTE: This doesn't fix the server-not-sending-block bug // because it is related to emerging, not sending. //void RunSendingTimeouts(float dtime, float timeout); void PrintInfo(std::ostream &o) { o<<"RemoteClient "<<peer_id<<": " <<"m_blocks_sent.size()="<<m_blocks_sent.size() <<", m_blocks_sending.size()="<<m_blocks_sending.size() <<", m_nearest_unsent_d="<<m_nearest_unsent_d <<", m_excess_gotblocks="<<m_excess_gotblocks <<std::endl; m_excess_gotblocks = 0; } // Time from last placing or removing blocks float m_time_from_building; /*JMutex m_dig_mutex; float m_dig_time_remaining; // -1 = not digging s16 m_dig_tool_item; v3s16 m_dig_position;*/ /* List of active objects that the client knows of. Value is dummy. */ core::map<u16, bool> m_known_objects; private: /* Blocks that have been sent to client. - These don't have to be sent again. - A block is cleared from here when client says it has deleted it from it's memory Key is position, value is dummy. No MapBlock* is stored here because the blocks can get deleted. */ core::map<v3s16, bool> m_blocks_sent; s16 m_nearest_unsent_d; v3s16 m_last_center; float m_nearest_unsent_reset_timer; /* Blocks that are currently on the line. This is used for throttling the sending of blocks. - The size of this list is limited to some value Block is added when it is sent with BLOCKDATA. Block is removed when GOTBLOCKS is received. Value is time from sending. (not used at the moment) */ core::map<v3s16, float> m_blocks_sending; /* Count of excess GotBlocks(). There is an excess amount because the client sometimes gets a block so late that the server sends it again, and the client then sends two GOTBLOCKs. This is resetted by PrintInfo() */ u32 m_excess_gotblocks; // CPU usage optimization u32 m_nothing_to_send_counter; float m_nothing_to_send_pause_timer; }; class Server : public con::PeerHandler, public MapEventReceiver, public InventoryManager, public IGameDef, public IBackgroundBlockEmerger { public: /* NOTE: Every public method should be thread-safe */ Server( const std::string &path_world, const std::string &path_config, const SubgameSpec &gamespec, bool simple_singleplayer_mode ); ~Server(); void start(unsigned short port); void stop(); // This is mainly a way to pass the time to the server. // Actual processing is done in an another thread. void step(float dtime); // This is run by ServerThread and does the actual processing void AsyncRunStep(); void Receive(); void ProcessData(u8 *data, u32 datasize, u16 peer_id); core::list<PlayerInfo> getPlayerInfo(); // Environment must be locked when called void setTimeOfDay(u32 time) { m_env->setTimeOfDay(time); m_time_of_day_send_timer = 0; } bool getShutdownRequested() { return m_shutdown_requested; } /* Shall be called with the environment locked. This is accessed by the map, which is inside the environment, so it shouldn't be a problem. */ void onMapEditEvent(MapEditEvent *event); /* Shall be called with the environment and the connection locked. */ Inventory* getInventory(const InventoryLocation &loc); std::string getInventoryOwner(const InventoryLocation &loc); void setInventoryModified(const InventoryLocation &loc); // Connection must be locked when called std::wstring getStatusString(); void requestShutdown(void) { m_shutdown_requested = true; } // Envlock and conlock should be locked when calling this void SendMovePlayer(Player *player); // Thread-safe u64 getPlayerAuthPrivs(const std::string &name); void setPlayerAuthPrivs(const std::string &name, u64 privs); u64 getPlayerEffectivePrivs(const std::string &name); // Changes a player's password, password must be given as plaintext // If the player doesn't exist, a new entry is added to the auth manager void setPlayerPassword(const std::string &name, const std::wstring &password); // Saves g_settings to configpath given at initialization void saveConfig(); void setIpBanned(const std::string &ip, const std::string &name) { m_banmanager.add(ip, name); return; } void unsetIpBanned(const std::string &ip_or_name) { m_banmanager.remove(ip_or_name); return; } std::string getBanDescription(const std::string &ip_or_name) { return m_banmanager.getBanDescription(ip_or_name); } Address getPeerAddress(u16 peer_id) { return m_con.GetPeerAddress(peer_id); } // Envlock and conlock should be locked when calling this void notifyPlayer(const char *name, const std::wstring msg); void notifyPlayers(const std::wstring msg); void queueBlockEmerge(v3s16 blockpos, bool allow_generate); // Envlock and conlock should be locked when using Lua lua_State *getLua(){ return m_lua; } // IGameDef interface // Under envlock virtual IItemDefManager* getItemDefManager(); virtual INodeDefManager* getNodeDefManager(); virtual ICraftDefManager* getCraftDefManager(); virtual ITextureSource* getTextureSource(); virtual u16 allocateUnknownNodeId(const std::string &name); virtual ISoundManager* getSoundManager(); virtual MtEventManager* getEventManager(); IWritableItemDefManager* getWritableItemDefManager(); IWritableNodeDefManager* getWritableNodeDefManager(); IWritableCraftDefManager* getWritableCraftDefManager(); const ModSpec* getModSpec(const std::string &modname); std::string getWorldPath(){ return m_path_world; } void setAsyncFatalError(const std::string &error) { m_async_fatal_error.set(error); } private: // con::PeerHandler implementation. // These queue stuff to be processed by handlePeerChanges(). // As of now, these create and remove clients and players. void peerAdded(con::Peer *peer); void deletingPeer(con::Peer *peer, bool timeout); /* Static send methods */ static void SendHP(con::Connection &con, u16 peer_id, u8 hp); static void SendAccessDenied(con::Connection &con, u16 peer_id, const std::wstring &reason); static void SendDeathscreen(con::Connection &con, u16 peer_id, bool set_camera_point_target, v3f camera_point_target); static void SendItemDef(con::Connection &con, u16 peer_id, IItemDefManager *itemdef); static void SendNodeDef(con::Connection &con, u16 peer_id, INodeDefManager *nodedef); /* Non-static send methods. Conlock should be always used. Envlock usage is documented badly but it's easy to figure out which ones access the environment. */ // Envlock and conlock should be locked when calling these void SendInventory(u16 peer_id); // send wielded item info about player to all void SendWieldedItem(const ServerRemotePlayer *srp); // send wielded item info about all players to all players void SendPlayerItems(); void SendChatMessage(u16 peer_id, const std::wstring &message); void BroadcastChatMessage(const std::wstring &message); void SendPlayerHP(Player *player); /* Send a node removal/addition event to all clients except ignore_id. Additionally, if far_players!=NULL, players further away than far_d_nodes are ignored and their peer_ids are added to far_players */ // Envlock and conlock should be locked when calling these void sendRemoveNode(v3s16 p, u16 ignore_id=0, core::list<u16> *far_players=NULL, float far_d_nodes=100); void sendAddNode(v3s16 p, MapNode n, u16 ignore_id=0, core::list<u16> *far_players=NULL, float far_d_nodes=100); void setBlockNotSent(v3s16 p); // Environment and Connection must be locked when called void SendBlockNoLock(u16 peer_id, MapBlock *block, u8 ver); // Sends blocks to clients (locks env and con on its own) void SendBlocks(float dtime); void PrepareTextures(); void SendTextureAnnouncement(u16 peer_id); void SendTexturesRequested(u16 peer_id,core::list<TextureRequest> tosend); /* Something random */ void DiePlayer(Player *player); void RespawnPlayer(Player *player); void UpdateCrafting(u16 peer_id); // When called, connection mutex should be locked RemoteClient* getClient(u16 peer_id); // When called, environment mutex should be locked std::string getPlayerName(u16 peer_id) { Player *player = m_env->getPlayer(peer_id); if(player == NULL) return "[id="+itos(peer_id)+"]"; return player->getName(); } /* Get a player from memory or creates one. If player is already connected, return NULL Does not verify/modify auth info and password. Call with env and con locked. */ ServerRemotePlayer *emergePlayer(const char *name, u16 peer_id); // Locks environment and connection by its own struct PeerChange; void handlePeerChange(PeerChange &c); void handlePeerChanges(); u64 getPlayerPrivs(Player *player); /* Variables */ // World directory std::string m_path_world; // Path to user's configuration file ("" = no configuration file) std::string m_path_config; // Subgame specification SubgameSpec m_gamespec; // If true, do not allow multiple players and hide some multiplayer // functionality bool m_simple_singleplayer_mode; // Thread can set; step() will throw as ServerError MutexedVariable<std::string> m_async_fatal_error; // Some timers float m_liquid_transform_timer; float m_print_info_timer; float m_objectdata_timer; float m_emergethread_trigger_timer; float m_savemap_timer; IntervalLimiter m_map_timer_and_unload_interval; // NOTE: If connection and environment are both to be locked, // environment shall be locked first. // Environment ServerEnvironment *m_env; JMutex m_env_mutex; // Connection con::Connection m_con; JMutex m_con_mutex; // Connected clients (behind the con mutex) core::map<u16, RemoteClient*> m_clients; // User authentication AuthManager m_authmanager; // Bann checking BanManager m_banmanager; // Scripting // Envlock and conlock should be locked when using Lua lua_State *m_lua; // Item definition manager IWritableItemDefManager *m_itemdef; // Node definition manager IWritableNodeDefManager *m_nodedef; // Craft definition manager IWritableCraftDefManager *m_craftdef; // Event manager EventManager *m_event; // Mods core::list<ModSpec> m_mods; /* Threads */ // A buffer for time steps // step() increments and AsyncRunStep() run by m_thread reads it. float m_step_dtime; JMutex m_step_dtime_mutex; // The server mainly operates in this thread ServerThread m_thread; // This thread fetches and generates map EmergeThread m_emergethread; // Queue of block coordinates to be processed by the emerge thread BlockEmergeQueue m_emerge_queue; /* Time related stuff */ // Timer for sending time of day over network float m_time_of_day_send_timer; // Uptime of server in seconds MutexedVariable<double> m_uptime; /* Peer change queue. Queues stuff from peerAdded() and deletingPeer() to handlePeerChanges() */ enum PeerChangeType { PEER_ADDED, PEER_REMOVED }; struct PeerChange { PeerChangeType type; u16 peer_id; bool timeout; }; Queue<PeerChange> m_peer_change_queue; /* Random stuff */ // Mod parent directory paths core::list<std::string> m_modspaths; bool m_shutdown_requested; /* Map edit event queue. Automatically receives all map edits. The constructor of this class registers us to receive them through onMapEditEvent NOTE: Should these be moved to actually be members of ServerEnvironment? */ /* Queue of map edits from the environment for sending to the clients This is behind m_env_mutex */ Queue<MapEditEvent*> m_unsent_map_edit_queue; /* Set to true when the server itself is modifying the map and does all sending of information by itself. This is behind m_env_mutex */ bool m_ignore_map_edit_events; /* If set to !=0, the incoming MapEditEvents are modified to have this peed id as the disabled recipient This is behind m_env_mutex */ u16 m_ignore_map_edit_events_peer_id; friend class EmergeThread; friend class RemoteClient; std::map<std::string,TextureInformation> m_Textures; }; /* Runs a simple dedicated server loop. Shuts down when run is set to false. */ void dedicated_server_loop(Server &server, bool &run); #endif