看,这是一头有胡子的粉红羊!
(在哪?我怎么没看到?)
它作为一个实体,肯定也有自己的NBT标签。
在这些NBT标签中,有很大一部分是大部分实体通用的。
具体是哪些呢?
首先,和物品一样,游戏也会通过实体的NBT来识别该实体到底是什么实体,这就需要用到id这个标签。id标签的数据类型是文本(String字符串),它存储着这个实体的命名空间ID。比如这只羊的id标签就是:
{id:“minecraft:sheep“}
需要注意,id标签由于是用来判断实体类型的,十分重要,所以我们在游戏中无法通过指令来获取并修改它,也就是说你并不能把这只羊变成一只猪。另外,玩家虽然也是实体,但没有id标签。
id可以判断实体的类型,但如果游戏还想更精确地判断这个实体到底是哪个个体,就需要使用到UUID。实体的UUID数据也存储在自身的NBT中,也就是说我们可以通过NBT来获取到实体甚至玩家的UUID。
UUID的NBT存储方式在Java1.16版本中迎来了巨大改变,这件事我们已经在第一百一十章了解过了。在Java1.16之前,实体的UUID在NBT中是以『高低位』的方式存储,也就是像下面这样子:
{UUIDMost:L,UUIDLeast:-L}
其中,值后面的大写字符『L』代表这两个标签的数据类型都是Long长整型。目前你只需要知道这种整型能够存储很大的数字即可。需要注意的是由于计分板数据类型是Int整型,所以你并不能直接将实体的UUID高低位存进计分板中。
在Java1.16更新后,实体的UUID改成了用Int整形数组来存储:
{UUID:[I;-,-,-,]}
由于改成了Int整型数组的存储方式,所以在Java1.16版本更新后,你就可以直接将实体的UUID存入计分板。
一个实体除了自身的类型和UUID,还有许许多多的数据。让我们仔细思考一下,可能还会有哪些数据。
一个实体肯定会有位置,所以NBT中自然也要存储实体的位置数据。Pos标签就是干这个的。
Pos的数据类型是『Double双精度浮点数列表』,列表内的三个元素从左到右分别存储着该实体的X、Y、Z坐标数据。比如:
{Pos:[14.d,72.0d,133.d]}
这代表着该实体处于(14.,72,133.)这个位置。
和Pos作用类似的标签还有Rotation。Rotation标签的数据类型是『Float单精度浮点数列表』,列表内的两个元素分别记录着这个实体的水平旋转和垂直旋转角度。比如:
{Rotation:[322.f,0.0f]}
这代表着该实体正水平地朝向南偏东37.°的方向。等等!『322.』?!
还记得本书在第二十六章曾经写过这么几句话吗:
『等等,我们在讲tp时,不是说水平旋转角度是:「以实体为中心,以正南(z轴正方向)为0°,顺时针下来,实体朝向和正南方向的夹角(也或者说实体在真南方位角体系中朝向的角度),就是该实体的水平旋转角度。」
那这怎么跑出来负数了?
其实在Minecraft中,水平旋转角度虽然可以像我们之前在第九章讲tp时那么用,但大多数时候,你都得这么用: