Пример #1
0
        public virtual void HandleMcpeStartGame(McpeStartGame message)
        {
            var client = Client;

            client.EntityId        = message.runtimeEntityId;
            client.NetworkEntityId = message.entityIdSelf;
            client.SpawnPoint      = message.spawn;
            client.CurrentLocation = new PlayerLocation(client.SpawnPoint, message.rotation.X, message.rotation.X, message.rotation.Y);

            BlockPalette blockPalette = message.blockPalette;

            client.BlockPalette        = blockPalette;
            client.LevelInfo.LevelName = message.worldName;
            client.LevelInfo.Version   = 19133;
            client.LevelInfo.GameType  = message.gamemode;

            var packet = McpeRequestChunkRadius.CreateObject();

            client.ChunkRadius = 5;
            packet.chunkRadius = client.ChunkRadius;

            if (Client.IsEmulator)
            {
                Client.HasSpawned = true;
                Client.PlayerStatusChangedWaitHandle.Set();
                Client.SendMcpeMovePlayer();
            }

            client.SendPacket(packet);
        }
Пример #2
0
        public override void HandleMcpeStartGame(McpeStartGame message)
        {
            Client.EntityId        = message.runtimeEntityId;
            Client.NetworkEntityId = message.entityIdSelf;
            Client.SpawnPoint      = message.spawn;
            Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.rotation.X, message.rotation.X, message.rotation.Y);

            Client.LevelInfo.LevelName = message.levelId;
            Client.LevelInfo.Version   = 19133;
            Client.LevelInfo.GameType  = message.gamemode;

            BlockPalette = message.blockPalette;

            _internalStates = new HashSet <BlockStateContainer>(BlockFactory.BlockPalette);

            {
                int viewDistance = Config.GetProperty("ViewDistance", 11);

                var packet = McpeRequestChunkRadius.CreateObject();
                Client.ChunkRadius = viewDistance;
                packet.chunkRadius = Client.ChunkRadius;

                Client.SendPacket(packet);
            }
        }
Пример #3
0
            public override void HandleMcpeStartGame(McpeStartGame message)
            {
                var fileNameBlockstates = Path.GetTempPath() + "blockstates_" + Guid.NewGuid() + ".json";
                var fileNameItemstates  = Path.GetTempPath() + "itemstates_" + Guid.NewGuid() + ".json";

                File.WriteAllText(fileNameBlockstates, JsonConvert.SerializeObject(message.blockPalette));
                File.WriteAllText(fileNameItemstates, JsonConvert.SerializeObject(message.itemstates));

                Finished = true;
            }
Пример #4
0
        private void OnMcpeStartGame(Package message)
        {
            McpeStartGame msg = (McpeStartGame)message;

            _entityId        = msg.entityId;
            _spawn           = new Vector3(msg.x, msg.y, msg.z);
            _level.LevelName = "Default";
            _level.Version   = 19133;
            _level.GameType  = msg.gamemode;

            //ClientUtils.SaveLevel(_level);
        }
Пример #5
0
        public override void HandleMcpeStartGame(McpeStartGame message)
        {
            Client.EntityId        = message.runtimeEntityId;
            Client.NetworkEntityId = message.entityIdSelf;
            Client.SpawnPoint      = message.spawn;
            Client.CurrentLocation = new MiNET.Utils.PlayerLocation(Client.SpawnPoint, message.unknown1.X, message.unknown1.X, message.unknown1.Y);

            BaseClient.WorldReceiver?.UpdatePlayerPosition(new API.Utils.PlayerLocation(new Microsoft.Xna.Framework.Vector3(Client.SpawnPoint.X, Client.SpawnPoint.Y, Client.SpawnPoint.Z), message.unknown1.X, message.unknown1.X, message.unknown1.Y));

            Dictionary <uint, Blockstate> ourStates = new Dictionary <uint, Blockstate>();

            foreach (var blockstate in message.blockstates)
            {
                var name = blockstate.Value.Name;

                if (name.Equals("minecraft:grass", StringComparison.InvariantCultureIgnoreCase))
                {
                    name = "minecraft:grass_block";
                }

                blockstate.Value.Name = name;

                //var state = BlockFactory.GetBlockState(name);
                ourStates.TryAdd((uint)blockstate.Key, blockstate.Value);
            }

            _blockStateMap = ourStates;
            ChunkProcessor._blockStateMap = ourStates;

            //File.WriteAllText("blockies.json", JsonConvert.SerializeObject(message.blockstates, Formatting.Indented));
            {
                BaseClient.RequestChunkRadius(Client.ChunkRadius);
            }

            if (BaseClient.WorldReceiver?.GetPlayerEntity() is Player player)
            {
                player.Inventory.IsPeInventory = true;
            }
        }
 private void OnMcpeStartGame(McpeStartGame package)
 {
     _nodeClient.EntityId = package.runtimeEntityId;
 }
