ブロックエンティティ・エンティティ・NBTストレージのNBTデータの取得・統合・編集・削除を行うことができる。
構文
/data
コマンドにはget
、merge
、modify
、remove
の4種類の構文がある。
data
コマンドではNBT操作の対象を次のように指定する。
- ブロックエンティティ:
block <対象の座標>
- エンティティ:
entity <対象>
<対象>
にはプレイヤー名、ターゲットセレクター、UUIDを指定できる。
- NBTストレージ:
storage <対象>
<対象>
にはNBTストレージの名前空間IDが指定できる。
get
- 構文
/data get (block <対象の座標>|entity <対象>|storage <対象>) [<NBTパス>] [<倍率>]
/data get
構文では、対象のNBTを取得することができる。<NBTパス>
を指定すると、特定のNBTタグのみを取得することもできる。<倍率>
を指定した場合は取得する数値が定数倍される。
merge
- 構文
/data merge (block <対象の座標>|entity <対象>|storage <対象>) [<NBT>]
/data merge
構文では、対象のNBTに<NBT>
で指定したNBTデータを「統合」することができる。「統合」の仕様の詳細は次の通り。
<NBT>
で指定されたタグのうち、対象のNBTに同名のタグが存在しないものはそのまま追加する。<NBT>
で指定されたタグのうち、対象のNBTに既に同名のタグが存在する場合は値だけを上書きする。- 値の型が Compoundの場合は例外的に、Compound内に対しても同様に「統合」の操作を行う。 Listに関しては他の値の型と同様にリストの要素がすべて新しいものに置き換えられ、元の値は削除される。
<NBT>
で指定されていないタグはそのまま維持される。
- 統合前
{
int_nbt: 1024,
bool_nbt: true,
list_nbt: ["string1", "string2"],
compound_nbt: {
float_1: 3.14,
float_2: 2.72
}
}
- コマンド
data merge ... {int_nbt: 512, list_nbt:["string3"], compound: {float_1: 6.02214076E+23, float_3: 1.602176634E-19}, byte_nbt: 16b}
- 統合後
{
int_nbt: 512,
bool_nbt: true,
list_nbt: ["string3"],
compound_nbt: {
float_1: 6.02214076E+23,
float_2: 2.72,
float_3: 1.602176634E-19
},
byte_nbt: 16b
}
modify
- 大まかな構文
/data modify <対象のパス> <操作> <取得方法>
/data modify
構文では、<対象のパス>
の位置にあるNBTデータを以下の5種類の<操作>
のうちいずれかを用いて編集できる。
prepend
- 指定の Listの先頭に取得したNBTデータを追加する。insert <番号>
- 指定の Listの<番号>-1
番目の場所に取得したNBTデータを挿入する。append
- 指定の Listの最後に取得したNBTデータを追加する。merge
- 指定の Compoundに対し取得したNBTデータを「統合」する。set
- 指定のNBTタグの値を取得した値に変更する。
操作に使用するNBTデータの<取得方法>
には以下の3種類がある。
from (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元のパス>]
- ブロックエンティティ、エンティティ、NBTストレージからNBTを取得して操作に使用する。
[<取得元のパス>]
を指定すると、特定のパスのNBTデータだけを使用できる。
- ブロックエンティティ、エンティティ、NBTストレージからNBTを取得して操作に使用する。
string (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元のパス>] [<最初の文字数>] [<最後の文字数>]
- ブロックエンティティ、エンティティ、NBTストレージの持つ特定の文字列タグまたは数値タグから
[<最初の文字数>]~[<最後の文字数>]
文字目の範囲を切り取って操作に使用する。
- ブロックエンティティ、エンティティ、NBTストレージの持つ特定の文字列タグまたは数値タグから
value <値>
- 使用するNBTデータを直接入力する。
... modify (block <targetPos>|entity <target>|storage <target>) <targetPath> ...
... append from (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元のパス>]
... append string (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元>] [<最初の文字数>] [<最後の文字数>]
... append value <値>
... insert <index> from (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元のパス>]
... insert <index> string (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元>] [<最初の文字数>] [<最後の文字数>]
... insert <index> value <値>
... merge from (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元のパス>]
... merge string (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元>] [<最初の文字数>] [<最後の文字数>]
... merge value <値>
... prepend from (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元のパス>]
... prepend string (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元>] [<最初の文字数>] [<最後の文字数>]
... prepend value <値>
... set from (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元のパス>]
... set string (block <取得元の座標>|entity <取得元>|storage <取得元>) [<取得元>] [<最初の文字数>] [<最後の文字数>]
... set value <値>
remove
- 構文
/data remove block (<取得元の座標>|entity <取得元>|storage <取得元>) [<取得元のパス>]) <NBTパス>
/data remove
構文では、対象のNBTデータのうち<取得元のパス>
指定したパスにあるタグを削除できる。
引数
<対象の座標>
:ブロック座標- NBTデータ操作の対象とするブロックエンティティの座標を指定する。
- 整数またはチルダ・キャレット表記法で表記された<x>、<y>、<z>でブロック座標を指定する。
<対象>
:エンティティ(entity <対象>
構文の場合)- NBTデータ操作の対象とするエンティティを指定する。
- プレイヤー名、ターゲットセレクターまたはUUIDで指定する。また、ターゲットセレクターは単一のものである必要がある。
<NBT>
:Compound型のNBT- 統合に使用する Compoundタグを指定する。
- SNBTフォーマットのcompound NBTで指定する。
<番号>
:32ビット整数- リストにNBTデータを挿入する際の位置を指定する。
<番号>-1
番目の位置に挿入される。 - 32ビットの整数値で指定する。また、値は-2,147,483,648以上2,147,483,647以下で指定する。
- リストにNBTデータを挿入する際の位置を指定する。
<取得元の座標>
:ブロック座標- NBTの参照元とするブロックエンティティの座標を指定する。
- 整数またはチルダ・キャレット表記法で表記された<x>、<y>、<z>でブロック座標を指定する。
<取得元>
:エンティティ(entity <取得元>
構文の場合)- NBTの参照元とするエンティティを指定する。
- プレイヤー名、ターゲットセレクターまたはUUIDで指定する。また、ターゲットセレクターは単一のものである必要がある。
<最初の文字数>
:32ビット整数- 文字列として切り取る範囲の開始地点を指定する。非負数の場合は先頭から
最初の文字数 + 1
文字目から、負数の場合は後ろから-最初の文字数
文字目から切り取りを開始する。 - 32ビットの整数値で指定する。また、値は-2,147,483,648以上2,147,483,647以下で指定する。
- 文字列として切り取る範囲の開始地点を指定する。非負数の場合は先頭から
<最後の文字数>
:32ビット整数- 文字列として切り取る範囲の終了地点を指定する。非負数の場合は先頭から
最初の文字数
文字目まで、負数の場合は後ろから-最初の文字数 + 1
文字目まで切り取りを行う。 - 32ビットの整数値で指定する。また、値は-2,147,483,648以上2,147,483,647以下で指定する。
- 文字列として切り取る範囲の終了地点を指定する。非負数の場合は先頭から
結果
コマンド | トリガー | Java Edition |
---|---|---|
任意 | 引数が正しく指定されていない | 構文解析不能 |
<対象の座標> が読み込み範囲外・ワールド外 | 失敗 | |
<対象の座標> にあるブロックがブロックエンティティでない | ||
entity ... モードで、<対象> に対応するエンティティが一人もいないか、逆に複数検出された | ||
/data get ... | タグが複数取得された | |
/data get ... <path> | <NBTパス> にタグが存在しない場合 | |
/data get ... <path> <scale> | 取得したタグが数値タグでない | |
/data merge ... | 変更点がない | |
プレイヤーのデータを編集しようとした | ||
/data remove ... | <NBTパス> が最上位の Compoundタグである | |
/data modify ... (from|string) block ... | <取得元の座標> がワールド外または読み込み範囲外である | |
<取得元の座標> のブロックがブロックエンティティでない | ||
/data modify ... (from|string) entity ... | <取得元> に対応するエンティティが一人もいないか、逆に複数検出された | |
/data modify ... (from|string) ... <取得元> | <取得元のパス> にタグが存在しない場合 | |
/data modify ... append ... | 対象のタグが Listでない場合 | |
参照元のデータ型がリストに追加できる型でない場合 | ||
/data modify ... string ... <取得元のパス> <start> <end> | <取得元のパス> にあるタグが文字列でないか、文字列への変換が不能な場合 | |
<最初の文字数> や<最後の文字数> が0~231-1の範囲外の場合 | ||
<最初の文字数> が<最後の文字数> より大きい場合 | ||
<end> が文字列長より大きい場合 | ||
/data modify ... insert <番号> ... | <番号> が無効な場合 | |
/data modify ... merge ... | 指定のパスに Compoundタグがない場合 | |
参照元のデータが Compoundタグでない場合 | ||
任意 | 成功時 | NBTデータを取得、併合、編集、削除する。 |
出力
コマンド | エディション | 状況 | 成功回数 | /execute store success ... | /execute store result ... |
---|---|---|---|---|---|
任意 | Java Edition | 失敗時 | 0 | 0 | 0 |
/data get ... | 成功時 | 1 | 1 | 1 | |
/data get ... <NBTパス> | 数値タグが取得された場合 | 1 | 1 | 取得した数値の小数部分を切り捨てた値 | |
Listタグが取得された場合 | 1 | 1 | リストの要素数 | ||
Stringタグが取得された場合 | 1 | 1 | 文字列の文字数 | ||
Compoundタグが取得された場合 | 1 | 1 | そのCompoundタグの一階層下の要素数 | ||
/data get ... <NBTパス> <倍率> | 成功時 | 1 | 1 | 取得した値を<倍率> 倍し、小数部分を切り捨てた値 | |
/data merge ... | 成功時 | 1 | 1 | 1 | |
/data remove ... | 成功時 | 1 | 1 | 1 | |
/data modify ... append ... | 成功時 | 1 | 1 | リストに新しく追加された要素数 | |
/data modify ... set ... | 成功時 | 1 | 1 | 編集に成功したタグの数 | |
/data modify ... merge ... | 成功時 | 1 | 1 | 編集に成功したCompoundタグの数 |
使用例
- 実行者の隠し満腹度を取得する:
/data get entity @s foodSaturationLevel
- 10ブロック以内に落ちているアイテムのうち最も近いものをプレイヤーが拾えないようにする:
/data modify entity @e[type=item,distance=..10,limit=1,sort=nearest] PickupDelay set value -1
- 落ちているアイテムのうちランダムで選んだ1つのY座標を取得する:
/data get entity @e[type=item,limit=1,sort=random] Pos[1]
- 最も近くにいるプレイヤーのホットバーの一番左のアイテムのIDを取得する:
/data get entity @p Inventory[{Slot:0b}].id
- 座標(0, 64, 0)から最も近いイルカの防御力を20に設定する:
/data modify entity @e[x=0,y=64,z=0,type=dolphin,limit=1] Attributes[{Name:"generic.armor"}].Base set value 20
- 座標(1, 64, 1)にあるチェストの最初のスロットをダイヤモンドブロックに変更する(元々そのスロットにあったアイテムのNBTデータも引き継ぐ):
/data modify block 1 64 1 Items[0].id set value "minecraft:diamond_block"
- 最も近いゾンビが、死亡時に左手のアイテムを80%の確率で、右手のアイテムの0%の確率でドロップように設定する:
/data merge entity @e[type=zombie,limit=1,sort=nearest] {HandDropChances: [0f, 0.8f]}
- 最も近いゾンビが、死亡時に左手のアイテムを80%の確率でドロップするように設定する。右手のアイテムの確率は変更しない:
/data modify entity @e[type=zombie,limit=1,sort=nearest] HandDropChances[1] set value 0.8f
NBTストレージ
NBTストレージは、コマンドで読み込むためのNBTを保存しておくために使用できるシステムである。これを使用することで、NBT保存用の代理のブロックエンティティやエンティティを立てることなくNBTを保存・読み込みできる。
NBTストレージはワールドごとに管理されており、一つのワールドに対して目的別に複数のストレージを立てることが可能である。それぞれのNBTストレージは名前空間付IDで区別されるため、目的にあったID、名前空間に設定し分けることができる。
NBTストレージには/data merge
、/data remove
、/execute store
で書き込むことができる。この際まだ存在しないIDを指定して実行すると、そのNBTストレージが作成される。
そしてNBTストレージに書き込んだNBTデータは/data get
、/data modify
、マクロ関数実行時の/function
コマンド、JSONテキストの nbtから読み込み、使用することができる。
ワールド1つにつき、NBTストレージは2304個まで保存できる。
歴史
Java Edition | |||||
---|---|---|---|---|---|
1.13 | 17w45b | /data が追加された。 | |||
17w47a | コマンド /blockdata と /entitydata が削除され /data に併合された。 | ||||
18w03a | パスを指定した/data get (block|entity|storage) で、数字でない値も取得できるようになった。 | ||||
1.14 | 18w43a | /data modify (block|entity|storage) が追加された。 | |||
1.15 | 19w38a | NBTストレージが対象・参照元に使用できるようになった。 | |||
1.19.4 | 23w03a | string が参照方式として追加された。 | |||
1.20 | Pre-release 1 | string 構文において、負の値を指定した場合に末尾から数えた場所の値を指定したものとして見做されるようになった。 |