Example #1
0
        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();
            }
        }