本页面不适宜利用可视化编辑器编辑

本页含有大量的样式等技能性内容,可视化编辑器可能无法很好地处理。

讲授灵数字建筑设计 公共建筑设计

本教程紧张讲述NBT以及JSON的语法和用法。

用场概览

编辑

在命令中,NBT可用于(以Java版为例):

实体数据:如/summon minecraft:creeper ~ ~ ~ {powered:1b}(召唤一只闪电苦力怕)。

实体选择器,通过NBT选择实体:如/kill @e[type=creeper,nbt={powered:1b}](杀去世所有闪电苦力怕)。

方块数据:例如/setblock ~ ~-1 ~ command_block{Command:"say 1"}。

物品数据:比如/give @s diamond_block{CanPlaceOn:["dirt"]}表示给予玩家一个纵然在冒险模式也可以放置在泥土上的钻石块。

天下存储:用于/data data (get merge modify) storage ...。

JSON可以在命令和数据包中利用。
在命令中的利用,如:

直接在命令中利用JSON文本:常日用于/tellraw和/title命令,如/tellraw @s {"text":"点击此处自尽","clickEvent":{"action":"run_command","value":"/kill @s"}}。
在上述实例中,赤色笔墨表示的是JSON。

在命令的NBT中间策应用JSON文本:须要把稳NBT中必须变成字符串格式。
而且,在Java版1.14之前,由于NBT不支持单引号字符串,因此一样平常须要转义。
自Java版1.14之后,NBT字符串许可利用单引号,因此常日不再须要转义,节省了许多代码。
包括:

告示牌文本内容:如/setblock ~ ~ ~ minecraft:oak_sign{Text1:'"第一行文本"',Text2:'{"text":"第二行文本,我是赤色的!
","color":"red"}'}。

物品名称和描述:如/give @s minecraft:diamond_sword{display:{Name:'{"text":"欠亨俗的钻石剑","color":"dark_red","italic":false}'}}

成书的内容。

JSON在数据包和资源包中也十分普遍。
措辞文件(例如zh_cn.json)、方块和物品的模型、进度、配方、战利品表、标签、自定义维度等等都是由JSON文件定义的。

下面将会详细先容NBT和JSON的数据构造和语法。

NBT的语法

编辑

NBT实质上是按照一定的构造存储的数据。
常日NBT本身是一个复合标签(compound),它类似于一个Lua的表(table)、JSON的工具(object)或Python的字典(dict)。
一个复合标签有多个标签(tag,或者称为字段),每个标签都包含键(key,也成为标署名称)和值(value)。

如果你理解表或工具的观点,你该当很快就理解NBT复合标签的含义,可以跳过这一段。
如果不理解,我们可以我们做一个类比,以“石头”为例,它的名称是石头,它的硬度为硬,它的透光性为不透光,其开采工具为镐;以“玻璃”为例,其名称是玻璃,硬度为软,透光性为透光,开采工具为无。
这里的“硬度”“透光性”等,都是键;“硬”“不透光”则是其值。
因此,我们可以编写出下面的表格(仅以“石头”为例):

“石头”的数据

键值

名称石头

硬度硬

透光性不透光

开采工具镐

这个表格的第一列的内容是键,第二列是值。
我们也可以这样大略表示(只是一个类比以便理解):{名称:石头,硬度:硬,透光性:不透光,开采工具:镐}。
不丢脸出。
这里面的冒号和逗号与我们平时利用的冒号和逗号都有类似的含义。

每一个字段的值除了是一个数值或字符串之外,还可以是一个新的复合标签,或者是另一个列表。
后面的内容会详细提到。

参考下面这些实例,有助于更好地理解NBT的写法。

大略的NBT

编辑

拜会:命令§NBT标签和NBT格式§标签的定义

以下面的命令为例:/summon minecraft:zombie ~ ~ ~ {CustomName:'{"text":"快乐的小僵尸"}', CustomNameVisible: 1, IsBaby: 1}

该命令召唤出一只小僵尸。
上面的这个实例中,有三个字段:第一个字段的键为CustomName,值为'{"text":"快乐的小僵尸"}';第二个字段的键为CustomNameVisible,值为1。
读者不丢脸出上面这个实例的第三个字段的键和值。

如果读者会英文,那么就不丢脸出,召唤出的这个僵尸的自定义名称(custom name)为“快乐的小僵尸”,并且自定义名称可见(custom name visible),而且是个小僵尸(is baby)。

键常日只包含英笔墨母或下划线,而值可以有多种类型。

值的常见类型

编辑

下面列举了可用的值的类型及表示方法:

数字:一样平常,在数字后面加一个英笔墨母以表示其值与类型,比如1b就表示布尔值的1。
数字后面的字母表示其存储类型,而且可以省略。
系统可以自动将其转化为对应的形式。
也便是说,我们完备可以用我们日常生活中习气的直接表示数字(整数或小数)的方法表示数字,如32、18.32。
以下各种详细的数字存储类型,供有履历的人参考。

字节型(byte):1个字节,值在[-128,127](这是数学中区间凑集的表示方法,便于读者理解)之间的整数,用“数字 + b”表示。
一样平常用于表示其某项功能是否开启,常作为布尔值利用,因此其值常日为0b或1b,如上述僵尸的标签的CustomNameVisible(名称是否可见),若其值为1b则可以瞥见其名字,若为0b则表示只有指向它时才能瞥见它的名字。
此外,1b和0b还分别可以用true和false表示。

短整型(short):2个字节,值在[-32768,32767]之间的整数,用“数值 + s”表示。
如旧版本的Health(表示生命值),32767s是其最大值。
附魔的级别也是短整型,因此,在旧版本中,能通过命令实现的最大的附魔级别是32767级。

整型(integer,简称int):4字节,值在[-2147483648,2147483647]之间的整数,直接用一个数值表示。

长整型(long):8字节,值在[-9223372036854775808,9223372036854775807]之间的整数,在NBT中极为罕见。
它可以用来表示极大的数字。

单精度浮点型(float):32位单精度浮点数,用“数值 + f”表示。
如实体的Health(生命值),便是浮点型。
虽然我们在游戏内看到的实体生命值常日是整数,半个心代表1,事实上,生命值在存储时,是可以有小数的。
坐标、实体朝向等,也是浮点型。

双精度浮点型(double):64位双精度浮点数,用“数值 + d”表示。

字符串(string):和大多数措辞的字符串一样,表示文本。
用英文双引号""或单引号''括起来的字符表示,把稳必须利用半角双引号或半角单引号,如"这是一个字符串"和'这是一个字符串'都是有效的。
你可以对字符串内容进行转义)。
转义可以用来表示分外字符,以及随意马虎被理解为字符串边界的字符,后文会详细提及。
此外,如果字符串没有标点符号(可以含有下划线_),引号可以省去,如标签id:"netherite_sword"可以写成id:netherite_sword,但是id:"minecraft:netherite_sword"不能写成id:minecraft:netherite_sword,由于冒号:是标点符号。

