NBT操作基礎 第1部

NBT操作基礎 第1部

0.はじめに

 このページには、Minecraft JavaEditionにおけるNBT操作についての基礎事項が記載されています。

  • コマンドでゲームモードが変更できる。
  • giveコマンドをコマンド生成サイト等で生成してみたことがある。
  • NBTというのを聞いたことはあるがよく分かっていない。

 以上のような方へ向けてできるだけ分かりやすく説明していきます。

 タイトルにもある「NBT操作」はMinecraftのコマンドにおいて必須ともいる技術です。↓

 NBT操作ができるようになることで、コマンドで表現できる幅が飛躍的に向上します。

 NBT操作の基礎から始めて、自作モブや自作ボスを作るのに必要な事項、最終的には「ストレージ」や「マクロ」へと繋がる実践的な応用まで取り扱っていきます。

 ぜひこれからのコマンド制作やマップ作成にご活用ください!

 なお、さらに詳しく知りたい場合や本ページで取り上げていないコマンドに関してはWiki等を参照してください。

https://minecraft.fandom.com/ja/wiki/Minecraft_Wiki など)


1.「NBT」と確認方法

 「NBT」とは、プレイヤーエンティティ(ゾンビや羊、ドロップされたアイテムなど)、ブロックエンティティ(チェストやかまどなどの中身を開けることのできるブロック)が持つデータのことです。

 プレイヤーであれば「何を持っているか」「地面に立っているか」「体力はどれくらいか」などの情報がプレイヤー自身にNBTとして保存されています。

 プレイヤーやエンティティ、ブロックエンティティのNBTを確認するためには、以下のようなコマンドを実行します。

プレイヤー(@p)のNBTを確認する。↓

/data get entity @p

エンティティの一つであるゾンビ(@e[type=zombie])のNBTを確認する。
(/data get コマンドの対象は単数である必要があるため、セレクター内に limit=1 を , カンマ後に並べる)↓

/data get entity @e[type=zombie,limit=1]

・座標 0 0 0 にある、ブロックエンティティ(チェストやかまどなどの中身を開けることのできるブロック)のNBTを確認する。↓

/data get block 0 0 0

 ゾンビに対して先のコマンド(/data get entity @e[type=zombie,limit=1])を実行した結果は次の通りです。これを用いてNBTの構造を見ていきましょう。↓

 まずNBTの基本として、NBTはすべてが { } 波括弧で囲われています。

 そしてデータのひとつひとつは Health: 20.0f のように、「NBTの名前」「 : コロン」「」で構成されています。↓

 これらが { } 波括弧の中に , カンマで並べられています。

 これが、NBTです。


2.NBTの指定方法

 上で見たゾンビの例で表示されたNBTは、ゾンビが持つすべてのNBTが表示されていました。

 欲しいデータだけを表示させるにはコマンドの引数として、NBTの名前を指定します。

 今回は先ほど確認できた Health をコマンドの末尾に追加してみましょう。↓

/data get entity @e[type=zombie,limit=1] Health

 ゾンビにこのコマンドを実行した結果は次の通りです。↓

 ゾンビは { } 波括弧の中に「Health:20.0f」つまり、「NBTの名前がHealthで値が20.0f」というNBTを持っていたので、このようにNBTの名前に対応した値が表示されました。

 ゾンビは Health(体力)が 20.0f という値であることが分かりました。

 ゾンビは先ほどの結果から、他にもNBTを持っていることが分かっています。次のコマンドを実行してみましょう。↓

/data get entity @e[type=zombie,limit=1] OnGround

 結果は次のようになります。↓

 ゾンビは { } 波括弧の中に 「OnGround:1b」つまり、 「NBTの名前がOnGroundで値が1b」というNBTを持っていたので、今度はOnGroundに対応した値が表示されました。

 ゾンビは OnGround(地面に触れているかどうか)が 1b という値である(地面に触れている)ことが分かりました。

 このように、NBTの値を知りたいときは /data get コマンドに「NBTの名前」を指定することで対応する「値」を確認することができるのです。


3.NBTの値 数値編

 先ほどのゾンビの例では、Health という名前のNBTは値として 20.0f を持っていました。

 OnGround であれば値として 1b を持っていました。

 これらの値は「数字」と「アルファベット」で構成されています。

 値の文末にあるアルファベットはデータの型を表しており、その意味は次の表の通りです。↓

アルファベット意味もっと詳しい意味(Wikiより引用)
f浮動小数点数を表します。(Float)単精度浮動小数点数。値域は-3.4E+38以上+3.4E+38以下。
b真(true = 1)または偽(false = 0)を表します。(Byte)(S)NBT上で true または false と書いた場合にはそれぞれ8ビット整数の 0 と 1 に変換されて解釈される。

 したがって、ゾンビの例で見た Health の 20.0f という値は浮動小数点で20.0を、OnGround の 1b という値は 真 ( true ) であることを表していたことになります。

 また、プレイヤーやエンティティ、ブロックエンティティなどが持つNBTは常に更新され続けています。

 例えば、ゾンビをダイヤモンドの剣(攻撃力7)で攻撃した後に先ほどと同じ Health という名前のNBTを取得するコマンド