Пример #7
0
        /// <summary>
        ///     Handles the specified package.
        /// </summary>
        /// <param name="message">The package.</param>
        /// <param name="senderEndpoint">The sender's endpoint.</param>
        private void HandlePackage(Package message, IPEndPoint senderEndpoint)
        {
            if (typeof(McpeBatch) == message.GetType())
            {
                McpeBatch batch = (McpeBatch)message;

                var messages = new List <Package>();

                // Get bytes
                byte[] payload = batch.payload;
                // Decompress bytes

                MemoryStream stream = new MemoryStream(payload);
                if (stream.ReadByte() != 0x78)
                {
                    throw new InvalidDataException("Incorrect ZLib header. Expected 0x78 0x9C");
                }
                stream.ReadByte();
                using (var defStream2 = new DeflateStream(stream, CompressionMode.Decompress, false))
                {
                    // Get actual package out of bytes
                    MemoryStream destination = new MemoryStream();
                    defStream2.CopyTo(destination);
                    byte[] internalBuffer = destination.ToArray();
                    messages.Add(PackageFactory.CreatePackage(internalBuffer[0], internalBuffer) ?? new UnknownPackage(internalBuffer[0], internalBuffer));
                }
                foreach (var msg in messages)
                {
                    HandlePackage(msg, senderEndpoint);
                }
                return;
            }

            TraceReceive(message);

            if (typeof(UnknownPackage) == message.GetType())
            {
                return;
            }

            if (typeof(McpeDisconnect) == message.GetType())
            {
                McpeDisconnect msg = (McpeDisconnect)message;
                Log.Debug(msg.message);
                StopServer();
                return;
            }

            if (typeof(ConnectedPing) == message.GetType())
            {
                ConnectedPing msg = (ConnectedPing)message;
                SendConnectedPong(msg.sendpingtime);
                return;
            }

            if (typeof(McpeFullChunkData) == message.GetType())
            {
                McpeFullChunkData msg   = (McpeFullChunkData)message;
                ChunkColumn       chunk = ClientUtils.DecocedChunkColumn(msg.chunkData);
                if (chunk != null)
                {
                    Log.DebugFormat("Chunk X={0}", chunk.x);
                    Log.DebugFormat("Chunk Z={0}", chunk.z);

                    ClientUtils.SaveChunkToAnvil(chunk);
                }
                return;
            }

            if (typeof(ConnectionRequestAccepted) == message.GetType())
            {
                Thread.Sleep(50);
                SendNewIncomingConnection();
                var t1 = new Timer(state => SendConnectedPing(), null, 2000, 5000);
                Thread.Sleep(50);
                SendLogin("Client12");
                return;
            }

            if (typeof(McpeSetSpawnPosition) == message.GetType())
            {
                McpeSetSpawnPosition msg = (McpeSetSpawnPosition)message;
                _spawn        = new Vector3(msg.x, msg.y, msg.z);
                _level.SpawnX = (int)_spawn.X;
                _level.SpawnY = (int)_spawn.Y;
                _level.SpawnZ = (int)_spawn.Z;

                return;
            }

            if (typeof(McpeStartGame) == message.GetType())
            {
                McpeStartGame msg = (McpeStartGame)message;
                _entityId        = msg.entityId;
                _spawn           = new Vector3(msg.x, msg.y, msg.z);
                _level.LevelName = "Default";
                _level.Version   = 19133;
                _level.GameType  = msg.gamemode;

                ClientUtils.SaveLevel(_level);

                return;
            }

            if (typeof(McpeTileEvent) == message.GetType())
            {
                McpeTileEvent msg = (McpeTileEvent)message;
                Log.DebugFormat("X: {0}", msg.x);
                Log.DebugFormat("Y: {0}", msg.y);
                Log.DebugFormat("Z: {0}", msg.z);
                Log.DebugFormat("Case 1: {0}", msg.case1);
                Log.DebugFormat("Case 2: {0}", msg.case2);
                return;
            }
            if (typeof(McpeAddEntity) == message.GetType())
            {
                McpeAddEntity msg = (McpeAddEntity)message;
                Log.DebugFormat("Entity ID: {0}", msg.entityId);
                Log.DebugFormat("Entity Type: {0}", msg.entityType);
                Log.DebugFormat("X: {0}", msg.x);
                Log.DebugFormat("Y: {0}", msg.y);
                Log.DebugFormat("Z: {0}", msg.z);
                Log.DebugFormat("Yaw: {0}", msg.yaw);
                Log.DebugFormat("Pitch: {0}", msg.pitch);
                Log.DebugFormat("Velocity X: {0}", msg.speedX);
                Log.DebugFormat("Velocity Y: {0}", msg.speedY);
                Log.DebugFormat("Velocity Z: {0}", msg.speedZ);
                Log.DebugFormat("Metadata: {0}", msg.metadata.ToString());
                Log.DebugFormat("Links count: {0}", msg.links);

                return;
            }
            if (typeof(McpeSetEntityData) == message.GetType())
            {
                McpeSetEntityData msg = (McpeSetEntityData)message;
                Log.DebugFormat("Entity ID: {0}", msg.entityId);
                MetadataDictionary metadata = msg.metadata;
                Log.DebugFormat("Metadata: {0}", metadata.ToString());
                return;
            }

            if (typeof(McpeMovePlayer) == message.GetType())
            {
                McpeMovePlayer msg = (McpeMovePlayer)message;
                Log.DebugFormat("Entity ID: {0}", msg.entityId);

                _currentLocation = new PlayerLocation(msg.x, msg.y + 10, msg.z);
                SendMcpeMovePlayer();
                return;
            }

            if (typeof(McpeUpdateBlock) == message.GetType())
            {
                McpeUpdateBlock msg = (McpeUpdateBlock)message;
                Log.DebugFormat("No of Blocks: {0}", msg.blocks.Count);
                return;
            }

            if (typeof(McpeLevelEvent) == message.GetType())
            {
                McpeLevelEvent msg = (McpeLevelEvent)message;
                Log.DebugFormat("Event ID: {0}", msg.eventId);
                Log.DebugFormat("X: {0}", msg.x);
                Log.DebugFormat("Y: {0}", msg.y);
                Log.DebugFormat("Z: {0}", msg.z);
                Log.DebugFormat("Data: {0}", msg.data);
                return;
            }
        }
 public abstract void HandleMcpeStartGame(McpeStartGame message);
Пример #9
0
        public override void HandleMcpeStartGame(McpeStartGame message)
        {
            Client.EntityId        = message.runtimeEntityId;
            Client.NetworkEntityId = message.entityIdSelf;
            Client.SpawnPoint      = message.spawn;
            Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.rotation.X, message.rotation.X, message.rotation.Y);

            Log.Warn($"Got position from startgame packet: {Client.CurrentLocation}");

            string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt";

            using (FileStream file = File.OpenWrite(fileName))
            {
                Log.Warn($"Writing new blocks to filename:\n{fileName}");

                var legacyIdMap = new Dictionary <string, int>();
                var assembly    = Assembly.GetAssembly(typeof(Block));
                using (Stream stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".legacy_id_map.json"))
                    using (var reader = new StreamReader(stream))
                    {
                        var result = JObject.Parse(reader.ReadToEnd());

                        foreach (var obj in result)
                        {
                            legacyIdMap.Add(obj.Key, (int)obj.Value);
                        }
                    }

                var writer = new IndentedTextWriter(new StreamWriter(file));

                writer.WriteLine($"namespace MiNET.Blocks");
                writer.WriteLine($"{{");
                writer.Indent++;

                var blocks = new List <(int, string)>();

                foreach (IGrouping <string, BlockRecord> blockstate in message.blockPallet.OrderBy(record => record.Name).ThenBy(record => record.Data).GroupBy(record => record.Name))
                {
                    var enumerator = blockstate.GetEnumerator();
                    enumerator.MoveNext();
                    var value = enumerator.Current;
                    if (value == null)
                    {
                        continue;
                    }
                    Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}");
                    int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", ""));

                    if (id == 0 && !value.Name.Contains("air"))
                    {
                        if (legacyIdMap.TryGetValue(value.Name, out id))
                        {
                            value.Id = id;
                        }

                        string blockName = Client.CodeName(value.Name.Replace("minecraft:", ""), true);

                        blocks.Add((value.Id, blockName));

                        writer.WriteLine($"public class {blockName}: Block");
                        writer.WriteLine($"{{");
                        writer.Indent++;

                        writer.WriteLine($"public {blockName}() : base({value.Id})");
                        writer.WriteLine($"{{");
                        writer.Indent++;
                        writer.WriteLine($"Name = \"{value.Name}\";");

                        do
                        {
                            writer.WriteLine($"// runtime id: {enumerator.Current.RuntimeId} 0x{enumerator.Current.RuntimeId:X}, data: {enumerator.Current.Data}");
                        } while (enumerator.MoveNext());

                        writer.Indent--;
                        writer.WriteLine($"}}");

                        writer.Indent--;
                        writer.WriteLine($"}}");
                    }
                }
                writer.Indent--;
                writer.WriteLine($"}}");

                foreach (var block in blocks.OrderBy(tuple => tuple.Item1))
                {
                    writer.WriteLine($"else if (blockId == {block.Item1}) block = new {block.Item2}();");
                }

                writer.Flush();
            }

            //			Log.Debug($@"
            //StartGame:
            //	entityId: {message.entityIdSelf}
            //	runtimeEntityId: {message.runtimeEntityId}
            //	spawn: {message.spawn}
            //	unknown1: {message.unknown1}
            //	dimension: {message.dimension}
            //	generator: {message.generator}
            //	gamemode: {message.gamemode}
            //	difficulty: {message.difficulty}
            //	hasAchievementsDisabled: {message.hasAchievementsDisabled}
            //	dayCycleStopTime: {message.dayCycleStopTime}
            //	eduMode: {message.eduMode}
            //	rainLevel: {message.rainLevel}
            //	lightnigLevel: {message.lightnigLevel}
            //	enableCommands: {message.enableCommands}
            //	isTexturepacksRequired: {message.isTexturepacksRequired}
            //	secret: {message.levelId}
            //	worldName: {message.worldName}
            //");

            LogGamerules(message.gamerules);


            Client.LevelInfo.LevelName = "Default";
            Client.LevelInfo.Version   = 19133;
            Client.LevelInfo.GameType  = message.gamemode;

            //ClientUtils.SaveLevel(_level);

            {
                var packet = McpeRequestChunkRadius.CreateObject();
                Client.ChunkRadius = 5;
                packet.chunkRadius = Client.ChunkRadius;

                Client.SendPacket(packet);
            }
        }
