我们都知道实体有实体共通标签,实体中的弹射物有弹射物共通标签。箭属于弹射物,它像矿车一样,拥有许多种类(额......实际上,除了光灵箭以外,其他的箭只是药水效果不同而已)。既然矿车拥有自己的共通标签,那箭呢?
let us open minecraft and have a look.
我们打开1.12.2版本,一进游戏就先往天空射一发,然后在箭落地之前快速敲下“\/entitydata [type=arrow]{have_a_look:1b}”,然后这支箭的nbt标签就多了一个:
have_a_look:1b
的标签,同时我们也获得了这支箭的nbt标签:
{motion:[-0.0d,1.d,-0.01 d],damage:2.0d,shake:0b,xtile:-1,uuidleast:-85 l,inground:0b,pickup:2b,invulnerable:0b,air:300s,onground:0b,dimension:0,portalcooldown:0,rotation:[-135.f,89.0f],life:0s,falldistance:0.0f,intile:“minecraft:air“,uuidmost:-l,indata:0b,crit:1b,pos:[651.d,57.0d,41.00d],have _a_ look:1b,ztile:-1,fire:0s,ytile:-1}
看着有点晕是吧?好,那我们归纳一下。
在这串nbt内,除了我们的have_a_look标签,其他的标签一共有24个。分类一下,可以得到:
tags mon to all entities={motion,uuidleast,invulnerable,air,onground,dimension,portalcooldown,rotation,falldistance,uuidmost,indata,crit,pos,fire}zuqi.org 葡萄小说网
unknow tags={damage,shake,inground,pickup,intile,indata,crit,ytile,ztile,xtile}
这些标签中一共有10个我们还不知道是个啥,那今天我们就来仔细研究研究。
“damage”这个单词是“损坏”的意思,可作为名词或动词。但实际上按照这个标签的用途来说,它在这应该是个使动用法的谓语动词(????):使......损坏。再看看上面这串nbt,它的值是“2.0d”,最后的这个“d”,说明damage的值是双精度浮点数。
这标签的用途到底是什么?我们来个反向思维,damage的主语在这边应该是箭,即:
arrows damage ......(箭使.......损坏了)
箭会使什么东西损坏?肯定是射中的实体啦!所以damage的作用就是:
设定箭将造成的伤害。
上面nbt中damage的值是2.0d,就代表着这个箭射中实体将造成2滴血(1颗心)的伤害。由于是双精度浮点数的值,所以这不一定是个整数。这个值会随着发射该箭的武器所有的力量附魔等级而变化,具体是力量附魔每高一级,就会增加0.5的值。假设你用一个附魔了级力量的弓发射这支箭,那么该值将会是:
.0d(x0.5+2.0)
等等,实际上还要再加一个0.5,因为只要一把弓附魔了力量,不管是多少级,都会额外加上0.5,然后再加上(0.5x力量等级)。所以,实际上的值应该是:
.5d
实际上箭造成的伤害不会那么低。箭的伤害还有被箭的速度影响,具体公式如下:
v箭xdamage+暴击伤害=真实伤害
但还有一些情况伤害是个定值,如发射器射出的箭伤害一定是3滴血。
damage是这样,那接下来的shake又是何物?
shake的意思是“摇”,这个比较难猜,就直接上答案:
当箭击中方块时,shake将会设定为7(单位为游戏刻)。在shake还未降为0时,就是箭的“抖动状态”,玩家此时不能捡起箭,需待shake为0时,方可捡起。
上面nbt中的shake值为0b,b就说明这是字节型数值。这个0,说明这支箭可能还在飞行,也可能已经落地超过0.35秒了。
那该如何判断一支箭是否落地了呢?
ground的意思是“地面”,作为动词时有“着陆”的意思。上面,我们归纳出的第三个我们还不知道是干啥的nbt标签是“inground”。in the ground是一个短语,和on the ground意思差不多,都是“在地面”的意思,只不过前者更注重于强调“接触”。
那“inground”的作用大家应该猜到了吧?即:
箭是否接触地面。
上面的nbt标签中,inground的值是:
0b
说明inground的数值类型为byte(字节型),同时这个0(false)也说明了这支箭还在飞。如果这里的值不是0,而是1(true),那就是接触地面了。
当一支箭接触到地面,就代表玩家可以捡起它。但,众所周知,小白射出的箭玩家是不能白嫖的,你知道这是为什么吗?
你肯定不知道,但看完下面这一段,你就知道了。
实际上,不光是小白的箭无法捡起。当你开启创造模式用弓射一发再调成生存时,你会发现你照样无法捡起创造模式射出来的箭。
为啥?
pickup这个单词的意思是“皮卡”,但这边应该把它拆分成pick up(捡起)。
既然pick up的意思是捡起,那么就是对捡起的设置咯?
对!
在上面的nbt中,pickup的值是2b,b说明这也是一个byte字节型标签。那这个2说明了什么?
pickup的值你翻遍整个minecraft之后会发现只有三种:
小白射出的箭——0
你在非创造模式射出的箭——1
你在创造模式射出的箭——2
结合你玩minecraft的经验和作者上面分享的发现,可以得出:
非玩家生物射出的箭:0——不可被玩家捡起
非创造模式玩家射出的箭(发射器也算):1——可被除旁观者模式外其他模式玩家捡起(注:wiki上言“可以被玩家在生存或创造模式中捡起”,未提冒险模式,但作者实测冒险模式也可以捡起)
创造模式玩家射出的箭:2——只可被创造模式玩家捡起
现在我们可以回答上面的问题了:
这个2说明了这是一个创造模式玩家射出的箭
(注:用指令生成的箭pickup值也是0,即不可被捡起。推测是游戏本身产生的箭都不可以被玩家捡起)
........
在之前,我们遇见过两个在1.13扁平化中被合并的nbt标签,这两个标签相信大家还记得,它们是:
disytile+disydata=disystate(矿车共通标签)
block+data=blockstate(下落的方块)
现在,我们在1.12.2版本的箭共通标签遇见了:
intile和indata
这两个nbt标签和我们之前遇见的那两个标签在未合并之前的构造非常相似,那么它们是否在1.13版本中被合并了?
disystate和blockstate有个共同点,就在于他们都是与方块有关系。合并之前,它们都分别有一个用来表示数据值的标签:disydata和data。数据值在1.13版本中被删除,所以这种类型的标签也就合并了。
indata和disydata、data一样,末尾都有一个“data”,那indata是否就是表示方块数据值所用呢?
indata如果真是表示数据值,那intile呢?是不是用来表示方块id?
您别说,还真是。
在上面的nbt中,这两个标签的值分别是:
intile:“minecraft:air“
indata:0b
你看,这minecraft:air不就是空气方块吗?这“0”不就是方块数据值吗?
这两个标签存的是啥我们知道了,但用处呢?
我们已经知道这支箭是飞在空中的,既然这里是空气方块,那么这两个的作用难道是.......
这支箭所处的方块?
您别说,您又对了。这两个标签的作用还真是这样的。
但我们还没有回答上面的问题呢。实际上的确是被合并了。至于合并成了什么东西.......
已知block+data=blockstate,block=tile,求单词式intile+indata的单词值。
解:
intile+indata=in(tile+data)1
将block=tile代入1,得
intile+indata=in(block+data)2
将block+data=blockstate代入2,得
intile+indata=inblockstate
∴intile+indata=inblockstate
1.13版本扁平化过后,intile和indata被合并成inblockstate(值类型:复合标签),内含两个nbt标签:
name(字符串)——该方块的id
propertie(复合标签)——该方块的命名空间
——方块状态名称:值(类型:字符串)
......
crit这个单词的意思是“暴击”。在上面的nbt中,crit标签的值是:
1b
说明crit标签的值类型是byte字节型。既然值类型是字节型,那就说明这个标签的作用不是确定这支箭暴击的伤害,而是这支箭是否会造成暴击。
所以,这支箭会造成暴击,因为它的crit值是1。
crit标签在1.11版本才被添加,1.11版本前没有这个标签,这需要注意一下。
最后,我们还剩下三个我们还未曾见过的标签:
xtile,ytile,ztile
这三个标签在上面的nbt中值都为-1,且没有类型字母,应该是long长整型。并且它们三看起来跟坐标有关,而且坐标的三个值也是长整型......
首先,我这边说一点,这三个标签不是箭共通标签内的,它们还出现在1.11以前的鱼竿浮标和火球类实体(如火焰弹,凋零之首)中。至于它们三有什么用,我们以后再了解。
现在我们知道箭共通标签内有这些东西:
damage、shake、inground、pickup、intile和indata(inblockstate)、crit,那这就是全部了吗?
不,在更新的版本中,还有一些更新的标签:
piercelevel(byte:字节型)——中文wiki介绍是“箭能射穿实体的时间长度”,但这好像并不是这个用途
shotfromcrossbow(byte:字节型[true|false])(1.14+)——表示这支箭是否来自于一把弩
soundevent——击中东西时触发的声音事件
soundevent我们先不用管。这个piercelevel我本人也搞不懂,返回的值一直是0b,这可能是在击中实体的那一瞬间才可能会变化。剩下的这个,就是shotfromcrossbow。
shotfromcrossbow很简单,上面都介绍过了,相信只要是看得懂的都能懂吧?
总之,只要shotfromcrossbow的值为1b,那么这箭就来自一把弩,0b则来自其他的东东。
这就是“箭共通标签”。