【Minecraft】特殊な本や看板で使う『JSON』をマスターしよう!その⑥

みなさん、こんにちは!
赤石大好き!赤石愛です。

その① JSON・text・基本装飾・真偽値 →ar857358
その② clickEvent・オブジェクト・数字と数値・エスケープシーケンス →ar923853
その③ hoverEvent・selector・score →ar923855
その④ リスト・extra・translate →ar923861
その⑤ エスケープシーケンス(改行・Unicode) →ar924533
おまけ 本や看板での使用例 →ar924964
その⑥ keybind・nbt・NBTパス →このページ


前回までの記事作成時点では実装されていなかった2つの機能を紹介します。


キー設定の取得

操作設定で割り当てたキーを取得する機能を紹介します。

keybind1.12+(キーバインド)
操作設定を変えている人も多いですが、keybindを使えば、プレイヤーに合った表示に変えることができます。

/tellraw @p {"translate":"スニークするには%sを押します。","with":[{"keybind":"key.sneak"}]}

スニークの操作設定を変えていない場合は次のように表示されますが、

スニークの操作設定をマウスのサイドボタンに変えている場合は次のような表示になります。

キー設定の一覧を載せておきます。

keybind 操作名 初期設定
移動
key.jump ジャンプ スペース
key.sneak スニーク 左シフト
key.sprint ダッシュ スペース
key.forward 前進 w
key.right d
key.left a
key.back 後退 s
ゲームプレイ
key.use アイテムの使用/ブロックの設置 右ボタン
key.pickItem ブロック選択 中央ボタン
key.attack 攻撃する/壊す 左ボタン
インベントリ
key.drop アイテムを捨てる q
key.inventory イベントりの開閉 e
key.hotbar.1-9 ホットバースロット 1-9 1-9
key.swapHands 持っているアイテムの切り替え f
クリエイティブモード
key.saveToolbarActivator ホットバーの保存 c
key.loadToolbarActivator ホットバーの読み込み x
マルチプレイ
key.command コマンドラインを開く /
key.chat チャットを開く t
key.playerlist プレイヤーリストの表示 タブ
その他
key.smoothCamera カメラ動作の切り替え  
key.screenshot スクリーンショットの撮影 F2
key.fullscreen フルスクリーンの切り替え F11
key.spectatorOutlines プレイヤーの強調表示(スペクテイター)  
key.togglePerspective 視点の切り替え F5
key.advancements 進捗 l

 


NBTの取得

ブロック・エンティティ・ストレージが持つNBTを取得する機能を紹介します。

block1.14+(ブロック)
NBTを取得したいブロックの座標を指定します。後述のnbtと一緒に使います。
絶対座標だけでなく、相対座標やローカル座標も使えます。
座標の解説はここではしません。

"block":"10 20 30" (絶対座標)
"block":"~ ~-1 ~2" (絶対座標)
"block":"10 ~ 10" (絶対座標と相対座標)
"block":"^ ^ ^5" (ローカル座標)


entity1.14+(エンティティ)
NBTを取得したいエンティティをセレクターかUUIDで指定します。後述のnbtと一緒に使います。

"entity":"@s" (セレクター)
"entity":"0-0-0-0-0" (UUID)


storage1.15+(ストレージ)
NBTを取得したいストレージを指定します。後述のnbtと一緒に使います。
ストレージの解説はここではしません。

"storage":"test:data"


nbt1.14+(エヌビーティー)
取得するNBTのパスを指定します。前述のblock・entity・storageのいずれかと一緒に使います。
どの場合でも使い方は変わらないため、ここではentityで説明します。
次のような、金床で名前を付けたダイヤ剣があるとします。

この剣を手に持った状態で、次のコマンドを実行してみましょう。

/tellraw @s {"entity":"@s","nbt":"SelectedItem"}

実行すると、次のように表示されましたね。

{id:"minecraft:diamond_sword",Count:1b,tag:{RepairCost:0,Damage:0,display:{Name:'{"text":"アイスソード"}'}}}

entityで指定した『@s』は『自分自身』、nbtで指定した『SelectedItem』は『利き手に持っているアイテム』なので、手に持っているダイヤ剣のNBTが全て表示されました。