Пример #10
0
        /// <summary>
        ///     Handles the specified package.
        /// </summary>
        /// <param name="message">The package.</param>
        /// <param name="senderEndpoint">The sender's endpoint.</param>
        private void HandlePackage(Package message, IPEndPoint senderEndpoint)
        {
            if (typeof(McpeBatch) == message.GetType())
            {
                Log.Debug("Processing Batch package");
                McpeBatch batch = (McpeBatch)message;

                var messages = new List <Package>();

                // Get bytes
                byte[] payload = batch.payload;
                // Decompress bytes

                MemoryStream stream = new MemoryStream(payload);
                if (stream.ReadByte() != 0x78)
                {
                    throw new InvalidDataException("Incorrect ZLib header. Expected 0x78");
                }
                stream.ReadByte();
                using (var defStream2 = new DeflateStream(stream, CompressionMode.Decompress, false))
                {
                    // Get actual package out of bytes
                    MemoryStream destination = new MemoryStream();
                    defStream2.CopyTo(destination);
                    destination.Position = 0;
                    NbtBinaryReader reader = new NbtBinaryReader(destination, true);
                    do
                    {
                        int    len            = reader.ReadInt32();
                        byte[] internalBuffer = reader.ReadBytes(len);
                        messages.Add(PackageFactory.CreatePackage(internalBuffer[0], internalBuffer) ?? new UnknownPackage(internalBuffer[0], internalBuffer));
                    } while (destination.Position < destination.Length);                     // throw new Exception("Have more data");
                }
                foreach (var msg in messages)
                {
                    HandlePackage(msg, senderEndpoint);
                    msg.PutPool();
                }
                return;
            }

            TraceReceive(message);

            if (typeof(UnknownPackage) == message.GetType())
            {
                return;
            }

            if (typeof(McpeDisconnect) == message.GetType())
            {
                McpeDisconnect msg = (McpeDisconnect)message;
                Log.InfoFormat("Disconnect {1}: {0}", msg.message, Username);
                SendDisconnectionNotification();
                StopClient();
                return;
            }

            if (typeof(ConnectedPing) == message.GetType())
            {
                ConnectedPing msg = (ConnectedPing)message;
                SendConnectedPong(msg.sendpingtime);
                return;
            }

            if (typeof(McpeFullChunkData) == message.GetType())
            {
                //McpeFullChunkData msg = (McpeFullChunkData) message;
                //ChunkColumn chunk = ClientUtils.DecocedChunkColumn(msg.chunkData);
                //if (chunk != null)
                //{
                //	Log.DebugFormat("Chunk X={0}", chunk.x);
                //	Log.DebugFormat("Chunk Z={0}", chunk.z);

                //	//ClientUtils.SaveChunkToAnvil(chunk);
                //}
                return;
            }

            if (typeof(ConnectionRequestAccepted) == message.GetType())
            {
                Thread.Sleep(50);
                SendNewIncomingConnection();
                //_connectedPingTimer = new Timer(state => SendConnectedPing(), null, 1000, 1000);
                Thread.Sleep(50);
                SendLogin(Username);
                return;
            }

            if (typeof(McpeSetSpawnPosition) == message.GetType())
            {
                McpeSetSpawnPosition msg = (McpeSetSpawnPosition)message;
                _spawn        = new Vector3(msg.x, msg.y, msg.z);
                _level.SpawnX = (int)_spawn.X;
                _level.SpawnY = (int)_spawn.Y;
                _level.SpawnZ = (int)_spawn.Z;

                return;
            }

            if (typeof(McpeStartGame) == message.GetType())
            {
                McpeStartGame msg = (McpeStartGame)message;
                _entityId        = msg.entityId;
                _spawn           = new Vector3(msg.x, msg.y, msg.z);
                _level.LevelName = "Default";
                _level.Version   = 19133;
                _level.GameType  = msg.gamemode;

                //ClientUtils.SaveLevel(_level);

                return;
            }

            if (typeof(McpeTileEvent) == message.GetType())
            {
                McpeTileEvent msg = (McpeTileEvent)message;
                Log.DebugFormat("X: {0}", msg.x);
                Log.DebugFormat("Y: {0}", msg.y);
                Log.DebugFormat("Z: {0}", msg.z);
                Log.DebugFormat("Case 1: {0}", msg.case1);
                Log.DebugFormat("Case 2: {0}", msg.case2);
                return;
            }
            if (typeof(McpeAddEntity) == message.GetType())
            {
                McpeAddEntity msg = (McpeAddEntity)message;
                Log.DebugFormat("Entity ID: {0}", msg.entityId);
                Log.DebugFormat("Entity Type: {0}", msg.entityType);
                Log.DebugFormat("X: {0}", msg.x);
                Log.DebugFormat("Y: {0}", msg.y);
                Log.DebugFormat("Z: {0}", msg.z);
                Log.DebugFormat("Yaw: {0}", msg.yaw);
                Log.DebugFormat("Pitch: {0}", msg.pitch);
                Log.DebugFormat("Velocity X: {0}", msg.speedX);
                Log.DebugFormat("Velocity Y: {0}", msg.speedY);
                Log.DebugFormat("Velocity Z: {0}", msg.speedZ);
                //Log.DebugFormat("Metadata: {0}", msg.metadata.ToString());
                //Log.DebugFormat("Links count: {0}", msg.links);

                return;
            }
            if (typeof(McpeSetEntityData) == message.GetType())
            {
                McpeSetEntityData msg = (McpeSetEntityData)message;
                Log.DebugFormat("Entity ID: {0}", msg.entityId);
                MetadataDictionary metadata = msg.metadata;
                Log.DebugFormat("Metadata: {0}", metadata.ToString());
                return;
            }

            if (typeof(McpeMovePlayer) == message.GetType())
            {
                //McpeMovePlayer msg = (McpeMovePlayer) message;
                //Log.DebugFormat("Entity ID: {0}", msg.entityId);

                //CurrentLocation = new PlayerLocation(msg.x, msg.y + 10, msg.z);
                //SendMcpeMovePlayer();
                return;
            }

            if (typeof(McpeUpdateBlock) == message.GetType())
            {
                McpeUpdateBlock msg = (McpeUpdateBlock)message;
                Log.DebugFormat("No of Blocks: {0}", msg.blocks.Count);
                return;
            }

            if (typeof(McpeLevelEvent) == message.GetType())
            {
                McpeLevelEvent msg = (McpeLevelEvent)message;
                Log.DebugFormat("Event ID: {0}", msg.eventId);
                Log.DebugFormat("X: {0}", msg.x);
                Log.DebugFormat("Y: {0}", msg.y);
                Log.DebugFormat("Z: {0}", msg.z);
                Log.DebugFormat("Data: {0}", msg.data);
                return;
            }

            if (typeof(McpeContainerSetContent) == message.GetType())
            {
                McpeContainerSetContent msg = (McpeContainerSetContent)message;
                Log.DebugFormat("Window ID: 0x{0:x2}, Count: {1}", msg.windowId, msg.slotData.Count);
                var slots = msg.slotData.GetValues();

                foreach (var entry in slots)
                {
                    MetadataSlot slot = (MetadataSlot)entry;
                    //Log.DebugFormat(" - Id: {0}, Metadata: {1}, Count: {2}", slot.Value.Item.Id, slot.Value.Item.Metadata, slot.Value.Count);
                }
                return;
            }

            if (typeof(McpeCraftingData) == message.GetType())
            {
                string fileName = Path.GetTempPath() + "Recipes_" + Guid.NewGuid() + ".txt";
                Log.Info("Writing recipes to filename: " + fileName);
                FileStream file = File.OpenWrite(fileName);

                McpeCraftingData   msg    = (McpeCraftingData)message;
                IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(file));

                writer.WriteLine("static RecipeManager()");
                writer.WriteLine("{");
                writer.Indent++;
                writer.WriteLine("Recipes = new Recipes");
                writer.WriteLine("{");
                writer.Indent++;

                foreach (Recipe recipe in msg.recipes)
                {
                    ShapelessRecipe shapelessRecipe = recipe as ShapelessRecipe;
                    if (shapelessRecipe != null)
                    {
                        writer.WriteLine(string.Format("new ShapelessRecipe(new ItemStack(ItemFactory.GetItem({0}, {1}), {2}),", shapelessRecipe.Result.Id, shapelessRecipe.Result.Metadata, shapelessRecipe.Result.Count));
                        writer.Indent++;
                        writer.WriteLine("new List<ItemStack>");
                        writer.WriteLine("{");
                        writer.Indent++;
                        foreach (var itemStack in shapelessRecipe.Input)
                        {
                            writer.WriteLine(string.Format("new ItemStack(ItemFactory.GetItem({0}, {1}), {2}),", itemStack.Id, itemStack.Metadata, itemStack.Count));
                        }
                        writer.Indent--;
                        writer.WriteLine("}),");
                        writer.Indent--;

                        continue;
                    }

                    ShapedRecipe shapedRecipe = recipe as ShapedRecipe;
                    if (shapedRecipe != null)
                    {
                        writer.WriteLine(string.Format("new ShapedRecipe({0}, {1}, new ItemStack(ItemFactory.GetItem({2}, {3}), {4}),", shapedRecipe.Width, shapedRecipe.Height, shapedRecipe.Result.Id, shapedRecipe.Result.Metadata, shapedRecipe.Result.Count));
                        writer.Indent++;
                        writer.WriteLine("new Item[]");
                        writer.WriteLine("{");
                        writer.Indent++;
                        foreach (Item item in shapedRecipe.Input)
                        {
                            writer.WriteLine(string.Format("ItemFactory.GetItem({0}, {1}),", item.Id, item.Metadata));
                        }
                        writer.Indent--;
                        writer.WriteLine("}),");
                        writer.Indent--;

                        continue;
                    }
                }

                writer.WriteLine("};");
                writer.Indent--;
                writer.WriteLine("}");
                writer.Indent--;

                writer.Flush();

                file.Close();
                Environment.Exit(0);
                return;
            }
        }
