看板によるJSON操作

ページ名:看板によるJSON操作

はじめに

JSONにスコアやentity名、nbtを用いる場合、tellrawや本、看板では正しく変換されますが
それ以外では何も表示されません。

例えば
scoreboard players set #10 Number 10 として

・tellraw
tellraw @s [{"text":"スコア: "},{"score":{"name":"#10","objective":"Number"}}]
→ 「スコア: 10」

・看板
data modify block 0 0 0 Text1 set value '[{"text":"スコア: "},{"score":{"name":"#10","objective":"Number"}}]'
→ 「スコア: 10」

・エンティティのCustomName
data modify entity @s CustomName set value '[{"text":"スコア: "},{"score":{"name":"#10","objective":"Number"}}]'
→ 「スコア: 」

のようにCustomNameではスコアが抜け落ちてしまいます。
そこで一度看板でJSONを正しく変換させた後、それをCustomNameにコピーするという手順が必要になります。
もちろんtextのみの場合は直接CustomNameに代入して問題ありません。


看板の設置

看板はスポーンチャンク周辺の常時読み込まれている場所に1枚設置します。
Text1~4の4行同時に使えるので、ほとんどの場合1枚で事足ります。
ここでは座標を0 0 0とします。

看板の編集

data modify block 0 0 0 Text1 set value '<JSON>'
で看板にJSONを代入します。
JSONはここでcolorなどの装飾も行い、後はコピーするだけの状態にします。
実際に看板の文字を見て正しく代入できているか確認できます。
 

/data modifyコマンドの実行座標に関わらず、JSON変換時の座標は看板の座標になります。
相対座標は分かりにくくなるのでブロックの座標は絶対座標を推奨します。

data modify block 0 0 0 Text1 set value '{"selector":"@p[distance=..16]"}'
→看板から16m以内のプレイヤー

data modify block 0 0 0 Text1 set value '{"block":"~ ~1 ~","nbt":"Items[0].id"}'
→看板の~ ~1 ~のブロック

JSONのコピー

・CustomName

data modify entity @s CustomName set from block 0 0 0 Text1

・x y zのシュルカーボックス0番目にあるアイテムのName

data modify block x y z Items[0].tag.display.Name set from block 0 0 0 Text1

・x y zのシュルカーボックス0番目にあるアイテムのLore
LoreはJSONのリストですので、空リストにappendする、もしくはリストのn番目をsetします。

data modify block x y z Items[0].tag.display.Lore set value []
data modify block 0 0 0 Text1 set value '<1行目のJSON>'
data modify block x y z Items[0].tag.display.Lore append from block 0 0 0 Text1
data modify block 0 0 0 Text1 set value '<2行目のJSON>'
data modify block x y z Items[0].tag.display.Lore append from block 0 0 0 Text1
...

JSONの結合

看板のJSONにおいてText1自身を指定することでJSONを結合することができます。
nbtでJSONを指定する際、interpret:trueとするとJSONの変換後の内容になります。

data modify block 0 0 0 Text1 set value '{"text":"あ"}'
data modify block 0 0 0 Text1 set value '[{"nbt":"Text1","block":"0 0 0","interpret":true},{"text":"い"}]'
data modify block 0 0 0 Text1 set value '[{"nbt":"Text1","block":"0 0 0","interpret":true},{"text":"う"}]'
→ あいう

 

ループfunctionを組むことで任意長のJSONリスト型のカスタムnbtを結合させることも可能です。

#JSONリストをセット
data modify storage json:data Raw set value ['{"text":"あ"}','{"text":"い"}','{"text":"う"}','{"text":"え"}','{"text":"お"}']

init function

#Text1を空に
data modify block 0 0 0 Text1 set value '{"text":""}'

function loop


loop function

#JSONを看板で結合
data modify block 0 0 0 Text1 set value '[{"nbt":"Text1","block":"0 0 0","interpret":true},{"nbt":"Raw[0]","storage":"json:data","interpret":true}]'
#0番目を削除
data remove storage json:data Raw[0]
#ループ
execute if data storage json:data Raw[0] run function loop

 


JSONをnbtに保存して共通化

これまでは看板に代入するJSONはコマンドから入力していましたが、カスタムnbtから取得することでコマンド数を削減できます。

・アイテムのNameをカスタムnbtで管理

#アイテムをストレージにセット
data modify storage item:data Item set value {id:"minecraft:iron_sword",Count:1b,tag:{NameJSON:'[{"selector":"@p"},{"text":"の剣"}]'}}
#JSONを看板に
data modify block 0 0 0 Text1 set value '{"nbt":"Item.tag.NameJSON","storage":"item:data","interpret":true}'
#看板からNameへ
data modify storage item:data Item.tag.display.Name set from block 0 0 0 Text1

・アイテムのLoreをカスタムnbtで管理

JSONリストを1行ずつLoreにappendするfunctionを作ることで任意行のLoreにも対応可能です。

#アイテムをストレージにセット
data modify storage item:data Item set value {id:"minecraft:iron_sword",Count:1b,tag:{FireDamage:20,ColdDamage:30,LoreJSON:['{"text":"炎と氷の属性を帯びた剣","color":"white"}','[{"text":"炎ダメージ: ","color":"red"},{"nbt":"Item.tag.FireDamage","storage":"item:data","color":"red"}]','[{"text":"氷ダメージ: ","color":"aqua"},{"nbt":"Item.tag.ColdDamage","storage":"item:data","color":"aqua"}]']}}

init function

#LoreJSONをコピー
data modify storage lore:data LoreJSON set from storage item:data Item.tag.LoreJSON
#空のLoreを生成
data modify storage item:data Item.tag.display.Lore set value []

function loop


loop function

#JSONを看板に
data modify block 0 0 0 Text1 set value '{"nbt":"LoreJSON[0]","storage":"lore:data","interpret":true}'
#看板からLoreへ
data modify storage item:data Item.tag.display.Lore append from block 0 0 0 Text1
#0番目を削除
data remove storage lore:data LoreJSON[0]
#ループ
execute if data storage lore:data LoreJSON[0] run function loop

シェアボタン: このページをSNSに投稿するのに便利です。

コメント

返信元返信をやめる

※ 悪質なユーザーの書き込みは制限します。

最新を表示する

NG表示方式

NGID一覧