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); }
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); } }
public void RequestChunkRadius(int radius) { var packet = McpeRequestChunkRadius.CreateObject(); packet.chunkRadius = radius; base.SendPacket(packet); }
public void StartClient() { Skin skin = new Skin { Slim = false, Texture = Encoding.Default.GetBytes(new string('Z', 8192)), SkinType = "Standard_Custom" }; var nodeServer = new NodeServer(_endPoint); PlayerInfo playerInfo = new PlayerInfo { Username = _username, ClientUuid = new UUID(Guid.NewGuid().ToString()), ClientId = ClientId, ServerAddress = "localhost", Skin = skin }; _fromNodeHander = new MockNetworkHandler(this); _toNodeHandler = (BaseMessageHandler)nodeServer.CreatePlayer(_fromNodeHander, playerInfo); if (_toNodeHandler == null) { IsRunning = false; return; } _toNodeHandler.HandleMcpeClientToServerHandshake(null); McpeRequestChunkRadius radius = McpeRequestChunkRadius.CreateObject(); radius.chunkRadius = ChunkRadius; _toNodeHandler.WriteBytes(radius.Encode()); radius.PutPool(); IsRunning = true; }
public void HandleMcpeRequestChunkRadius(McpeRequestChunkRadius message) { }
public override void HandleMcpeRequestChunkRadius(McpeRequestChunkRadius message) { base.HandleMcpeRequestChunkRadius(message); MoveRenderDistance = ChunkRadius - 2; MaxViewDistance = ChunkRadius; }
public abstract void HandleMcpeRequestChunkRadius(McpeRequestChunkRadius message);
public override void HandleMcpeRequestChunkRadius(McpeRequestChunkRadius message) { }
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); } }
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); } }
public void HandleMcpeRequestChunkRadius(McpeRequestChunkRadius message) { WritePackage(message); }
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); } }
public override void HandleMcpeRequestChunkRadius(McpeRequestChunkRadius message) { BaseClient.RequestChunkRadius(Client.ChunkRadius); }
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); } }