Пример #11
0
        public override void HandleMcpeStartGame(McpeStartGame message)
        {
            Client.EntityId        = message.runtimeEntityId;
            Client.NetworkEntityId = message.entityIdSelf;
            Client.SpawnPoint      = message.spawn;
            Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.unknown1.X, message.unknown1.X, message.unknown1.Y);

            Log.Warn($"Got position from startgame packet: {Client.CurrentLocation}");

            string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt";

            using (FileStream file = File.OpenWrite(fileName))
            {
                Log.Warn($"Writing new blocks to filename:\n{fileName}");

                IndentedTextWriter writer = new IndentedTextWriter(new StreamWriter(file));

                writer.WriteLine($"namespace MiNET.Blocks");
                writer.WriteLine($"{{");
                writer.Indent++;

                foreach (IGrouping <string, KeyValuePair <int, Blockstate> > blockstate in message.blockstates.OrderBy(kvp => kvp.Value.Name).ThenBy(kvp => kvp.Value.Data).GroupBy(kvp => kvp.Value.Name))
                {
                    var enumerator = blockstate.GetEnumerator();
                    enumerator.MoveNext();
                    var value = enumerator.Current.Value;
                    if (value == null)
                    {
                        continue;
                    }
                    Log.Debug($"{value.RuntimeId}, {value.Name}, {value.Data}");
                    int id = BlockFactory.GetBlockIdByName(value.Name.Replace("minecraft:", ""));

                    if (id == 0 && !value.Name.Contains("air"))
                    {
                        string blockName = Client.CodeName(value.Name.Replace("minecraft:", ""), true);

                        writer.WriteLine($"public class {blockName}: Block");
                        writer.WriteLine($"{{");
                        writer.Indent++;

                        writer.WriteLine($"public {blockName}() : base({value.Id}, {value.RuntimeId})");
                        writer.WriteLine($"{{");
                        writer.Indent++;
                        writer.WriteLine($"Name {{get; set;}} = {value.Name}");

                        do
                        {
                            writer.WriteLine($"// runtime id: {enumerator.Current.Value.RuntimeId} 0x{enumerator.Current.Value.RuntimeId:X}, data: {enumerator.Current.Value.Data}");
                        } while (enumerator.MoveNext());

                        writer.Indent--;
                        writer.WriteLine($"}}");

                        writer.Indent--;
                        writer.WriteLine($"}}");
                    }
                }
                writer.Indent--;
                writer.WriteLine($"}}");
                writer.Flush();
            }

            //			Log.Debug($@"
            //StartGame:
            //	entityId: {message.entityIdSelf}
            //	runtimeEntityId: {message.runtimeEntityId}
            //	spawn: {message.spawn}
            //	unknown1: {message.unknown1}
            //	dimension: {message.dimension}
            //	generator: {message.generator}
            //	gamemode: {message.gamemode}
            //	difficulty: {message.difficulty}
            //	hasAchievementsDisabled: {message.hasAchievementsDisabled}
            //	dayCycleStopTime: {message.dayCycleStopTime}
            //	eduMode: {message.eduMode}
            //	rainLevel: {message.rainLevel}
            //	lightnigLevel: {message.lightnigLevel}
            //	enableCommands: {message.enableCommands}
            //	isTexturepacksRequired: {message.isTexturepacksRequired}
            //	secret: {message.levelId}
            //	worldName: {message.worldName}
            //");

            Client.LevelInfo.LevelName = "Default";
            Client.LevelInfo.Version   = 19133;
            Client.LevelInfo.GameType  = message.gamemode;

            //ClientUtils.SaveLevel(_level);

            {
                var packet = McpeRequestChunkRadius.CreateObject();
                Client.ChunkRadius = 5;
                packet.chunkRadius = Client.ChunkRadius;

                Client.SendPacket(packet);
            }
        }
