public void GenerateClassesForBlocks() { BlockPallet pallet = null; var assembly = Assembly.GetAssembly(typeof(Block)); using (var stream = assembly.GetManifestResourceStream(typeof(Block).Namespace + ".blockstates.json")) using (var reader = new StreamReader(stream)) { pallet = BlockPallet.FromJson(reader.ReadToEnd()); } List <(int, string)> blocks = new List <(int, string)>(); 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, BlockRecord> blockstate in pallet.OrderBy(r => r.Name).ThenBy(r => r.Data).GroupBy(r => r.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")) { string blockName = 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(); } }