private static void WritePaletteToJson(BlockPalette palette) { var jsonSerializerSettings = new JsonSerializerSettings { PreserveReferencesHandling = PreserveReferencesHandling.None, Formatting = Formatting.None, }; jsonSerializerSettings.Converters.Add(new StringEnumConverter()); jsonSerializerSettings.Converters.Add(new NbtIntConverter()); jsonSerializerSettings.Converters.Add(new NbtStringConverter()); jsonSerializerSettings.Converters.Add(new IPAddressConverter()); jsonSerializerSettings.Converters.Add(new IPEndPointConverter()); var records = palette.OrderBy(bs => bs.Id).ThenBy(bs => bs.Data).ToArray(); string fileName = Path.GetTempPath() + "blockstates_" + Guid.NewGuid() + ".json"; var writer = File.AppendText(fileName); bool isFirst = true; writer.WriteLine("["); foreach (var record in records) { string result = JsonConvert.SerializeObject(record, jsonSerializerSettings); writer.Write($"{(isFirst ? "" : ",\n")}{result}"); isFirst = false; } writer.WriteLine("\n]"); var stringRecords = records.Where(r => r.States.Any(s => s is BlockStateString)); foreach (BlockStateContainer stringRecord in stringRecords) { writer.WriteLine($"Item {stringRecord.Name}"); } writer.Close(); }
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 void GeneratePartialBlocksFromBlockstates() { BlockPalette blockPalette = BlockFactory.BlockPalette; string fileName = Path.GetTempPath() + "MissingBlocks_" + Guid.NewGuid() + ".txt"; using (FileStream file = File.OpenWrite(fileName)) { var blocks = new List <(int, string)>(); var writer = new IndentedTextWriter(new StreamWriter(file)); Console.WriteLine($"Directory:\n{Path.GetTempPath()}"); Console.WriteLine($"Filename:\n{fileName}"); Log.Warn($"Writing blocks to filename:\n{fileName}"); writer.WriteLine($"namespace MiNET.Blocks"); writer.WriteLine($"{{"); writer.Indent++; 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(); } }
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); } }