列表(list):拜会#列表。

复合标签(compound):拜会#复合标签。

复合标签

编辑

NBT复合标签(compound)的基本语法是利用花括号括起来,里面含有零个或更多个字段,每一个字段是“键:值”的格式。
多个字段用逗号隔开。
个中,键常日是字符串(其引号常日可以省略),值可以有各种类型,可以是另一个复合标签。

NBT的复合标签全体可以看作值。
比如,下面例子中的绿色笔墨便是全体复合标签,这个复合标签作为“display”的值。

/give @s minecraft:stick{display:{Name:"\"谎话之杖\""}}(仅限1.13后的版本)

/give @s minecraft:stick{display:{Name:'"谎话之杖"'}}(仅限1.14后的版本)

列表

编辑

列表(list),或者称为序列(sequence)、数组(array),可以包含零个、一个或多个值,它的每一个值对应的键都不表示,如:

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

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

/summon minecraft: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开始计数(就像Python、JavaScript那样),而非像Lua那样以1开始计数。
例如:

/data get entity @s Inventory[1]

表示获取物品栏的第二个物品的数据,而非第一个。
获取物品栏的第一个物品数据,应该利用:

/data get entity @s Inventory[0]

转义

编辑

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

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

上面这个例子中,赤色的笔墨表示了一全体字符串,个中绿色的笔墨表示转义的引号。
字符串的内容将会被阐明成如下内容:

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

(这是一个原始JSON文本。
在NBT中,JSON文本被当做一个字符串利用。

在NBT的字符串中,要表示一个双引号运用\"表示,如果要表示一个反斜杠则该当利用\\。
以是,如果在字符串中要表示\",则该当利用\\\"。

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

NBT路径的表示方法

编辑

/data (get|modify|remove) (block|entity|storage) ... <路径>中“路径”便是用于一系列键来定位到这个标签的。

比如,闪电苦力怕拥有{powered:1b}的数据,powered路径,便是索引到标署名称为powered的标签。
例如,/data get entity @e[type=creeper,limit=1] powered即可查询这只苦力怕是否为闪电苦力怕。