次のコマンドを実行してみましょう。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.Count"}

次のように表示されますね。

1b

nbtの指定が『SelectedItem.Count』になっています。
これは、先ほど表示されたNBTのCountの部分ですね。
nbtに『SelectedItem.Count』を指定すると、『「利き手に持っているアイテム」の「個数」』を取得できました。
このように、NBTの更に詳細な部分を取得するには、「.」で繋げて指定します。

では、金床で付けた名前を取得したい時は、どのようなコマンドになるでしょうか。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.display.Name"}

このようになります。
『「利き手に持っているアイテム(SelectedItem)」の「NBTタグ(tag)」にある「表示用データ(display)」の「名前(Name)」』を取得したいので、『SelectedItem.tag.display.Name』を指定しています。
これを実行すると、次のように表示されますね。

あれ?JSONになっていますね。
アイテム名の「アイスソード」だけを表示することはできないのでしょうか?
そんな時には、次に紹介するものと一緒に使います。

interpret1.14+(インタープリット)
nbtで取得したJSONを更に変換するかどうかを指定します。
次のコマンドを実行してみましょう。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.display.Name","interpret":true}

先ほどのJSONが更に変換されて、

とだけ表示されましたね。
なお、他の装飾と併用できるため、アイテム欄で見た時のように斜体にしたい時は、

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.display.Name","interpret":true,"italic":true}

このように一緒に指定するだけです。


NBTパス

nbtの指定に使ったNBTパスをついでに解説します。

次のような変わったアイテムを手に持っているとします。

/tellraw @s {"entity":"@s","nbt":"SelectedItem"}
{id:"minecraft:diamond_sword",Count:1b,tag:{RepairCost:0,Damage:0,"ねんがんの アイスソードをてにいれたぞ!":["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"],display:{Name:'{"text":"アイスソード"}'}}}


基本は「.」で繋ぐだけ
更に中の要素を取得するときは、「.」で繋ぎます。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag"}
{RepairCost:0,Damage:0,"ねんがんの アイスソードをてにいれたぞ!":["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"],display:{Name:'{"text":"アイスソード"}'}}


エラーになる要素は「"」で囲む
スペースが入っている場合など、そのままではエラーになるものを指定するときは、「"」で囲みます。
もちろん、「"」の中で「"」を使う場合は、エスケープした「\"」に変えます。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.\"ねんがんの アイスソードをてにいれたぞ!\""}
["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"]


リストの何番目
リストの中の何番目かを取り出す時は、『』を付けて、その中に何番目かを指定します。
ただし、最初は0番目、次が1番目、……と数えます。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.\"ねんがんの アイスソードをてにいれたぞ!\"[1]"}
殺してでも うばいとる


リストの後ろから何番目
後ろから数えて取り出す時は、番号に「-」を付けます。
一番後ろは-1、後ろから2番目は-2、……と指定します。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.\"ねんがんの アイスソードをてにいれたぞ!\"[-1]"}
ゆずってくれ たのむ!!


リストの中の全て
何番目かを指定しない場合、リストの中のものが列挙されます。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.\"ねんがんの アイスソードをてにいれたぞ!\""}
そう かんけいないね, 殺してでも うばいとる, ゆずってくれ たのむ!!


この剣を色んな剣と一緒に適当にシュルカーボックスに入れて、それを利き手に持ったとします。

