我的世界NBT教程 NBT详解

时间:2017-11-09 来源:88130安卓下载 作者:佚名

  我的世界NBT教程 NBT详解。那今天给大家带来的是关于我的世界NBT的教程,下面就给大家详细的介绍一下什么是NBT、NBT标签的类型、自定义NBT、检测NBT等等内容吧!

  NBT的简介:

  什么是NBT呢?

  NBT是个文件格式 全称Named Binary Tag

  就是用作指定实体/某些方块的特性

  比如实体的血量

  NBT就是一堆标签,每个标签的格式如下

  标签名称:数值

  每个标签之间用逗号(,)相隔,比如

  {NoGravity:1b,Invisible:1b}

  NoGravity:1b就是一个标签,而NoGravity就是标签的名称,1b就是其数值

  Invisible:1b就是另一个标签,Invisible就是标签的名称,1b就是其数值

  如何获得比较详细的NBT资料

  我们在wiki里可以找到详细的NBT列表

  分别可以在http://minecraft.gamepedia.com/Chunk_format和http://minecraft.gamepedia.com/Player.dat_format找到

  这两个是英文版的

  chunk_format就是实体的NBT还有一些方块的NBT

  而player.dat format就是一些关于玩家的NBT

  比如物品的格式等

  如果需要研究某个实体/实体方块的NBT(非玩家)

  对实体,我们可以透过entitydata 指定的实体 {}来得到那个实体的NBT

  比如entitydata @e[c=1,type=!Player] {}

  如果是方块,我们可以透过blockdata 方块的坐标 {}来得到其NBT

  比如blockdata ~ ~-1 ~ {}

  那个输出会有一行"The data tag did not change:",然后就是那些NBT

  当然,在聊天栏看是比较辛苦的,我们可以把这个命令放在命令方块里激活,然后ctrl a 那个输出栏,然后再ctrl c复制那个输出,之后放在一个你觉得方便的文字编辑器那里,比如记事本等

  NBT标签的类型

  数值类

  TAG_Byte 例子:Count:1b

  这个是代表什么呢?这个是用作储存数值用的。它能够储存的数值范围为-128 至 127。这个除了能够储存数值之外,它也能够储存Boolean值(True/False),这个时候它的范围为0 (False)和1 (True)。

  使用的时候需要注意一点,当你用在检测的指令上(比如testfor和scoreboard),数值后需要补上b字来指明它那个数值是Byte

  TAG_Short 例子:Damage:1s

  这个也是储存数值用,数值的范围为-32,768 至 32,767。使用的时候需要注意一点,当你用在检测的指令上(比如testfor和scoreboard),数值后需要补上s字来指明它那个数值是Short

  TAG_Int 例子:Lifetime:1

  这个也是储存数值用,数值的范围为-2,147,483,648 至 2,147,483,647。使用的时候需要注意一点,就是数值后不能补上i字

  TAG_Long 例子:UUIDMost:0l

  这个也是储存数值用,数值的范围为-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807。使用的时候需要注意一点,当你用在检测的指令上(比如testfor和scoreboard),数值后需要补上l字来指明它那个数值是Long

  TAG_Float 例子:HealF:1.0f

  只有这个和Double可以储存小数。其最大值也比long大得多,然而它的精确度会随着数值的大小而变化(绝对值越大,它的精确度就越小)。数值后需要补上f字来指明它那个数值是float

  TAG_Double 例子:Base:1d

  只有这个和Float可以储存小数。其最大值也比long大得多,然而它的精确度会随着数值的大小而变化(绝对值越大,它的精确度就越小)。如果你的数值里有小数点,那么就默认为double,可以不写d字在数值之后,然而如果没有小数点,就需要写d在数值后面以标明是double。当你用在检测的指令上(比如testfor和scoreboard),数值后需要补上d字来指明它那个数值是double

  TAG_Boolean 例子:OnGround:1b

  这个类型比较特别,它的数值只有两个,一是True(1b),二是False(0b)。它可以用两种方式表达同一个数值,可以是True/False和1b/0b。检测的时候也可以用True/False和1b/0b两种方式检测。比如说,TagA:1b和TagA:True是一样的。

  字符

  TAG_String 例子:id:"ArmorStand"

  这个类型可以储存字串,然而要小心,如果字串内有逗号/"号就需要用"把整个字串括住(也有一个例外情况,比如是command:entitydata @e {Fire:20b,Air:20s},这样便不用""括住,因为那个逗号是在另外一个{}里面),比如说"123,456"。如果字串里面需要用到"符号,就必须用""括住整个字串并且中间那个"需要转义。

  如果你需要用到符号,那么也需要把它转义,否则会出错,因为它是用来标明转义的。转义方法为前加上一个

  转义的方法是:每个符号前方要加上一个符号,每个"符号前方也要加上一个符号。所以"转义后会变 成",再转义会变成",再转义就会变成"

  母标签类

  TAG_List 例子:Motion:[0.1d,0.1d,0.1d]

  这个是一个母标签的类型,它的子标签的类型全部都是相同的丶没有标签名称并且会被一个[]括住。例子:Items:[{id:"minecraft:stone",Count:1b},{id:"minecraft:glass",Count:1b}],Items就是一个List类型的NBT,而{id:"minecraft:stone",Count:1b}和{id:"minecraft:glass",Count:1b}就是其子标签(id并不算是其子标签!!!),在这个例子里,其子标签的类型就是Compound。

  这个类型相当特别,你可以检测其中的一个子标签,比如你检测Items:[{id:"minecraft:glass",Count:1b}],它的输出是成功的。然而,当你更改List的子标签时,它会把所有的子标签更新。比如说你用blockdata把那个箱子的NBT更改为Items:[{id:"minecraft:glass",Count:2b}],那个箱子里的石头会被删除。(如果你用entitydata得到他的NBT,你应该会看见类似的东西: TagName:[0:数值1,1:数值2,2:数值3]之类的东西,其实那个0/1/2就是个编号,大可以忽略它,因为你不能只改变某个编号的数值,也不能只探测某个编号的数值)

  TAG_Compound 例子:Riding:{id:"ArmorStand"}

  这个也是一个母标签的类型,其子标签需要用{}括住,并且需要有标签名称。比如Riding:{id:"ArmorStand",CustomName:"AS1",Riding:{id:"ArmorStand",CustomName:"AS2"}}。Compound可以互相堆叠,然而堆叠层数不能超过512。

  Compound和List的最大分别(在NBT里)是List无法透过命令独立变更其中的子标签的数值,而Compound则可以。

  TAG_Int_Array 例子:Colors:[123,456]

  这个看上去和TAG_List相近,然而它们之间的分别挺大的。

  首先,Int_Array只能储存Int,不能储存其他数值

  第二,Int_Array检测的时候是检测整个数值的,而List检测的时候可以只检测某个子标签,比如玩家手上有一个烟花,这个时候玩家的NBT应该是{SelectedItem:{tag:{Fireworks:{Explosions:[{Type:1b,Colors:[7599255,62976]}]}}}}(Colors就是一个Int_Array)

  如果我们只是把Colors:[7599255,62976]换为Colors:[7599255]

  它的结果是不符合的(因为Colors括号里的是其数值而不是其子标签)

  我的世界NBT教程 NBT详解。那今天给大家带来的是关于我的世界NBT的教程,下面就给大家详细的介绍一下什么是NBT、NBT标签的类型、自定义NBT、检测NBT等等内容吧!

  NBT的简介:

  什么是NBT呢?

  NBT是个文件格式 全称Named Binary Tag

  就是用作指定实体/某些方块的特性

  比如实体的血量

  NBT就是一堆标签,每个标签的格式如下

  标签名称:数值

  每个标签之间用逗号(,)相隔,比如

  {NoGravity:1b,Invisible:1b}

  NoGravity:1b就是一个标签,而NoGravity就是标签的名称,1b就是其数值

  Invisible:1b就是另一个标签,Invisible就是标签的名称,1b就是其数值

  如何获得比较详细的NBT资料

  我们在wiki里可以找到详细的NBT列表

  分别可以在http://minecraft.gamepedia.com/Chunk_format和http://minecraft.gamepedia.com/Player.dat_format找到

  这两个是英文版的

  chunk_format就是实体的NBT还有一些方块的NBT

  而player.dat format就是一些关于玩家的NBT

  比如物品的格式等

  如果需要研究某个实体/实体方块的NBT(非玩家)

  对实体,我们可以透过entitydata 指定的实体 {}来得到那个实体的NBT

  比如entitydata @e[c=1,type=!Player] {}

  如果是方块,我们可以透过blockdata 方块的坐标 {}来得到其NBT

  比如blockdata ~ ~-1 ~ {}

  那个输出会有一行"The data tag did not change:",然后就是那些NBT

  当然,在聊天栏看是比较辛苦的,我们可以把这个命令放在命令方块里激活,然后ctrl a 那个输出栏,然后再ctrl c复制那个输出,之后放在一个你觉得方便的文字编辑器那里,比如记事本等

  NBT标签的类型

  数值类

  TAG_Byte 例子:Count:1b

  这个是代表什么呢?这个是用作储存数值用的。它能够储存的数值范围为-128 至 127。这个除了能够储存数值之外,它也能够储存Boolean值(True/False),这个时候它的范围为0 (False)和1 (True)。

  使用的时候需要注意一点,当你用在检测的指令上(比如testfor和scoreboard),数值后需要补上b字来指明它那个数值是Byte

  TAG_Short 例子:Damage:1s

  这个也是储存数值用,数值的范围为-32,768 至 32,767。使用的时候需要注意一点,当你用在检测的指令上(比如testfor和scoreboard),数值后需要补上s字来指明它那个数值是Short

  TAG_Int 例子:Lifetime:1

  这个也是储存数值用,数值的范围为-2,147,483,648 至 2,147,483,647。使用的时候需要注意一点,就是数值后不能补上i字

  TAG_Long 例子:UUIDMost:0l

  这个也是储存数值用,数值的范围为-9,223,372,036,854,775,808 至 9,223,372,036,854,775,807。使用的时候需要注意一点,当你用在检测的指令上(比如testfor和scoreboard),数值后需要补上l字来指明它那个数值是Long

  TAG_Float 例子:HealF:1.0f

  只有这个和Double可以储存小数。其最大值也比long大得多,然而它的精确度会随着数值的大小而变化(绝对值越大,它的精确度就越小)。数值后需要补上f字来指明它那个数值是float

  TAG_Double 例子:Base:1d

  只有这个和Float可以储存小数。其最大值也比long大得多,然而它的精确度会随着数值的大小而变化(绝对值越大,它的精确度就越小)。如果你的数值里有小数点,那么就默认为double,可以不写d字在数值之后,然而如果没有小数点,就需要写d在数值后面以标明是double。当你用在检测的指令上(比如testfor和scoreboard),数值后需要补上d字来指明它那个数值是double

  TAG_Boolean 例子:OnGround:1b

  这个类型比较特别,它的数值只有两个,一是True(1b),二是False(0b)。它可以用两种方式表达同一个数值,可以是True/False和1b/0b。检测的时候也可以用True/False和1b/0b两种方式检测。比如说,TagA:1b和TagA:True是一样的。

  字符

  TAG_String 例子:id:"ArmorStand"

  这个类型可以储存字串,然而要小心,如果字串内有逗号/"号就需要用"把整个字串括住(也有一个例外情况,比如是command:entitydata @e {Fire:20b,Air:20s},这样便不用""括住,因为那个逗号是在另外一个{}里面),比如说"123,456"。如果字串里面需要用到"符号,就必须用""括住整个字串并且中间那个"需要转义。

  如果你需要用到符号,那么也需要把它转义,否则会出错,因为它是用来标明转义的。转义方法为前加上一个

  转义的方法是:每个符号前方要加上一个符号,每个"符号前方也要加上一个符号。所以"转义后会变 成",再转义会变成",再转义就会变成"

  母标签类

  TAG_List 例子:Motion:[0.1d,0.1d,0.1d]

  这个是一个母标签的类型,它的子标签的类型全部都是相同的丶没有标签名称并且会被一个[]括住。例子:Items:[{id:"minecraft:stone",Count:1b},{id:"minecraft:glass",Count:1b}],Items就是一个List类型的NBT,而{id:"minecraft:stone",Count:1b}和{id:"minecraft:glass",Count:1b}就是其子标签(id并不算是其子标签!!!),在这个例子里,其子标签的类型就是Compound。

  这个类型相当特别,你可以检测其中的一个子标签,比如你检测Items:[{id:"minecraft:glass",Count:1b}],它的输出是成功的。然而,当你更改List的子标签时,它会把所有的子标签更新。比如说你用blockdata把那个箱子的NBT更改为Items:[{id:"minecraft:glass",Count:2b}],那个箱子里的石头会被删除。(如果你用entitydata得到他的NBT,你应该会看见类似的东西: TagName:[0:数值1,1:数值2,2:数值3]之类的东西,其实那个0/1/2就是个编号,大可以忽略它,因为你不能只改变某个编号的数值,也不能只探测某个编号的数值)

  TAG_Compound 例子:Riding:{id:"ArmorStand"}

  这个也是一个母标签的类型,其子标签需要用{}括住,并且需要有标签名称。比如Riding:{id:"ArmorStand",CustomName:"AS1",Riding:{id:"ArmorStand",CustomName:"AS2"}}。Compound可以互相堆叠,然而堆叠层数不能超过512。

  Compound和List的最大分别(在NBT里)是List无法透过命令独立变更其中的子标签的数值,而Compound则可以。

  TAG_Int_Array 例子:Colors:[123,456]

  这个看上去和TAG_List相近,然而它们之间的分别挺大的。

  首先,Int_Array只能储存Int,不能储存其他数值

  第二,Int_Array检测的时候是检测整个数值的,而List检测的时候可以只检测某个子标签,比如玩家手上有一个烟花,这个时候玩家的NBT应该是{SelectedItem:{tag:{Fireworks:{Explosions:[{Type:1b,Colors:[7599255,62976]}]}}}}(Colors就是一个Int_Array)

  如果我们只是把Colors:[7599255,62976]换为Colors:[7599255]

  它的结果是不符合的(因为Colors括号里的是其数值而不是其子标签)

  如何看wiki的页面

  比如上面这幅图就是从chunk format那里截的图

  那个格式叫树视图

  那个格式就是类似这样

  母标签

  ├子标签

  ├子标签

  │├子标签的子标签

  ├子标签

  如果那个母标签的类型是compound,那么它的子标签就是它能够包括的标签

  比如

  Pose:

  ├Body

  ├LeftArm

  ├RightArm

  ├LeftLeg

  ├RightLeg

  ├Head

  这个就是说,Pose里面能够有body至Head这些其中一个,比如Pose:{Body:[0.0f,0.0f,0.0f]}

  如果那个母标签的类型是list,那么它的”子标签”的编号就是那个数值的顺序

  比如

  HandDropChances

  ├0:Chance to drop the item being carried in the mainhand.

  ├1:Chance to drop the item being carried in the off hand.

  这个标签写出来的时候就是这样的:

  HandDropChances:[主手的物品掉落几率f,副手的物品掉落几率f]

  必须依照顺序,因为list里的东西没有标签名字,它们只有索引

  List还有一个情况,就是它的子标签只有”一个”,比如

  Items:

  ├Anitem

  我们可以看到,它是没有索引的,就是说,这个可以拥有很多的子标签,全部的用途都是记录那个容器中的物品的数据

  比如Items:[{id:"minecraft:stone",Count:1b,Slot:0b},{id:"minecraft:dirt",Count:1b,Slot:1b},{id:"minecraft:grass",Count:1b,Slot:2b}]

  当然,你可以写3个,也可以写10个,几十个,也可以空置(比如Items:[],这个的意思就是没有物品)

  实体丶物品丶实体方块格式

  实体它本身就是一个没有名字的Compound(正常情况下),所以所有的标签会用一个{}括住,比如{Motion:[0.0d,0.0d,0.0d],Fire:0s,Air:0s}

  而实体方块的格式也类似,也是一个没有名字的Compound(正常情况下)

  而物品格式也是一个没有名字的Compound(正常情况下),它有5个常用的标签,分别是

  Id(string),这个就是它代表的物品id,预设为stone,需要小心的是,在检测类指令里那个物品名称前需要minecraft

  Damage(s),这个就是代表物品的伤害值/数据值,预设为0

  Count(b),这个就是代表物品的数量,预设为1

  Slot(b),这个就是代表物品所在的储存格(只是在Inventory丶Items这些list标签里才会出现),预设为0

  tag(compound),物品的其他标签都是其子标签

  至于什么是”不正常情况”呢,就是当这些格式被compound/list标签引用,比如在Inventory丶TileEntityData丶Items丶Riding丶BlockEntityTag等标签里,它们的子标签可以直接是这些格式

  例子:

  Items的子标签就是物品格式,例子是Items:[{id:"minecraft:stone",Count:1b,Slot:0b},{id:"minecraft:sand,Count:1b",Slot:1b}]

  Item(一个compound标签)的子标签就是一个物品(所以就是使用物品格式),例子 Item:{id:"minecraft:stone",Count:1b}

  认读丶不一定存在丶出生后会消失丶只能在生成时设定的NBT

  有些NBT是认读的,就是只能检测,不能更改,比如OnGround丶HurtTime之类,都是改了没用的

  有些NBT是不一定会存在的,比如Slot标签,当物品不在储存格的时候是不会有这个标签的,所以检测这类的NBT时需要注意

  有些NBT出生后会消失,比如UUID

  有一些就是在生成时能够设定,之后就变成认读,比如Riding就是这类的NBT

  这些都是经验,由于这些东西数量太多,在这里就不一一列举了:D(别骂我偷懒QAQ)

  想知道的话可以加入一些专门研究命令方块的小组/其新手群,比如CBL (肯定不是广告) :D

  自定义NBT

  NBT其实是可以自定义的。

  自定义NBT主要的用途就是在一样东西需要转换形态的时候保留一些资料

  比如你要检测玩家的物品是不是你给他那个,你可以用物品的名字丶Lore等标签作识别,然而如果不想玩家知道,你就可以用自定义的NBT

  看起来识别这个用途和计分板有点重叠,其实不是的,这个功能需要依赖计分板,而且计分板也不能取代

  比如要在物品里储存资料,你“可以”为物品的掉落物添加分数,然而玩家建起了物品之后你就探测不到那个分数了,所以就需要自定义NBT

  自定义NBT非常简单,和普通设置差不多,就是那个标签的名字是你自定义的,而且那个数值需要严格来填写(和在检测类的命令一样)

  检测NBT

  相信大家都知道怎么检测NBT了,对于实体,有些人会用testfor,有些人会用计分板

  我个人是推荐使用计分板的,因为testfor不能把有特定nbt的实体标记出来,很可能会出现误判的情况

  检测NBT大部分人都会了,然而检测一个不一定存在的NBT你们会如何做呢?

  其实方法很简单,首先把所有实体的分数设置为0,然后把不同可能性列举出来去设置分数(设置的分数不可以为0),这样子如果分数为0,那个实体就是没有那个NBT了:D(其实就是逻辑的not)

  PS:在此非常感谢我的世界玩家pca006132的分享。

  以上就是我的世界NBT教程 NBT详解。更多精彩尽在游戏园我的世界专区。

  热门攻略推荐:

  我的世界霸气大炮制作思路解析

  我的世界生存模式攻略 躲避击杀怪物技巧

  我的世界天堂之门怎么做及地狱门制作教程

  我的世界神鬼的试炼地图下载

热门搜索

手游排行榜

  • 最新排行
  • 最热排行
  • 评分最高