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
プログラムってこんなことができるのかぁ