MC.JE コマンド技術書 第2項.nbtタグを使いこなすために。

第1項では、人参付きの棒を左手に持っているとき、右手で特定のアイテムを消費して魔法を使うことができるようにしました。その時、セレクタでnbtタグを条件指定したのですが、このnbtタグ、使いこなせば発想次第で様々なコマンドを実現することができるようになります。
今回はそのnbtタグの扱い方について解説していき、組めるコマンドの幅をより広げていただければなと思います。

1.nbtタグとは
2.nbtタグの調べ方
3.結果をスコアボードに記録する
4-A.nbtタグを変更する

    B.スコアボードからnbtタグを変更する

5.今回のまとめ
6.私が実際に使用しているコマンド実用例(有料公開)

1.nbtタグとは

まずnbtタグとは何なのか。
マイクラには大きく分けてブロック、エンティティ、パーティクルの3つがあります。(背景や音声は除外します。)
ブロックはプレイヤーが壊したり設置したりできるものですね。
エンティティはとても多くの種類があり、プレイヤーや動物や敵、防具立てや投げられたポーション、落ちているアイテムや経験値オーブなんかもエンティティに含まれます。
パーティクルは動物を繁殖させるときのハートや松明の炎、マイナーなものでいえば設置されたバリアブロックのマークなどが該当します。

nbtタグはこのうち、全てのエンティティ一部のブロックが持っており、様々な状態を記録したものをnbtタグと呼ばれています。
そのため対象の持つnbtタグを変更すると、それに応じて対象の状態も変化します。ただし、座標情報やプレイヤーのnbtタグなど、変更できないものもあります。

プレイヤーのOnGround(地に足がついているかどうか):
OnGround:0b=無効(ついていない)
OnGround:1b=有効(ついている)

クリーパーのPowered(帯電):
Powered:0b=無効(通常状態)
Powered:1b=有効(帯電状態)

放たれた矢のdamage:
damage:1=当たった相手に1ダメージを与える
damage:10=当たった相手に10ダメージを与える

これらを利用することで、対象の状態が指定の条件と一致する場合にコマンドが実行されるようにしたり、逆に対象のnbtタグを書き換えて通常ではありえない状態にさせることができます。

2.nbtタグの調べ方

対象のnbtタグはdataコマンドで調べることができます。

data get entity @e[type=item,sort=nearest,limit=1]

この場合、nbtタグを調べる対象は最寄りのアイテム1つとなります。
ここで一つ気を付けるべきなのは、通常はnbtタグを調べる対象は1つに絞らなければならないということ。2つ以上あるとエラーを返されます。
一応、executeコマンドを噛ませることで1度に2つ以上調べることも可能ではあるのですが、nbtタグの持つ情報量はとても多く、2つ以上を1度に調べてもわかりづらいだけなので、複数調べたいものがあるときは1つ1つ丁寧に調べて、必要であれば都度メモを取っていったほうがいいと思います。

それともう一つ。プレイヤーのnbtタグを調べたとき、その結果が表示範囲内に収まりきらないことがあります。これはプレイヤーの解放されたレシピ情報すべてを表示することが主な原因で、プレイヤーのレシピを未開放状態にするコマンドを使うことで解決できる場合が多いです。

recipe take @s *

これを実行すると、当然ながらまた初めからレシピ収集をし直さなければならなくなるため、特にgamerule doLimitedCrafting trueで解放済みのレシピしかクラフトできないように設定しているワールドで遊んでいる方は、シングルで実験用のワールドを作り、そこでnbtタグを調べることを強く推奨します。
また、レシピを未開放状態にしても収まりきらない場合は、自分のインベントリやエンダーチェストの中身を空にしてみてください。


3.結果をスコアボードに記録する

さて、nbtタグを調べた後はやりたいことに合わせてやることも変わってきます。
まず調べたnbtタグの結果をそのままスコアボードに記録したい場合。
実はnbtタグは知りたいものを絞り込んで調べることができ、その結果が数字である場合、スコアボードに記録することができます。

execute at @a store result score @p Score run data get entity @p foodExhaustionLevel

このコマンドは、まずexecuteコマンドのat @aですべてのプレイヤーを対象にした後、store result score @p Scoreで対象のプレイヤーのScoreという名前のスコアボードに結果を記録するように指示したうえでdata get entity @p foodExhaustionLevelというコマンドをrun(実行)しています。
このfoodExhaustionLevelはプレイヤーの隠し満腹度の情報を持っており、このコマンドで帰ってきた数値がスコアボードに記録されます。