/data get entity @e[type=zombie,limit=1] Health

を実行してみると、↓

ダイヤモンドの剣の攻撃力と同じだけゾンビの体力が減っていることが分かります。

 ゾンビを浮遊させてから OnGround という名前のNBTを取得するコマンド

/data get entity @e[type=zombie,limit=1] OnGround

を実行してみると、

今度は値が 0b となり 0 は 偽 ( false ) を表しますから、地面に触れていないということが分かります。


4.NBTの値 リスト編

 NBT操作の第一の関門、リストについて触れていきます。

確認問題① NBTの指定

 その前におさらいです。

  •  ゾンビ1体が持つ「Pos」という名前のNBTの内容を確認したい場合、どのようなコマンドを打ち込めばよいでしょうか?
解答例を表示


解答例:

/data get entity @e[type=zombie,limit=1] Pos

解説:

2.NBTの指定 にならって、「NBTの名前」の部分を「Pos」にすればいいですね!

 ではこのコマンドを実行してみると、↓

 [-26.5d, -13.0d, 156.5d] という結果が表示されました。これは何を表しているのでしょうか。

 [ ] 角括弧は値を , カンマ区切りで並べることができます。

 NBTの構造と似ていますが、NBTは { } 波括弧で囲い、「NBTの名前」「:コロン」「値」で一セットでした。

 [ ] 角括弧で囲われたデータの並びは「リスト」と呼ばれ「値」のみを並べます。

 このとき、リスト内の値のデータの型はすべて同一である必要があります。

 [-26.5d, -13.0d, 156.5d] という結果を見てみると、「-26.5d」「-13.0d」「156.5d」と末尾のアルファベットがすべて d なので、同一のデータの型といえます。

 なおアルファベット d の意味は以下の通りです。↓

アルファベット意味もっと詳しい意味(Wikiより引用)
d倍精度浮動小数点数を表します。(Double)倍精度浮動小数点数。値域は-1.7E+308以上+1.7E+308以下。

 「Pos」という名前のNBTはエンティティが立っている座標を記録しています。

 リスト内に3つの数値があるのはx座標、y座標、z座標をそれぞれ表しているためです。

 ゾンビが持っていた「Pos:[-26.5d, -13.0d, 156.5d]」というNBTは、「x座標が-26.5、y座標が-13.0、z座標が156.5の位置にいる」ということを表していたことになります。

5.NBTの値 文字列編

 ゾンビにタグを与えてみましょう。タグ名は何でも構いません。ここでは「Sushi」としておきます。↓

/tag @e[type=zombie,limit=1] add Sushi

 エンティティがタグを持っているかどうかはセレクターを用いることで確認できます。↓

/say @e[tag=Sushi]

 say コマンドは実行者の名前も表示されます。結果に表示されている [SushinoKeshin] は筆者のプレイヤーネームで、その後の ゾンビ が該当のタグを持っているエンティティの名前です。

 エンティティが持つタグは、そのエンティティがNBTとして保持しています。

/data get entity @e[type=zombie,limit=1]

でゾンビがどのようにしてタグを持っているか確認してみましょう。↓

 Tags: [“Sushi”]」 というNBTが確認できましたね。NBTの名前は「Tags」で、値は「[“Sushi”]」ということが分かりました。

 4.NBTの値 リスト編 で触れたように、 [ ] 角括弧で囲われている値はリストを表しています。

 リストの中、すなわち[ ] 角括弧の中にはさらに値を並べることができます。今回の場合だと「”Sushi”」という値が一つだけ並べられています。

 ” ” ダブルクォーテーション で囲まれている値は文字列を表します。

 したがって、Tagsという名前のNBTはリストの中に、「Sushi」という文字列を持っているということが分かりました。

 Tags はリストということが分かったので、値を複数持つことができるはずです。

 ゾンビにさらにタグを付与してみましょう。今回もタグ名は何でも構いません。ここでは「Maguro」としておきます。↓

/tag @e[type=zombie,limit=1] add Maguro

 エンティティがタグを持っているかどうかはセレクターを用いることで確認できます。↓

/say @e[tag=Maguro]

 NBTを確認する方法でもタグをどのように持っているか見てみましょう。

 今回はNBTの名前は「Tags」と分かっていますから、これを指定してNBTを確認してみます。↓

/data get entity @e[type=zombie,limit=1] Tags

 これを実行してみると、↓

 NBTの値は「[“Maguro”, “Sushi”]」となりました。

 同一のデータの型(文字列)が , カンマ区切りで並べられており、いま追加した「Maguro」という文字列と、先ほど追加した「Sushi」という文字列を持っていることが確認できました。


第1部 おわり

 リストのように、NBTは「NBTの値」の中にさらに「値」が入ることで複雑なデータを表現することができます。

 では、値の中の値を指定するにはどうすればよいでしょうか?

 第2部ではこのことについてさらに奥深く、NBT操作の方法を記載していきます。

 第1部はNBTの基礎事項を一通り説明したためここで終了となります。お疲れ様でした!