private static void Schematic2BlockCollection(string file) { #region Initialization var nbt = new NbtFile(); nbt.LoadFromFile(file); var root = nbt.RootTag; //Read File bcl = new BlockCollection(); bcl.SetWidth(root.Get <NbtShort>("Width").ShortValue); //Get Width bcl.SetHeight(root.Get <NbtShort>("Height").ShortValue); bcl.SetLength(root.Get <NbtShort>("Length").ShortValue); bcl.Comments = "Created by S2J"; //Set Comment var blocks = root.Get <NbtByteArray>("Blocks").ByteArrayValue; //Initialize Blocks var datas = root.Get <NbtByteArray>("Data").ByteArrayValue; //Initialize Datas bcl.level = new BlockCollection.Block[bcl.GetWidth(), bcl.GetHeight(), bcl.GetLength()]; #endregion var obj = new object(); Current.WriteLine(Environment.NewLine + "- Reading Schematic:"); Current.SetProgressBar(); int current = 0; int total = bcl.GetWidth(); #region Read Schematic Parallel.For(0, bcl.GetWidth(), x => { for (int y = 0; y < bcl.GetHeight(); y++) { for (int z = 0; z < bcl.GetLength(); z++) { var block = new BlockCollection.Block(); var index = y * bcl.GetWidth() * bcl.GetLength() + z * bcl.GetWidth() + x; if (blocks[index] != 0) { var blockInfo = res.GetBlockInfo(blocks[index].ToString(), datas[index].ToString(), version); if (blockInfo != null) { block.SetCoordinate(x, y, z); block.SetInfo(blockInfo); bcl.blocks.Add(block); bcl.level[x, y, z] = block; } } } } lock (obj) //Update Progress { current++; Current.DrawProgressBar(current * 100 / total); } }); #endregion }
private static BlockCollection FillFlow(BlockCollection blocks, Vector3 origin, SimpleBlockInfo fill_block, bool reverse = false) { Current.WriteLine(Environment.NewLine + "- Filling Flow..."); var m = blocks.level[blocks.GetWidth() / 2, blocks.GetHeight() / 2, blocks.GetLength() / 2]; var close = new List <int[]>(); var newb = res.GetBlockInfo(fill_block.Id, fill_block.Data, version); if (newb == null) { newb = new BlockInfo(); newb.Id = "$empty"; } //Get Fill Material if (origin.X < 0 || origin.X >= blocks.GetWidth() || origin.Y < 0 || origin.Y >= blocks.GetHeight() || origin.Z < 0 || origin.Z >= blocks.GetLength()) { origin.X = blocks.GetWidth() / 2; origin.Y = blocks.GetHeight() / 2; origin.Z = blocks.GetLength() / 2; } close.Add(new int[] { (int)origin.X, (int)origin.Y, (int)origin.Z }); //Set Finding Origin var flowed = new bool[blocks.GetWidth(), blocks.GetHeight(), blocks.GetLength()]; //Tag: flowed var _blocks = new List <BlockCollection.Block>(); foreach (var b in blocks.blocks) { _blocks.Add(b); } while (close.Count() > 0) //Flowing { var c = new { x = close[close.Count - 1][0], y = close[close.Count - 1][1], z = close[close.Count - 1][2] }; close.RemoveAt(close.Count - 1); if (blocks.level[c.x, c.y, c.z] == m) { var block = new BlockCollection.Block(); block.SetCoordinate(c.x, c.y, c.z); block.SetInfo(newb); blocks.blocks.Add(block); blocks.level[c.x, c.y, c.z] = block; flowed[c.x, c.y, c.z] = true; if (c.x - 1 >= 0) { close.Add(new int[] { c.x - 1, c.y, c.z }); } if (c.x + 1 < blocks.GetWidth()) { close.Add(new int[] { c.x + 1, c.y, c.z }); } if (c.y - 1 >= 0) { close.Add(new int[] { c.x, c.y - 1, c.z }); } if (c.y + 1 < blocks.GetHeight()) { close.Add(new int[] { c.x, c.y + 1, c.z }); } if (c.z - 1 >= 0) { close.Add(new int[] { c.x, c.y, c.z - 1 }); } if (c.z + 1 < blocks.GetLength()) { close.Add(new int[] { c.x, c.y, c.z + 1 }); } } } if (reverse) { Current.WriteLine(Environment.NewLine + "- Reversing Filling Flow..."); Current.SetProgressBar(); int current = 0; int total = bcl.GetWidth() * bcl.GetHeight() * bcl.GetLength(); //Fill Empty Regions for (int x = 0; x < blocks.GetWidth(); x++) { for (int y = 0; y < blocks.GetHeight(); y++) { for (int z = 0; z < blocks.GetLength(); z++) { if (!flowed[x, y, z] && blocks.level[x, y, z] == null) { var block = new BlockCollection.Block(); block.SetCoordinate(x, y, z); block.SetInfo(newb); _blocks.Add(block); blocks.level[x, y, z] = block; } //Update Progress current++; Current.DrawProgressBar(current * 100 / total); Current.Write(" " + current + " blocks have been scanned.(total : " + total + " )"); } } } blocks.blocks = _blocks; } return(blocks); }
private static void NBT2BlockCollection(string file) { #region Initialization var nbt = new NbtFile(); nbt.LoadFromFile(file); var root = nbt.RootTag; //Read File bcl = new BlockCollection(); bcl.SetWidth(root.Get <NbtList>("size")[0].IntValue); //Get Width bcl.SetHeight(root.Get <NbtList>("size")[1].IntValue); bcl.SetLength(root.Get <NbtList>("size")[2].IntValue); bcl.Comments = "Created by S2J"; //Set Comment var p = root.Get <NbtList>("palette"); var palettes = new List <NbtCompound>(); foreach (NbtCompound _p in p) { palettes.Add(_p); } var blocks = root.Get <NbtList>("blocks"); bcl.level = new BlockCollection.Block[bcl.GetWidth(), bcl.GetHeight(), bcl.GetLength()]; #endregion Current.WriteLine(Environment.NewLine + "- Reading NBT:"); Current.SetProgressBar(); int current = 0; int total = bcl.GetWidth() * bcl.GetHeight() * bcl.GetLength(); #region Read NBT foreach (NbtCompound b in blocks) { var index = b.Get <NbtInt>("state").IntValue; var _p = b.Get <NbtList>("pos"); var pos = new Vector3() { X = _p[0].IntValue, Y = _p[1].IntValue, Z = _p[2].IntValue }; var state = palettes[index]; if (state != null && state.Get <NbtString>("Name") != null) { var block = new BlockCollection.Block(); #region Id & Data var id = state.Get <NbtString>("Name").StringValue; var datas = new List <string>(); if (state.Get <NbtCompound>("Properties") != null) { foreach (var _s in state.Get <NbtCompound>("Properties")) { datas.Add(_s.Name + ":" + _s.StringValue); } } var data = string.Join(",", datas.ToArray()); #endregion //MessageBox.Show(id + " " + data); if (id != "minecraft:air" && id != "minecraft:void_air" && id != "minecraft:cave_air") { var blockInfo = res.GetBlockInfo(id, data, version); if (blockInfo != null) { block.SetCoordinate((int)pos.X, (int)pos.Y, (int)pos.Z); block.SetInfo(blockInfo); bcl.blocks.Add(block); bcl.level[(int)pos.X, (int)pos.Y, (int)pos.Z] = block; } } } //Update Progress current++; Current.DrawProgressBar(current * 100 / total); } #endregion }