箱の中のアイテムは、tag.BlockEntityTag.Itemsに入っています。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.BlockEntityTag.Items"}
[{Slot:0b,id:"minecraft:stone_sword",Count:1b,tag:{Damage:0}},{Slot:1b,id:"minecraft:netherite_sword",Count:1b,tag:{Damage:0}},{Slot:2b,id:"minecraft:diamond_sword",Count:1b,tag:{RepairCost:0,Damage:0,"ねんがんの アイスソードをてにいれたぞ!":["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"],display:{Name:'{"text":"アイスソード"}'}}},{Slot:3b,id:"minecraft:golden_sword",Count:1b,tag:{Damage:0}},{Slot:4b,id:"minecraft:diamond_sword",Count:1b,tag:{Damage:0}},{Slot:5b,id:"minecraft:wooden_sword",Count:1b,tag:{Damage:0}},{Slot:6b,id:"minecraft:iron_sword",Count:1b,tag:{Damage:0}},{Slot:7b,id:"minecraft:wooden_sword",Count:1b,tag:{Damage:0}},{Slot:8b,id:"minecraft:netherite_sword",Count:1b,tag:{Damage:0}},{Slot:9b,id:"minecraft:iron_sword",Count:1b,tag:{Damage:0}},{Slot:10b,id:"minecraft:golden_sword",Count:1b,tag:{Damage:0}},{Slot:11b,id:"minecraft:stone_sword",Count:1b,tag:{Damage:0}}]


リストの中の特定のもの
リストの中がタグの場合、その一部を指定すると、一致するタグだけ列挙されます。
アイテムが入っているリストでダイヤ剣だけを指定する場合なら、

[{id:"minecraft:diamond_sword"}]

のように指定します。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.BlockEntityTag.Items[{id:\"minecraft:diamond_sword\"}]"}
{Slot:2b,id:"minecraft:diamond_sword",Count:1b,tag:{RepairCost:0,Damage:0,"ねんがんの アイスソードをてにいれたぞ!":["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"],display:{Name:'{"text":"アイスソード"}'}}}, {Slot:4b,id:"minecraft:diamond_sword",Count:1b,tag:{Damage:0}}


列挙したものの中の要素
列挙する指定に続けて「.」で要素をつなぐと、その要素だけ列挙したものになります。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.BlockEntityTag.Items[{id:\"minecraft:diamond_sword\"}].tag"}
{RepairCost:0,Damage:0,"ねんがんの アイスソードをてにいれたぞ!":["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"],display:{Name:'{"text":"アイスソード"}'}}, {Damage:0}


条件を満たす要素
条件を付けて要素を絞り込むこともできます。
displayタグを持つtagだけに絞り込むなら、

tag{display:{}}

のように指定します。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.BlockEntityTag.Items[{id:\"minecraft:diamond_sword\"}].tag{display:{}}"}
{RepairCost:0,Damage:0,"ねんがんの アイスソードをてにいれたぞ!":["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"],display:{Name:'{"text":"アイスソード"}'}}


列挙したらバラバラ
列挙したものは、もうリストではありません。
箱の中に同じ剣をもう1本入れておきます。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.BlockEntityTag.Items[{id:\"minecraft:diamond_sword\"}].tag{display:{}}"}
{RepairCost:0,Damage:0,"ねんがんの アイスソードをてにいれたぞ!":["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"],display:{Name:'{"text":"アイスソード"}'}}, {RepairCost:0,Damage:0,"ねんがんの アイスソードをてにいれたぞ!":["そう かんけいないね","殺してでも うばいとる","ゆずってくれ たのむ!!"],display:{Name:'{"text":"アイスソード"}'}}

これは2つのアイテムですが、リストではないので、2つ目だけを指定したりはできません。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.BlockEntityTag.Items[{id:\"minecraft:diamond_sword\"}].tag{display:{}}[1]"}
 

次のコマンドは最後をみると1つだけ選んでいるように見えますが、列挙されたものにバラバラに実行されるため、結果は2つのままです。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.BlockEntityTag.Items[{id:\"minecraft:diamond_sword\"}].tag{display:{}}.\"ねんがんの アイスソードをてにいれたぞ!\"[0]"}
そう かんけいないね, そう かんけいないね

バラバラのバラバラバラはバラバラバラバラバラバラです。

/tellraw @s {"entity":"@s","nbt":"SelectedItem.tag.BlockEntityTag.Items[{id:\"minecraft:diamond_sword\"}].tag{display:{}}.\"ねんがんの アイスソードをてにいれたぞ!\"[]"}
そう かんけいないね, 殺してでも うばいとる, ゆずってくれ たのむ!!, そう かんけいないね, 殺してでも うばいとる, ゆずってくれ たのむ!!

 



記事の更新がやっとできました。
必要な時にまた見に来てくださいね。