本站文本内容除另有声明外,转载时均必须注明出处,并遵守CC BY-NC-SA 3.0协议。(转载须知
本站是中文Minecraft Wiki的镜像站,与Mojang AB、Gamepedia没有从属关系。(免责声明

命令/data

来自Minecraft WIKI
跳到导航 跳到搜索
页面贡献者 :
中文mcwiki机器人
p405
丘人头
Information icon.png
此特性为Java版独有。
data
限制条件

管理员

加入版本

1.1317w45a

/data命令允许执行者获取、合并、修改或是移除方块实体命令存储NBT数据

语法

/data有四个子命令(getmergemodifyremove),子命令使用的目标/来源是block <目标方块坐标>entity <目标>storage <目标>

data get block <目标方块坐标> [<路径>] [<倍率>]
data get entity <目标实体> [<路径>] [<倍率>]
data get storage <目标> [<路径>] [<倍率>]
data merge block <目标方块坐标> <nbt>
data merge entity <目标实体> <nbt>
data merge storage <目标> <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) from storage <来源> <来源路径>
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 modify storage <目标储存> <目标路径> (append|insert <索引>|merge|prepend|set) from block <来源方块坐标> <来源路径>
data modify storage <目标储存> <目标路径> (append|insert <索引>|merge|prepend|set) from entity <来源> <来源路径>
data modify storage <目标储存> <目标路径> (append|insert <索引>|merge|prepend|set) from storage <来源> <来源路径>
data modify storage <目标储存> <目标路径> (append|insert <索引>|merge|prepend|set) value <value>
data remove block <目标方块坐标> <目标路径>
data remove entity <目标实体> <路径>
data remove storage <目标储存> <目标路径>
以多种方式展示语法

参数

(block <目标方块坐标>|entity <目标实体>|storage <目标存储>):
  • <目标方块坐标>—指定需要改变数据标签的方块的<x> <y> <z>坐标。
  • <目标实体>—指定需要改变数据标签的实体的有效UUID或目标选择器
  • <target>—指定需要改变数据标签的存储的命名空间ID
get . . . [<路径>] [<倍率>]:
  • <路径>—指定检索特定NBT的合法的路径名。
  • <倍率>—缩放获得的NBT具体数值。
merge . . . <nbt>:
  • <nbt>—复合标签。最简单的合法输入是{}
modify . . . <目标路径> (append|insert <索引>|merge|prepend|set):
  • <目标路径>—指定修改特定NBT的合法的路径名。
  • <索引>—指定列表中一个元素的索引,为一个有效整数。
… from (block <来源方块坐标>|entity <来源实体>|storage <来源储存>) <来源路径>:
  • <来源方块坐标>—指定需要使用其数据标签的方块的<x> <y> <z>坐标。
  • <来源实体>—指定需要使用其数据标签的实体的有效玩家名、UUID或目标选择器
  • <来源储存>—指定需要使用其数据标签的存储的命名空间ID
  • <来源路径>—指定使用特定NBT的合法的路径名。
… value <>:
  • <>—一般是修改目标NBT要使用的值。必须符合数据类型。
remove . . . <路径>:
  • <路径>—指定移除特定NBT的合法的路径名,见§NBT路径

效果

当参数没有被正确指定时失败。(若目标实体的选择器没有规定实体数量为1,则是命令语法错误而非执行失败。)

若成功:

/data get
/data get . . .
返回目标方块或实体的NBT数据,并且带有语法高亮。
若适用,成功时的返回值为1。
/data get . . . <路径>
返回目标方块或实体的一部分NBT数据,不带有语法高亮。
返回值取决于获取的NBT元素的类型。
  • 获取一个数字,则返回值为数字。
  • 获取一个字符串,则返回该字符串的长度。
  • 获取一个列表会返回该列表中元素的个数。
  • 获取一个复合标签会返回该标签下一级子元素(不包括子元素的子元素)的数量。
/data get . . . <路径> <倍率>
返回该标签的值并乘以<倍率>。
此时<路径>需要指向一个数字类型的标签,即该标签的类型可以为TAG_byte,TAG_short,TAG_int,TAG_long,TAG_float或TAG_double。
/data merge
将目标方块或实体的特定NBT数据与指定的<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数据树中指定特定元素集合的标签。路径通常以node.…….node的形式存在。此处node可以声明从先前的标签中选择什么子元素。

节点

一共有6种节点可用。

标签集合从仅有的一个元素(即为根标签)开始,并随路径上的节点进行更改。NBT路径会在最后一个标签集合生效。

名称 格式 描述 选择结果 示例 示例描述
带有对象的根节点 {标签}标签是复合标签内的内容。 仅在与给定的标签匹配时才选择起始标签。
仅适用于路径中的第一个元素。
起始标签。若失败则为空。 {Invisible:1b} 如果根标签含有值为1 Invisible,则选择根标签。
命名节点 名称名称是纯文本或转义后的字符串。 在上个标签中选择名为名称的子标签。 A collection of tags; no more elements than the previous tag collection. May be nothing. VillagerData 选择子标签VillagerData
"A cool name[]" 选择子标签A cool name[]
带有对象的命名节点 名称{标签}名称是纯文本或转义后的字符串,标签是复合标签内的内容。 在上个标签中选择在名称中匹配给定复合标签的子标签。 A collection of tags; no more elements than the previous tag collection. May be nothing. VillagerData{profession:"minecraft:nitwit"} 如果只有 VillagerData含有值为minecraft:nitwit profession标签,则选择标签 VillagerData
已索引列表节点 名称[索引]名称是纯文本或转义后的字符串,索引是一个整数。 在上个标签中选择子列表名称中位于索引(若索引为负数,则为列表元素数 + 索引)的元素。 A collection of tags; no more elements than the previous tag collection. May be nothing. Pos[0] 在子列表 Pos中选择第一个子标签。
Inventory[-1] 在子列表 Inventory中选择最后一个子标签。
列表节点 名称[] 在上个标签中选择子列表名称中的所有元素。 A collection of tags; may have more elements than the previous tag collection. May be nothing. ActiveEffects[] 选择子标签 ActiveEffects中的所有元素。
带有对象的标签节点 名称[{标签}]名称是纯文本或转义后的字符串,标签是复合标签内的内容。 在上个标签中选择子列表名称中匹配给定复合标签的元素。 A collection of tags; may have more elements than the previous tag collection. May be nothing. Inventory[{Count:25b}] 在标签 Inventory中选择含有值为25 Count标签的元素。

在路径中使用.字符分开各个节点。节点可以任意混合及匹配,除了带有对象的根节点:若其存在,则必须是路径中的第一个节点。

名称转义

一个路径的合法的字符集似乎是所有的非空字符,只要所有的未闭合的方括号和花括号([{)被正确闭合,并位于每一项的结尾即可。(即其后只有一个句点或路径的结尾—. )。也就是说,定义一个数据标签的合理的字符集a-z A-Z 0-9 _ . [ ] { }(用正则表达式表示就是[][}{a-zA-Z0-9.]*)。

如果一个键的名字中存在需要转义的字符,可以用双引号括起来。

示例

Foo bar示例

/data get entity @p foo.bar[0]."A [crazy name]!".baz

为了演示目的,上述NBT路径是随意编写出来的。

  • foo — 选取名为“foo”的顶级元素。
  • foo.bar — 选取foo中名为“bar”子元素。现在假设foo是一个列表。
  • foo.bar[0] — 选取列表“bar”的首个元素。
  • foo.bar[-1] — 选取列表“bar”的最后一个元素。
  • foo.bar[0]."A [crazy name]!" — 选取上述首个元素中名为“A [crazy name]!”的子元素。
  • foo.bar[0]."A [crazy name]!".baz — 选取上述“A [crazy name]!”元素中名为“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”。
  • foo{bar:"baz"}.bar — 如果“foo”标签中“bar”的值为"baz",则选取“bar”。

箱中书

/data get block ~ ~ ~ Items[1].tag.pages[3]

某玩家写了一本书,将其放在了脚下的箱子里。她要一步步尝试拆解这条命令,最终运行上述命令。

存储

参见:命令存储格式

使用NBT数据保存的命令存储是访问或储存NBT数据的有效方法,且其无需通过方块实体实体读取或写入NBT数据。

每个命令存储都保存着通用的键值对。命令存储使用命名空间ID进行区分。

/data get/data modify可以读取存储,而/data merge/data modify/data remove/execute store可以写入存储。

命令存储也可以通过原始JSON文本读取。

历史

Java版
1.1317w45b加入了/data
18w03a带有路径的/data get现在适用于非数字的值。
1.1418w43a加入了/data modify
1.1519w38a加入了命令存储
加入了storage <命名空间ID>作为来源或目标。
19w39a为NBT storage加入了聊天组件