Пример #12
0
        public override void HandleMcpeStartGame(McpeStartGame message)
        {
            Client.EntityId        = message.runtimeEntityId;
            Client.NetworkEntityId = message.entityIdSelf;
            Client.SpawnPoint      = message.spawn;
            Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.rotation.X, message.rotation.X, message.rotation.Y);

            BlockPalette blockPalette = message.blockPalette;

            Client.BlockPalette = blockPalette;

            Log.Warn($"Got position from startgame packet: {Client.CurrentLocation}");

            var settings = new JsonSerializerSettings
            {
                PreserveReferencesHandling = PreserveReferencesHandling.Arrays,
                TypeNameHandling           = TypeNameHandling.Auto,
                Formatting           = Formatting.Indented,
                DefaultValueHandling = DefaultValueHandling.Include
            };

            var fileNameItemstates = Path.GetTempPath() + "itemstates_" + Guid.NewGuid() + ".json";

            File.WriteAllText(fileNameItemstates, JsonConvert.SerializeObject(message.itemstates, settings));

            string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt";

            using (FileStream file = File.OpenWrite(fileName))
            {
                var writer = new IndentedTextWriter(new StreamWriter(file));

                Log.Warn($"Directory:\n{Path.GetTempPath()}");
                Log.Warn($"Filename:\n{fileName}");

                writer.WriteLine($"namespace MiNET.Blocks");
                writer.WriteLine($"{{");
                writer.Indent++;

                var blocks = new List <(int, string)>();

                foreach (IGrouping <string, BlockStateContainer> blockstateGrouping in blockPalette.OrderBy(record => record.Name).ThenBy(record => record.Data).ThenBy(record => record.RuntimeId).GroupBy(record => record.Name))
                {
                    BlockStateContainer currentBlockState = blockstateGrouping.First();
                    Log.Debug($"{currentBlockState.Name}, Id={currentBlockState.Id}");
                    BlockStateContainer defaultBlockState = BlockFactory.GetBlockById(currentBlockState.Id, 0)?.GetGlobalState();
                    if (defaultBlockState == null)
                    {
                        defaultBlockState = blockstateGrouping.FirstOrDefault(bs => bs.Data == 0);
                    }

                    Log.Debug($"{currentBlockState.RuntimeId}, {currentBlockState.Name}, {currentBlockState.Data}");
                    Block blockById     = BlockFactory.GetBlockById(currentBlockState.Id);
                    bool  existingBlock = blockById.GetType() != typeof(Block) && !blockById.IsGenerated;
                    int   id            = existingBlock ? currentBlockState.Id : -1;

                    string blockClassName = CodeName(currentBlockState.Name.Replace("minecraft:", ""), true);

                    blocks.Add((blockById.Id, blockClassName));
                    writer.WriteLineNoTabs($"");

                    writer.WriteLine($"public partial class {blockClassName} // {blockById.Id} typeof={blockById.GetType().Name}");
                    writer.WriteLine($"{{");
                    writer.Indent++;

                    writer.WriteLine($"public override string Name => \"{currentBlockState.Name}\";");
                    writer.WriteLineNoTabs("");

                    var bits = new List <BlockStateByte>();
                    foreach (var state in blockstateGrouping.First().States)
                    {
                        var q = blockstateGrouping.SelectMany(c => c.States);

                        // If this is on base, skip this property. We need this to implement common functionality.
                        Type baseType     = blockById.GetType().BaseType;
                        bool propOverride = baseType != null &&
                                            ("Block" != baseType.Name &&
                                             baseType.GetProperty(CodeName(state.Name, true)) != null);

                        switch (state)
                        {
                        case BlockStateByte blockStateByte:
                        {
                            var  values     = q.Where(s => s.Name == state.Name).Select(d => ((BlockStateByte)d).Value).Distinct().OrderBy(s => s).ToList();
                            byte defaultVal = ((BlockStateByte)defaultBlockState?.States.First(s => s.Name == state.Name))?.Value ?? 0;
                            if (values.Min() == 0 && values.Max() == 1)
                            {
                                bits.Add(blockStateByte);
                                writer.Write($"[StateBit] ");
                                writer.WriteLine($"public{(propOverride ? " override" : "")} bool {CodeName(state.Name, true)} {{ get; set; }} = {(defaultVal == 1 ? "true" : "false")};");
                            }
                            else
                            {
                                writer.Write($"[StateRange({values.Min()}, {values.Max()})] ");
                                writer.WriteLine($"public{(propOverride ? " override" : "")} byte {CodeName(state.Name, true)} {{ get; set; }} = {defaultVal};");
                            }
                            break;
                        }

                        case BlockStateInt blockStateInt:
                        {
                            var values     = q.Where(s => s.Name == state.Name).Select(d => ((BlockStateInt)d).Value).Distinct().OrderBy(s => s).ToList();
                            int defaultVal = ((BlockStateInt)defaultBlockState?.States.First(s => s.Name == state.Name))?.Value ?? 0;
                            writer.Write($"[StateRange({values.Min()}, {values.Max()})] ");
                            writer.WriteLine($"public{(propOverride ? " override" : "")} int {CodeName(state.Name, true)} {{ get; set; }} = {defaultVal};");
                            break;
                        }

                        case BlockStateString blockStateString:
                        {
                            var    values     = q.Where(s => s.Name == state.Name).Select(d => ((BlockStateString)d).Value).Distinct().ToList();
                            string defaultVal = ((BlockStateString)defaultBlockState?.States.First(s => s.Name == state.Name))?.Value ?? "";
                            if (values.Count > 1)
                            {
                                writer.WriteLine($"[StateEnum({string.Join(',', values.Select(v => $"\"{v}\""))})]");
                            }
                            writer.WriteLine($"public{(propOverride ? " override" : "")} string {CodeName(state.Name, true)} {{ get; set; }} = \"{defaultVal}\";");
                            break;
                        }

                        default:
                            throw new ArgumentOutOfRangeException(nameof(state));
                        }
                    }

                    // Constructor

                    //if (id == -1 || blockById.IsGenerated)
                    //{
                    //	writer.WriteLine($"");

                    //	writer.WriteLine($"public {blockClassName}() : base({currentBlockState.Id})");
                    //	writer.WriteLine($"{{");
                    //	writer.Indent++;
                    //	writer.WriteLine($"IsGenerated = true;");
                    //	writer.WriteLine($"SetGenerated();");
                    //	writer.Indent--;
                    //	writer.WriteLine($"}}");
                    //}

                    writer.WriteLineNoTabs($"");
                    writer.WriteLine($"public override void SetState(List<IBlockState> states)");
                    writer.WriteLine($"{{");
                    writer.Indent++;
                    writer.WriteLine($"foreach (var state in states)");
                    writer.WriteLine($"{{");
                    writer.Indent++;
                    writer.WriteLine($"switch(state)");
                    writer.WriteLine($"{{");
                    writer.Indent++;

                    foreach (var state in blockstateGrouping.First().States)
                    {
                        writer.WriteLine($"case {state.GetType().Name} s when s.Name == \"{state.Name}\":");
                        writer.Indent++;
                        writer.WriteLine($"{CodeName(state.Name, true)} = {(bits.Contains(state) ? "Convert.ToBoolean(s.Value)" : "s.Value")};");
                        writer.WriteLine($"break;");
                        writer.Indent--;
                    }

                    writer.Indent--;
                    writer.WriteLine($"}} // switch");
                    writer.Indent--;
                    writer.WriteLine($"}} // foreach");
                    writer.Indent--;
                    writer.WriteLine($"}} // method");

                    writer.WriteLineNoTabs($"");
                    writer.WriteLine($"public override BlockStateContainer GetState()");
                    writer.WriteLine($"{{");
                    writer.Indent++;
                    writer.WriteLine($"var record = new BlockStateContainer();");
                    writer.WriteLine($"record.Name = \"{blockstateGrouping.First().Name}\";");
                    writer.WriteLine($"record.Id = {blockstateGrouping.First().Id};");
                    foreach (var state in blockstateGrouping.First().States)
                    {
                        string propName = CodeName(state.Name, true);
                        writer.WriteLine($"record.States.Add(new {state.GetType().Name} {{Name = \"{state.Name}\", Value = {(bits.Contains(state) ? $"Convert.ToByte({propName})" : propName)}}});");
                    }
                    writer.WriteLine($"return record;");
                    writer.Indent--;
                    writer.WriteLine($"}} // method");
                    writer.Indent--;
                    writer.WriteLine($"}} // class");
                }

                writer.WriteLine();

                foreach (var block in blocks.OrderBy(tuple => tuple.Item1))
                {
                    int clazzId = block.Item1;

                    Block blockById     = BlockFactory.GetBlockById(clazzId);
                    bool  existingBlock = blockById.GetType() != typeof(Block) && !blockById.IsGenerated;
                    if (existingBlock)
                    {
                        continue;
                    }

                    string clazzName = block.Item2;
                    string baseClazz = clazzName.EndsWith("Stairs") ? "BlockStairs" : "Block";
                    baseClazz = clazzName.EndsWith("Slab") && !clazzName.EndsWith("DoubleSlab")? "SlabBase" : baseClazz;
                    writer.WriteLine($"public partial class {clazzName} : {baseClazz} {{ " +
                                     $"public {clazzName}() : base({clazzId}) {{ IsGenerated = true; }} " +
                                     $"}}");
                }

                writer.Indent--;
                writer.WriteLine($"}}");                 // namespace

                //foreach (var block in blocks.OrderBy(tuple => tuple.Item1))
                //{
                //	// 495 => new StrippedCrimsonStem(),
                //	writer.WriteLine($"\t\t\t\t{block.Item1} => new {block.Item2}(),");
                //}

                writer.Flush();
            }

            LogGamerules(message.gamerules);

            Client.LevelInfo.LevelName = "Default";
            Client.LevelInfo.Version   = 19133;
            Client.LevelInfo.GameType  = message.gamemode;

            //ClientUtils.SaveLevel(_level);

            {
                var packet = McpeRequestChunkRadius.CreateObject();
                Client.ChunkRadius = 5;
                packet.chunkRadius = Client.ChunkRadius;

                Client.SendPacket(packet);
            }
        }
