Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
注册
Advertisement
本页面不适合使用可视化编辑器编辑

本页含有大量的样式等技术性内容,可视化编辑器可能无法很好地处理,尤其是被注释隔断以实现效果的<pre>标签,极有可能被无法识别。因此编辑时,应使用编辑源代码,若同时看见“编辑”与“编辑源代码”按钮或链接,请点击“编辑源代码”。若点击“编辑”后,出现“使用可视化编辑”和“编辑源代码”两个按钮,请选择“编辑源代码”。
再次强调一遍,即使不懂得如何使用源代码,也不要使用可视化编辑器编辑本页面。

Dark Oak Sapling
此条目仍需完善。

你可以帮助我们扩充关于该主题的更多信息。

Information icon
此特性为Java版基岩版独有。

本教程主要讲述NBT标签以及JSON组合的语法。关于NBT标签的实际用法可以参见教程/NBT命令标签

NBT和JSON在Minecraft命令中十分常见。如/summon 实体id 坐标 标签中的“标签”,就是NBT格式的,如/summon creeper ~ ~ ~ {powered:1b}(召唤一只高压爬行者)。又如,NBT可用于实体选择器,如/kill @e[type=creeper,nbt={powered:1b}](杀死所有高压爬行者)。JSON在命令中的使用,如/tellraw @s {"text":"点击此处自杀","clickEvent":{"action":"run_command","value":"/kill"}}。在上述实例中,红色文字表示的是NBT。

JSON可以作为告示牌文本及物品名称,但用在NBT中必须变成字符串格式且一般需要转义,如/give @s diamond_sword{display:{Name:"{\"text\":\"一个普通的钻石剑\",\"color\":\"dark_red\",\"italic\":false}"}}。JSON在数据包和资源包中也十分普遍。语言文件、方块模型、进度信息、合成配方等都是用JSON定义的。


NBT的语法

NBT类似于一个表格,其每个标签都有名称和值。我们做一个类比,石头的名称石头,它的硬度,它的透光性不透光,其开采工具;玻璃,其名称玻璃硬度透光性透光开采工具。这里的“硬度”“透光性”等,都是标签名称;“硬”“不透光”则是其值。标签的名称和值应该匹配起来。如果说石头的硬度透光开采工具,这就无法理解了。

标签的值除了是一个数值或字符串之外,还可以是一组新的标签(称为组合),或者是一组没有名称的值(称为列表)。后面的内容会详细提到。

NBT复合标签的基本语法是使用花括号括起来,里面含有众多标签,每一个标签是“标签名称:”的格式。多个标签用逗号隔开。参考下面这些实例,有助于更好地了解NBT的写法。

简单的NBT

以下面的命令为例:/summon zombie ~ ~ ~ {CustomName: "\"快乐的小僵尸\"", CustomNameVisible: 1, IsBaby: 1} 该命令召唤出一只小僵尸。

这里的“CustomNameVisible: 1”就是一个标签,其中,CustomNameVisible是其名称1是其

一个NBT可以只有一个标签,也可以有多个标签。上面的实例中,CustomName: "\"快乐的小僵尸\""也是标签。

一般地,标签名称只能包含英文字母,值有以下类型及表述方式:

  • 数字。一般,在数字后面加一个英文字母以表示其值,比如1b就表示布尔值的1。但是,数字后面的字母是可以省略的。系统可以自动将其转化为对应的形式。也就是说,我们完全可以用我们日常生活中习惯的直接表示数字(整数或小数)的方法表示数字,如3218.32。以下各种具体的数字存储类型,供有经验的人参考。
    • 字节:1个字节,值在[-128,127](这是数学中区间集合的表示方法)之间的整数,用“b”表示。一般表示其某项功能是否开启,常作为布尔值使用,因此其值通常为0b1b,如上述僵尸的标签的CustomNameVisible(名称是否可见),若其值为1b则可以看见其名字,若为0b则表示只有指向它时才能看见它的名字。
    • 短整型:2个字节,值在[-32768,32767]之间的整数,用“s”表示。如旧版本的Health(表示生命值),32767s是其最大值。附魔的级别也是短整型,因此,能通过命令实现的最大的附魔级别是32767级。
    • 整型:4字节,值在[-2147483648,2147483647]之间的整数,用“s”表示。比如用数字表示的方块/物品id(从1.8就被移除了)。
    • 长整型:8字节,值在[-9223372036854775808,9223372036854775807]之间的整数,在NBT中极为罕见。它可以用来表示极大的数字。
    • 单精度浮点型:32位单精度浮点数,用“f”表示。如实体的Health(生命值),就是浮点型。虽然我们在游戏内看到的实体生命值通常是整数,半个心代表1,事实上,生命值在存储时,是可以有小数的。
    • 双精度浮点型:64位双精度浮点数。
  • 字符串:和大多数语言的字符串一样,表示一系列文本。用“"字符串内容"”表示,注意必须使用半角双引号,单引号、中括号均无效,类似于r"ab\cd"的用法也无效。它可以对双引号进行转义)。比如,上面的例子中的"\"快乐的小僵尸\""。转义是用来表示特殊字符,后文会详细提及。此外,如果字符串没有标点符号(可以含有下划线_),引号可以省去。
  • 列表:类似于数组。参见#列表
  • 整型数组:从-2147483648到2147483647的整数数组,用逗号分隔并用方括号包含。比如,区块文件的高度地图、方块列表、生物群系排布。
  • 复合标签:参见#复合标签

复合标签

NBT的复合标签可以作为一个值。比如,下面例子中的绿色文字就是一个组合,它作为了“display”的值。

/give @s stick{display:{Name:"\"谎言之杖\""}}

