OrangeNBTでNBTを読み込む個人的メモ
Table of Content
OrangeNBTは、のとさんが開発した
Minecraft JEで使用されている、NBTフォーマットのファイルを読み書きすることのできる素晴らしい.NET向けライブラリです。
.NETCoreで書かれてるので、LinuxやMacでも使えます。
配布先https://github.com/noto0648/OrangeNBT
これを使うことで、level.datを編集して難易度をハードモードに変えたり、
ワールドにブロックを設置したりいろんなことが出来ます(schematicとかも読み込めます。)
NBTファイルを作成し、保存する方法
using OrangeNBT.NBT; using OrangeNBT.NBT.IO; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // NBTを作る var tag = new TagCompound("Profile") { new TagString("Name","Haru"), new TagString("Sex","Man"), new TagCompound("Organization") { new TagString("Name","TUSB"), new TagList("Contents") { new TagString("The Unusual SkyBlock"), new TagString("TUSBoss"), new TagString("TUSBちゃん") } } }; // NBTをファイルに保存 NBTFile.ToFile(@"C:\Profile.nbt", tag); } } }
NBTファイルを読込み、タグの値を表示してみる
using OrangeNBT.NBT; using OrangeNBT.NBT.IO; using System; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // NBTファイル読み込み TagCompound tag = NBTFile.FromFile(@"C:\Profile.nbt"); // Nameという名前のタグがあるか if (tag.ContainsKey("Name")) { // あった // Nameタグ取得 var name = (TagString)tag["Name"]; // 値を表示 Console.WriteLine(name.Value); } } } }
その他なんかいろいろできる
using OrangeNBT.NBT; using OrangeNBT.NBT.IO; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // NBTファイル読込み TagCompound tag = NBTFile.FromFile(@"C:\Profile.nbt"); // タグの追加 tag.Add(new TagByte("Otinpo", 1)); // タグの削除 tag.Remove("Otinpo"); // タグをすべて消す tag.Clear(); // 何も中身がないNBTを保存とかしてみる NBTFile.ToFile(@"C:\Profile.nbt",tag); } } }
ワールドの読み込みも簡単。素敵。
using OrangeNBT.World.Anvil; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // ワールド読み込み var w = AnvilWorld.Load(@"C:\World"); int x = 10; int y = 20; int z = 30; // x=10、y=20、z=30の座標に石ブロックを設置 w.Dimensions[AnvilDimension.Overworld].Blocks.SetBlockId(x, y, z, 1); } } }
ワールドのすべての石をダイヤモンド鉱石に置き換えてみる
using OrangeNBT.World.Anvil; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // ワールド読み込み var w = AnvilWorld.Load(@"C:\World"); // OverWorld、Nether、The End全て列挙 foreach(var dim in w.Dimensions) { // チャンク全部取得 var chunks = dim.Value.Chunks.ListAllChunks(); // チャンク列挙 foreach(var chunk in chunks) { // 全てのブロック列挙 for (int x = 0; x < 16; x++) { for (int y = 0; y < 256; y++) { for (int z = 0; z < 16; z++) { // ブロックID取得 int id = chunk.GetBlockId(x, y, z); // 石ブロックだったら if (id == 1) { // ダイヤモンド鉱石に置き換える chunk.SetBlockId(x, y, z, 56); } } } } } } } } }
やっぱりOrangeNBTは簡単で素敵。
1 Comment
kazuki uehara
プログラムってこんなことができるのかぁ