Пример #13
0
        public override void HandleMcpeStartGame(McpeStartGame message)
        {
            Client.EntityId        = message.runtimeEntityId;
            Client.NetworkEntityId = message.entityIdSelf;
            Client.SpawnPoint      = message.spawn;
            Client.CurrentLocation = new PlayerLocation(Client.SpawnPoint, message.rotation.X, message.rotation.X, message.rotation.Y);

            BlockPalette blockPalette = message.blockPalette;

            Client.BlockPalette = blockPalette;

            Log.Warn($"Got position from startgame packet: {Client.CurrentLocation}");


            //var fileNameBlockstates = Path.GetTempPath() + "blockstates_" + Guid.NewGuid() + ".json";
            var fileNameItemstates = Path.GetTempPath() + "itemstates_" + Guid.NewGuid() + ".json";

            File.WriteAllText(fileNameItemstates, JsonConvert.SerializeObject(message.itemstates));

            string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt";

            using (FileStream file = File.OpenWrite(fileName))
            {
                var writer = new IndentedTextWriter(new StreamWriter(file));

                Log.Warn($"Directory:\n{Path.GetTempPath()}");
                Log.Warn($"Filename:\n{fileName}");

                writer.WriteLine($"namespace MiNET.Blocks");
                writer.WriteLine($"{{");
                writer.Indent++;

                var blocks = new List <(int, string)>();

                foreach (IGrouping <string, BlockStateContainer> blockstateGrouping in blockPalette.OrderBy(record => record.Name).ThenBy(record => record.Data).GroupBy(record => record.Name))
                {
                    var currentBlockState = blockstateGrouping.First();
                    var defaultBlockState = blockstateGrouping.FirstOrDefault(bs => bs.Data == 0);

                    Log.Debug($"{currentBlockState.RuntimeId}, {currentBlockState.Name}, {currentBlockState.Data}");
                    Block blockById     = BlockFactory.GetBlockById(currentBlockState.Id);
                    bool  existingBlock = blockById.GetType() != typeof(Block) && !blockById.IsGenerated;
                    int   id            = existingBlock ? currentBlockState.Id : -1;

                    string blockClassName = CodeName(currentBlockState.Name.Replace("minecraft:", ""), true);

                    blocks.Add((blockById.Id, blockClassName));
                    writer.WriteLineNoTabs($"");

                    writer.WriteLine($"public partial class {blockClassName} {(existingBlock ? "" : ": Block")} // {blockById.Id} typeof={blockById.GetType().Name}");
                    writer.WriteLine($"{{");
                    writer.Indent++;

                    var bits = new List <BlockStateByte>();
                    foreach (var state in blockstateGrouping.First().States)
                    {
                        var q = blockstateGrouping.SelectMany(c => c.States);

                        // If this is on base, skip this property. We need this to implement common functionality.
                        Type baseType     = blockById.GetType().BaseType;
                        bool propOverride = baseType != null &&
                                            ("Block" != baseType.Name &&
                                             baseType.GetProperty(CodeName(state.Name, true)) != null);

                        switch (state)
                        {
                        case BlockStateByte blockStateByte:
                        {
                            var  values     = q.Where(s => s.Name == state.Name).Select(d => ((BlockStateByte)d).Value).Distinct().OrderBy(s => s).ToList();
                            byte defaultVal = ((BlockStateByte)defaultBlockState?.States.First(s => s.Name == state.Name))?.Value ?? 0;
                            if (values.Min() == 0 && values.Max() == 1)
                            {
                                bits.Add(blockStateByte);
                                writer.Write($"[StateBit] ");
                                writer.WriteLine($"public {(propOverride ? "override" : "")} bool {CodeName(state.Name, true)} {{ get; set; }} = {(defaultVal == 1 ? "true" : "false")};");
                            }
                            else
                            {
                                writer.Write($"[StateRange({values.Min()}, {values.Max()})] ");
                                writer.WriteLine($"public {(propOverride ? "override" : "")} byte {CodeName(state.Name, true)} {{ get; set; }} = {defaultVal};");
                            }
                            break;
                        }

                        case BlockStateInt blockStateInt:
                        {
                            var values     = q.Where(s => s.Name == state.Name).Select(d => ((BlockStateInt)d).Value).Distinct().OrderBy(s => s).ToList();
                            int defaultVal = ((BlockStateInt)defaultBlockState?.States.First(s => s.Name == state.Name))?.Value ?? 0;
                            writer.Write($"[StateRange({values.Min()}, {values.Max()})] ");
                            writer.WriteLine($"public {(propOverride ? "override" : "")} int {CodeName(state.Name, true)} {{ get; set; }} = {defaultVal};");
                            break;
                        }

                        case BlockStateString blockStateString:
                        {
                            var    values     = q.Where(s => s.Name == state.Name).Select(d => ((BlockStateString)d).Value).Distinct().ToList();
                            string defaultVal = ((BlockStateString)defaultBlockState?.States.First(s => s.Name == state.Name))?.Value ?? "";
                            if (values.Count > 1)
                            {
                                writer.WriteLine($"[StateEnum({string.Join(',', values.Select(v => $"\"{v}\""))})]");
                            }
                            writer.WriteLine($"public {(propOverride ? "override" : "")} string {CodeName(state.Name, true)} {{ get; set; }} = \"{defaultVal}\";");
                            break;
                        }

                        default:
                            throw new ArgumentOutOfRangeException(nameof(state));
                        }
                    }

                    if (id == -1 || blockById.IsGenerated)
                    {
                        writer.WriteLine($"");

                        writer.WriteLine($"public {blockClassName}() : base({currentBlockState.Id})");
                        writer.WriteLine($"{{");
                        writer.Indent++;
                        writer.WriteLine($"IsGenerated = true;");
                        writer.Indent--;
                        writer.WriteLine($"}}");
                    }

                    writer.WriteLineNoTabs($"");
                    writer.WriteLine($"public override void SetState(List<IBlockState> states)");
                    writer.WriteLine($"{{");
                    writer.Indent++;
                    writer.WriteLine($"foreach (var state in states)");
                    writer.WriteLine($"{{");
                    writer.Indent++;
                    writer.WriteLine($"switch(state)");
                    writer.WriteLine($"{{");
                    writer.Indent++;

                    foreach (var state in blockstateGrouping.First().States)
                    {
                        writer.WriteLine($"case {state.GetType().Name} s when s.Name == \"{state.Name}\":");
                        writer.Indent++;
                        writer.WriteLine($"{CodeName(state.Name, true)} = {(bits.Contains(state) ? "Convert.ToBoolean(s.Value)" : "s.Value")};");
                        writer.WriteLine($"break;");
                        writer.Indent--;
                    }

                    writer.Indent--;
                    writer.WriteLine($"}} // switch");
                    writer.Indent--;
                    writer.WriteLine($"}} // foreach");
                    writer.Indent--;
                    writer.WriteLine($"}} // method");

                    writer.WriteLineNoTabs($"");
                    writer.WriteLine($"public override BlockStateContainer GetState()");
                    writer.WriteLine($"{{");
                    writer.Indent++;
                    writer.WriteLine($"var record = new BlockStateContainer();");
                    writer.WriteLine($"record.Name = \"{blockstateGrouping.First().Name}\";");
                    writer.WriteLine($"record.Id = {blockstateGrouping.First().Id};");
                    foreach (var state in blockstateGrouping.First().States)
                    {
                        string propName = CodeName(state.Name, true);
                        writer.WriteLine($"record.States.Add(new {state.GetType().Name} {{Name = \"{state.Name}\", Value = {(bits.Contains(state) ? $"Convert.ToByte({propName})" : propName)}}});");
                    }
                    writer.WriteLine($"return record;");
                    writer.Indent--;
                    writer.WriteLine($"}} // method");

                    //writer.WriteLine($"");

                    //writer.WriteLine($"public byte GetMetadataFromState()");
                    //writer.WriteLine($"{{");
                    //writer.Indent++;

                    //writer.WriteLine($"switch(this)");
                    //writer.WriteLine($"{{");
                    //writer.Indent++;


                    //i = 0;
                    //foreach (var record in message.BlockPalette.Where(b => b.Id == enumerator.Current.Id).OrderBy(b => b.Data))
                    //{
                    //	//case { } b when b.ButtonPressedBit == 0 && b.FacingDirection == 0:
                    //	//	return 0;

                    //	writer.Write($"case {{ }} b when true");
                    //	string retVal = "";
                    //	foreach (var state in record.States.OrderBy(s => s.Name).ThenBy(s => s.Value))
                    //	{
                    //		if (state.Type == (byte) NbtTagType.Byte)
                    //		{
                    //			writer.Write($" && b.{Client.CodeName(state.Name, true)} == {state.Value}");
                    //		}
                    //		else if (state.Type == (byte) NbtTagType.Int)
                    //		{
                    //			writer.Write($" && b.{Client.CodeName(state.Name, true)} == {state.Value}");
                    //		}
                    //		else if (state.Type == (byte) NbtTagType.String)
                    //		{
                    //			writer.Write($" && b.{Client.CodeName(state.Name, true)} == \"{state.Value}\"");
                    //		}
                    //	}
                    //	writer.WriteLine($":");

                    //	writer.Indent++;
                    //	writer.WriteLine($"return { i++ };");
                    //	writer.Indent--;
                    //}

                    //writer.Indent--;
                    //writer.WriteLine($"}} // switch");

                    //writer.WriteLine($"throw new ArithmeticException(\"Invalid state. Unable to convert state to valid metadata\");");

                    //writer.Indent--;
                    //writer.WriteLine($"}} // method");

                    writer.Indent--;
                    writer.WriteLine($"}} // class");
                }

                writer.Indent--;
                writer.WriteLine($"}}");

                foreach (var block in blocks.OrderBy(tuple => tuple.Item1))
                {
                    writer.WriteLine($"else if (blockId == {block.Item1}) block = new {block.Item2}();");
                }

                writer.Flush();
            }

            //			Log.Debug($@"
            //StartGame:
            //	entityId: {message.entityIdSelf}
            //	runtimeEntityId: {message.runtimeEntityId}
            //	spawn: {message.spawn}
            //	unknown1: {message.unknown1}
            //	dimension: {message.dimension}
            //	generator: {message.generator}
            //	gamemode: {message.gamemode}
            //	difficulty: {message.difficulty}
            //	hasAchievementsDisabled: {message.hasAchievementsDisabled}
            //	dayCycleStopTime: {message.dayCycleStopTime}
            //	eduMode: {message.eduMode}
            //	rainLevel: {message.rainLevel}
            //	lightnigLevel: {message.lightnigLevel}
            //	enableCommands: {message.enableCommands}
            //	isTexturepacksRequired: {message.isTexturepacksRequired}
            //	secret: {message.levelId}
            //	worldName: {message.worldName}
            //");

            LogGamerules(message.gamerules);

            Client.LevelInfo.LevelName = "Default";
            Client.LevelInfo.Version   = 19133;
            Client.LevelInfo.GameType  = message.gamemode;

            //ClientUtils.SaveLevel(_level);

            {
                var packet = McpeRequestChunkRadius.CreateObject();
                Client.ChunkRadius = 5;
                packet.chunkRadius = Client.ChunkRadius;

                Client.SendPacket(packet);
            }
        }