指令/infobox
允許玩家取得、修改、合併或是移除實體或方塊的資料標籤。其中,修改資料標籤可以是將一個標籤的值設為和另一個方塊或實體的某個標籤的值相同,或者在一個列表中插入值,或者直接修改為一個具體的數值。
- 語法
/data有四個子指令(get,merge,modify,remove),每個子指令提及的目標或源都是block <目标方块坐标>或entity <目标>。
data get block <目标方块坐标> [<路径>] [<倍率>]data get entity <目标实体> [<路径>] [<倍率>]data merge block <目标方块坐标> <nbt>data merge entity <目标实体> <nbt>data modify block <目标方块坐标> <目标路径> (append|insert <索引>|merge|prepend|set) from block <源方块坐标> <路径>data modify block <目标方块坐标> <目标路径> (append|insert <索引>|merge|prepend|set) from entity <源实体> <路径>data modify block <目标方块坐标> <目标路径> (append|insert <索引>|merge|prepend|set) value <nbt>data modify entity <目标实体> <目标路径> (append|insert <索引>|merge|prepend|set) from block <源方块坐标> <路径>data modify entity <目标实体> <目标路径> (append|insert <索引>|merge|prepend|set) from entity <源实体> <路径>data modify entity <目标实体> <目标路径> (append|insert <索引>|merge|prepend|set) value <值>data remove block <目标方块坐标> <目标路径>data remove entity <目标实体> <路径>
- 語法樹狀圖
簡化的語法樹:
詳細的語法樹: /data… get… block <目标方块坐标> [<路径>] [<倍率>]… entity <目标实体> [<路径>] [<倍率>]
… merge… block <目标方块坐标> <nbt>… entity <目标实体> <nbt>
… modify… block <目标方块坐标> <目标路径> (append|insert <索引>|merge|prepend|set)… from… block <源方块坐标> [<源路径>]… entity <源实体> [<源路径>]
… value <值>
… entity <目标实体> <目标路径> (append|insert <索引>|merge|prepend|set)… from… block <源方块坐标> [<源路径>]… entity <源实体> [<源路径>]
… value <值>
… remove… block <源方块坐标> [<源路径>]… entity <源实体> [<源路径>]
壓縮的語法樹:
一行版: /data (get (block <目标方块坐标>|entity <目标实体>) [<路径>] [<倍率>]|merge (block <目标方块坐标>|entity <目标实体>) <nbt>|modify (block <目标方块坐标>|entity <目标实体>) (append|insert <索引>|merge|prepend|set) (from (block <源方块坐标>|entity <源实体>) <源路径>|value <值>)|remove (block <目标方块坐标>|entity <源实体>) <路径>)
- 參數
(block <目标方块坐标>|entity <目标实体>):
<目标方块坐标>—指定需要取得、修改、合併或移除資料標籤的方塊的<x> <y> <z>座標。<目标实体>—指定需要取得、修改、合併或移除資料標籤的目標實體,可以是一個合法的UUID或目標選擇器。
get . . . [<路径>] [<倍率>]:
<路径>—指定檢索特定NBT的合法的路徑名。<倍率>—縮放獲得的NBT具體數值。
merge . . . <nbt>:
<nbt>—Compound標籤。最簡單的合法輸入是{}。
modify . . . <目标路径> (append|insert <索引>|merge|prepend|set):
<目标路径>—指定修改特定NBT的合法的路徑名。<索引>—指定列表中元素的索引的有效整數。
… from (block <源方块坐标>|entity <源实体>) <源路径>:
<源方块坐标>—指定需要取得、修改、合併或移除資料標籤的方塊的<x> <y> <z>座標。<源实体>—指定需要取得、修改、合併或移除資料標籤的作為NBT來源的實體,可以是一個合法的UUID,玩家名或目標選擇器。<源路径>—指定修改特定NBT的來源的合法的路徑名。
… value <值>:
<值>—一般是修改目標NBT要使用的數值。必須符合資料類型。
remove . . . <路径>:
<路径>—指定刪除NBT的合法的路徑名。
- 效果
- 當參數沒有被正確指定時失敗。(若目標實體的選擇器沒有規定實體數量為1,則是指令語法錯誤而非執行失敗。)
- 若成功:
/data get-
/data get . . .- 返回指定位置的方塊或單個目標實體的NBT資料,並且帶有語法高亮。
- 若適用,成功時的回傳值為1。
/data get . . . <路径>- 返回指定位置的方塊或單個目標實體的一部分NBT資料,並且不帶有語法高亮。
- 回傳值取決於請求的NBT元素的類型。
- 請求一個數字,則回傳值為數字。
- 請求一個字串,則返回該字串的長度。
- 請求一個列表會返回該列表中元素的個數。
- 請求一個Compound標籤會返回該標籤下一級子元素(不包括子元素的子元素)的數量。
/data get . . . <路径> <倍率>- 返回該標籤的數值並乘<倍率>。
- 此時<路徑>需要指向一個數字類型的標籤,即該標籤的類型可以為TAG_byte,TAG_short,TAG_int,TAG_long,TAG_float或TAG_double。
/data merge- 將從源方塊座標或源實體的特定NBT資料合併到目標。
- 若適用,成功時的回傳值為1。
/data modify-
append- 在指向的列表的末尾增加一個元素。
<目标路径>必須指定一個TAG_list類型的元素,源資料應該符合該列表中元素的類型。insert <索引>- 將資料以第
<索引>個元素插入指向的列表,其後的元素的編號自動加一。 <目标路径>必須指定一個TAG_list類型的元素,源資料應該符合該列表中元素的類型。merge- 將源資料與指定的元素合併。
<目标路径>必須指定一個TAG_list類型的元素,源資料必須是TAG_compound類型。prepend- 在指向的列表的開頭增加一個元素。
<目标路径>必須指定一個TAG_list類型的元素,源資料應該符合該列表中元素的類型。set- 將
<目标路径>特指的標籤設定為源資料。
/data remove- 移除指定位置的方塊或單個目標實體指定路徑的NBT資料。無法移除玩家的NBT資料。
- 若適用,成功時的回傳值為1。
NBT路徑
NBT路徑是一個描述性的標識,用於從一個NBT資料樹中特定任意元素。一個路徑通常以superTag.childTag.childTag……parentTag.tag的形式存在。此處tag是被指定的標籤,superTag是其中一個最外層的標籤。
每個鍵之後可以給出一個NBT對象來與那個標籤的值比較。標籤僅當比較存在正的結果時被路徑作為對象。
當從列表中定義一個元素時,方括號被用在列表後的鍵。方括號內的內容可以是以下三種的任意一種:
- 什麼都不填—將會返回列表中的每一個元素。[note 1]
- 一個索引數字—對於一個非負索引n,會返回列表中的第(n+1)個元素。對於一個負的索引n,會從列表結尾開始,往前取第n個元素。
- 一個NBT複合標籤—會返回所有含有方括號內NBT標籤的對象。
一個路徑的合法的字元集似乎是所有的非空字元,只要所有的未閉合的方括號和花括號([和{)被正確閉合,並位於每一項的結尾即可。(即其後只有一個句點或路徑的結尾—.或 )。也就是說,定義一個資料標籤的合理的字元集是a-z A-Z 0-9 _ . [ ] { }(用正則表達式表示就是[][}{a-zA-Z0-9.]*)。如果一個鍵的名字中存在空格,可以用雙引號括起來。
示例
- 取得所有生物的所有資料:
execute as @e run data get entity @s - 取得自己的物品欄中的第一個物品資料:
data get entity @s Inventory[0] - 取得隨機一個骷髏的裝備資料:
data get entity @e[type=skeleton,sort=random,limit=1] ArmorItems - 將所有的羊染成白色:
execute as @e[type=sheep] run data merge entity @s {Color:0b}或者execute as @e[type=sheep] run data modify entity @s Color set value 0b - 將除玩家之外的所有生物設為不可摧毀(被創造模式玩家摧毀除外):
execute as @e run data merge entity @s {Invulnerable:1b}或execute as @e run data modify entity @s Invulnerable set value 1b,由於不能修改玩家的資料,所以玩家會被自動過濾掉,故選擇器無需再加入type=!player。
Foo bar示例
/data get entity @p foo.bar[0]."A [crazy name]!".baz
以上NBT路徑中的名字僅用於演示用途,是隨機挑選的。
foo—指定第一級元素,叫做「foo」。foo.bar—指定foo的子元素,叫做「bar」。假設這是一個列表。foo.bar[0]—指定列表「bar」的第一個元素。foo.bar[0]."A [crazy name]!"—指定這個列表中第一個元素下的子元素,名為「A [crazy name]!」。foo.bar[0]."A [crazy name]!".baz—指定上述意義不明的元素下的子元素「baz」。foo.bar[]—指定列表「bar」中的所有元素。foo.bar[].baz—指定列表「bar」中所有元素的子元素「baz」。foo.bar[{baz:5b}]—指定「bar」列表中所有「baz」標籤被設定為5b的元素。{}—指定目標實體或方塊的根標籤。{foo:4.0f}—在「foo」標籤被設定為4.0f時指定目標實體或方塊的根標籤。foo{bar:"baz"}—指定標籤「foo」,如果其子標籤「bar」的值為"baz"。foo{bar:"baz"}.bar—指定標籤「bar」,如果其值為"baz"。
樹狀結構示意
- 該實體的根標籤。
- foo: 元素「foo」。
- bar: 元素「bar」。
- 列表「bar」的第一個元素。
- A [crazy name]!: 元素「A [crazy name]!」。
- baz: 元素「baz」,此示例中的目標元素。
- A [crazy name]!: 元素「A [crazy name]!」。
- 另一個列表「bar」中的不相關的元素。
- 列表「bar」的第一個元素。
- bar: 元素「bar」。
- foo: 元素「foo」。
箱中書
/data get block ~ ~ ~ Items[1].tag.pages[3]
某玩家寫了一本書,將其放在了腳下的儲物箱裡。她要一步步嘗試拆解這條指令,最終執行上述指令。
聊天欄記錄 * Alex跳上了箱子。 * Alex运行命令: /data get block ~ ~ ~ 0, 55, 0拥有以下方块数据:{x: 0, y: 55, z: 0, Items: [{Slot: 0b, id: "clock", Count: 1b}, {Slot: 9b, id: "written_book", Count: 1b, tag: {pages: ['{"text":"\'twas brillig and the slithy toves"}', '{"text":"Did gyre and gimble in the wabe."}', '{"text":"All mimsy were the borogoves,"}', '{"text":"And the mome raths outgrabe."}'], author: "LewisCarroll", title: "Jabberwocky"}}], id: "chest"} * Alex只想看看这个箱子的物品栏。虽然她可以搜一搜中文Minecraft Wiki来获取那个标签的名字,但由于她知道如何阅读NBT格式,她决定从上个命令的输出中把它弄明白。 * Alex运行命令: /data get block ~ ~ ~ Items 0, 55, 0拥有以下方块数据:{x: 0, y: 55, z: 0, Items: [{Slot: 0b, id: "clock", Count: 1b}, {Slot: 9b, id: "written_book", Count: 1b, tag: {pages: ['{"text":"\'twas brillig and the slithy toves"}', '{"text":"Did gyre and gimble in the wabe."}', '{"text":"All mimsy were the borogoves,"}', '{"text":"And the mome raths outgrabe."}'], author: "LewisCarroll", title: "Jabberwocky"}}], id: "chest"} * Alex想把输出范围缩减到箱子内的第二个物品。她从0开始数,得出第二个物品是元素1。 * Alex运行命令: /data get block ~ ~ ~ Items[1] 0, 55, 0拥有以下方块数据:{x: 0, y: 55, z: 0, Items: [{Slot: 0b, id: "clock", Count: 1b}, {Slot: 9b, id: "written_book", Count: 1b, tag: {pages: ['{"text":"\'twas brillig and the slithy toves"}', '{"text":"Did gyre and gimble in the wabe."}', '{"text":"All mimsy were the borogoves,"}', '{"text":"And the mome raths outgrabe."}'], author: "LewisCarroll", title: "Jabberwocky"}}], id: "chest"} * Alex只想要标签“tag”。 * Alex运行命令: /data get block ~ ~ ~ Items[1].tag 0, 55, 0拥有以下方块数据:{x: 0, y: 55, z: 0, Items: [{Slot: 0b, id: "clock", Count: 1b}, {Slot: 9b, id: "written_book", Count: 1b, tag: {pages: ['{"text":"\'twas brillig and the slithy toves"}', '{"text":"Did gyre and gimble in the wabe."}', '{"text":"All mimsy were the borogoves,"}', '{"text":"And the mome raths outgrabe."}'], author: "LewisCarroll", title: "Jabberwocky"}}], id: "chest"} * Alex只想要标签“pages”。 * Alex运行命令: /data get block ~ ~ ~ Items[1].tag.pages 0, 55, 0拥有以下方块数据:{x: 0, y: 55, z: 0, Items: [{Slot: 0b, id: "clock", Count: 1b}, {Slot: 9b, id: "written_book", Count: 1b, tag: {pages: ['{"text":"\'twas brillig and the slithy toves"}', '{"text":"Did gyre and gimble in the wabe."}', '{"text":"All mimsy were the borogoves,"}', '{"text":"And the mome raths outgrabe."}'], author: "LewisCarroll", title: "Jabberwocky"}}], id: "chest"} * Alex只想要这个列表的第四个元素。 * Alex运行命令: /data get block ~ ~ ~ Items[1].tag.pages[3] 0, 55, 0拥有以下方块数据:{x: 0, y: 55, z: 0, Items: [{Slot: 0b, id: "clock", Count: 1b}, {Slot: 9b, id: "written_book", Count: 1b, tag: {pages: ['{"text":"\'twas brillig and the slithy toves"}', '{"text":"Did gyre and gimble in the wabe."}', '{"text":"All mimsy were the borogoves,"}', '{"text":"And the mome raths outgrabe."}'], author: "LewisCarroll", title: "Jabberwocky"}}], id: "chest"} * Alex达到了她的目的。她想使用在箱子外部搞出来的NBT路径来编辑这本书。 * Alex运行命令: /data modify block ~ ~ ~ Items[1].tag.pages[3] set value '{"text":"And this pig here\'s named Babe."}' 已修改0, 55, 0处的方块数据 * Alex运行命令: /data modify block ~ ~ ~ Items[1].tag.pages prepend value '{"text":"Call me Ishmael."}' 已修改0, 55, 0处的方块数据 * Alex运行命令: /data modify block ~ ~ ~ Items[1].tag.author set value "Cthulhu the Sleeper"
儲存
使用NBT資料儲存的指令儲存是訪問或儲存NBT資料的有效方法,且其無需透過方塊實體或實體讀取或寫入NBT資料。
每個指令儲存都儲存著通用的鍵值對。指令儲存使用命名空間ID進行區分。
/data get和/data modify可以讀取儲存,而/data merge、/data modify、/data remove和/execute store可以寫入儲存。
指令儲存也可以透過原始JSON文字讀取。
歷史
| Java版 | |||||
|---|---|---|---|---|---|
| 1.13 | 17w45b | 加入了/data,取代了/blockdata和/entitydata。 | |||
| 1.14 | 18w43a | 加入了/data modify。 | |||
| 1.15 | 19w38a | 加入了指令儲存。 | |||
加入了storage <命名空间ID>作為來源或目標。 | |||||
注釋
引用錯誤:使用群組名稱 "note" 的 <ref> 標籤已存在,但查無對應的 <references group="note"/> 標籤