复合标签可以看做是一个新的NBT,同样也是用逗号隔开标签,用冒号隔开标签名称与值。当然,组合内还可以有组合。

列表

列表通常与组合一起出现,比如下面的例子:

/summon spider ~ ~ ~ {Passengers:[{id:"minecraft:skeleton"}]}

该命令用于召唤蜘蛛骑士,即骷髅骑在蜘蛛身上。这个例子中的绿色文字就是一个列表,它的唯一一个值就是一个组合。

一个列表可以有零个、一个或多个值,比如:

/summon zombie ~ ~ ~ {ArmorItems:[{id:"minecraft:diamond_boots",Count:1b},{id:"minecraft:diamond_leggings",Count:1b},{id:"minecraft:diamond_chestplate",Count;1b},{id:"minecraft:diamond_helmet",Count:1b}]}

该命令用于召唤一个穿着全套钻石盔甲的僵尸。绿色文字表示的列表含有4个值,每一个值都是一个组合。

实际上,列表的每个标签都含有标签名称,注意是以0开始计数的。因此上面的绿色文字也可以写为:

[0:{id:"minecraft:diamond_boots",Count:1b},1:{id:"minecraft:diamond_leggings",Count:1b},2:{id:"minecraft:diamond_chestplate",Count:1b},3:{id:"minecraft:diamond_helmet",Count:1b}]

一般不推荐使用后一种写法。

列表的值也可以是字符串。

字符串的转义

在NBT中,字符串可以转义,但是只支持引号和反斜杠的转义。比如:

/give @s paper{display:{Name:"{\"text\":\"一张空纸\",\"color\":\"red\"}"}}

上面这个例子中,红色的文字表示了一整个字符串,其中绿色的文字表示转义的引号。字符串的内容将会被解释成如下内容:

{"text":"一张空纸","color":"red"}

(这是一个JSON文本。在NBT中,它被当做一个字符串使用。)

在NBT的字符串中,要表示一个双引号应用\"表示,如果要表示一个反斜杠则应该使用\\。所以,如果在字符串中要表示\",则应该使用\\\">

与JSON、Python、Lua等大多数程序语言不同,NBT只允许转义引号和反斜杠,因此不支持\n、\b、\u00a7等转义方式。\后面只有是\"时才会被转义(此时,被转义的\"不能再转义其他的字符,也不能够作为字符串的分界线),其他的情况统统不转义。

NBT路径的表示方法

/data get/modify.../remove block/entity ... 路径中“路径”就是通过一系列标签名称定义到这个标签。

比如,powered路径,就是索引到标签名称为powered的标签。例如,/data get entity @e[type=creeper,limit=1] powered即可查询这只爬行者是否为高压爬行者。

表示复合标签中的标签时,使用.。比如,{a:{b:{c:"某某文字"}}},索引a.b.c就可以得到“"某某文字"”。

表示列表中的特定的元素时,使用[n](n为自然数,表示该列表中的第n+1个值)。比如,/data get entity @e[type=zombie,limit=1] ArmorItems[0].id表示,获取僵尸的脚上穿的物品的id(可能不存在)。又比如,/data get entity @s Inventory[3]表示获取自己的物品栏的第4个物品的信息。

JSON的语法

JSON的语法与NBT比较相似,但有以下区别:

  • JSON的数字不分为整型等类型,因此不支持1b2s这样的表达,直接使用12即可。
  • 在JSON中,标签、标签名称、标签值常称为域、键、值(就像Python的字典和Lua的表一样)。在JSON中,表示键也必须用引号括起来,就像表示字符串一样。
  • JSON有布尔值true与false。
  • JSON的字符串也只允许双引号(就像NBT那样),单引号字符串不接受,但是支持\n\u00a7等转义,未知的转义(如\a)仍将报错。JSON的字符串在任何时候下都不可以省略引号(NBT可以)。
  • JSON的语法很严格,比如,对象与列表的最后一项之后不能有逗号。

习惯上,JSON的表达应该经常换行,并且适当缩进(通常将2个空格作为一个缩进),例如以下是一个数据包的pack.mcmeta

{
  "pack": {
    "pack_format": 1,
    "description": "一个简单的数据包"
  }
}

/tellraw/title等命令中的JSON不支持换行。(一般情况下,复制一段带有缩进符号和换行符的文字,然后在游戏内按Ctrl + V粘贴,换行符和缩进符号会被自动过滤。)

编造比较复杂的JSON文本时,你可以进入bejson.cn等具有解析、纠错、转义、反转义、标准格式(更加美观)、压缩(去除多余空格、换行、缩进)等功能的网站。

JSON的用途

JSON在数据包、资源包和JSON文本中有极大作用。参见教程/制作资源包教程/制作数据包教程/JSON文本

JSON用于基岩版命令

在1.1后(包括)的基岩版拥有了原版的nbt。适用于/give/replaceitem,并且只有2个:can_place_oncan_destroy。其语法如下:

  • {"minecraft:can_place_on":{"blocks":["方块1","方块2"…]}}
  • {"minecraft:can_destroy":{"blocks":["方块1","方块2"…]}}

注意方块用英文(如"air")而并非数字id(如0)。

例如:/give @s diamond_pickaxe 1 0 {"minecraft:can_destroy":{"blocks":["stone"]}}可以获得一个允许冒险模式玩家破坏石头的钻石镐。冒险模式的玩家如果没有拿着这样的镐就无法破坏任何方块,拿着这把镐也只能破坏石头,不能破坏其他方块。该命令相当于Java版的/give @s diamond_pickaxe{CanDestroy:[stone]}

又一个实例:/give @s tnt 1 0 {"minecraft:can_place_on":{"blocks":["sand","tnt"]},"minecraft:can_place_on":{"blocks":["redstone_block"]}}

Advertisement