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は簡単で素敵。

2018年6月
 123
45678910
11121314151617
18192021222324
252627282930  

ブログ統計情報

統計情報の取得中に問題が発生しました。後ほど、もう一度お試しください。
%d人のブロガーが「いいね」をつけました。