ちなみに今私がこのコマンドで試しに実行して帰ってきた数値は【2.397968f】でスコアボードに記録されたのは【2】でした。
これによって、スコアボードに記録されるのは整数の部分のみであるというのは見ればわかると思います。
ただ、帰ってきた数値の最後に文字がついていますね。これはデータ型というもので、マイクラだけでなくすべてのゲームやアプリなどに存在する、”情報の型枠”だと思っておけば、とりあえずマイクラ内でコマンドを使う分には支障はないと思います。nbtタグを変更する際も、仮に数値だけを指定しても型に合う範囲である限りきちんと反映されるケースがほとんどです。


4-A.nbtタグを変更する

nbtタグを変更する時も、調べるときと同じdataコマンドを使います。

data merge entity @e[type=minecraft:zombie,sort=nearest,limit=1] {Silent:1b,NoAI:1b,Tags:["marking_tag_A","marking_tag_B"]}

getだったところがmergeになり、@e[]の後にさらにカッコでくくられたnbtタグたちが書かれてます。
このコマンドによって、最寄りのゾンビSilent(無音)とNoAI(不動)が1b(有効)になり、"marking_tag_A"と"marking_tag_B"のタグが同時に追加されました。SilentとNoAIはnbtタグを書き換えることでしか変更できず、タグの追加はtagコマンドでできるものの、1度に2つ以上のタグ追加はできません。
ちなみに、summonコマンドで召喚する際も全く同じnbtタグを指定して使うことが可能で、例えば通常の火の玉と召喚された火の玉を最初からタグで区別することもできます。
また、指定されていない部分はデフォルトから変更無しとして扱われるため、変更したい部分だけ書くだけで大丈夫です。

4-B.スコアボードからnbtタグを変更する

スコアボードからnbtタグを変更する際は、nbtタグの書き方が少々特殊になります。
(dataコマンドでも一部この書き方をします。)

scoreboard players add @e[type=horse] Age 1

execute at @e[type=horse] store result entity @e[type=horse,limit=1,sort=nearest] Attributes[0].Base int 0.0005 run scoreboard players get @e[type=horse,limit=1,sort=nearest] Age

長いので簡単に要約すると、全ての馬のHPが100秒ごとに1増えていくコマンドになります。スコアボードを使っているので、Ageという名前のdummyスコアをあらかじめ用意しておく必要があります。
まず1つ目のコマンドで常時(1tick=1/20秒ごとに)馬のAgeのスコアを1増やしていき、
2つ目のコマンドでrunの結果(=現在の馬のAgeのスコア)から0.0005倍の数値をint(少数切り捨ての整数の型枠)Attributes(マイクラの能力値)の[0]番目にあるBase(基礎値)に書き込む……というものです。
ちなみにプログラムは数字を1からではなく、0から数えます。なので、感覚的にはプログラムの0番目は人間の1番目なんだ、と思っておいてください。
そして、馬のAttributeの0番目(一番最初)はHPになります。
これによって、1/20秒ごとにHPの基礎値にAgeの0.0005倍の数値が少数以下切り捨てで書き込まれるということになるのです。


5.今回のまとめ

今回は、nbtタグを調べて、どうやって活用するのかをメインに、最後はnbtタグに秘められた可能性の片鱗をお見せする意味も兼ねて、あえて難しめの例文を挙げてみました。
nbtタグはマイクラのシステムを支える重要なデータ保管庫で、対象によって持っているnbtタグは異なり、全て合わせるとものすごくたくさんの項目があります。
手を加えたい対象のnbtタグをとりあえず調べて、わからないものを攻略などで調べつつ一覧を眺めてみるだけでも、そこから突拍子もない案が思いつくことがあります。
内容が少々複雑で情報量が多い代わりに自由度が高く、制すればワールドの仕様を丸ごと自由にカスタマイズできるのが、nbtタグのすごいところなのです。
ぜひ、皆様オリジナルのnbtタグ活用法を考えてみてくださいな。

6.私が実際に使用しているコマンド実用例(有料公開)


ここから先は

1,035字

¥ 100

この記事が気に入ったらサポートをしてみませんか?