[KubeJS 1.20.1]面向新手的较全面NBT介绍 - [KJS]KubeJS - MC百科

记得我初学KubeJS时,百科上似乎没有一篇教程较为系统地介绍了NBT的有关属性或方法。由于引导的缺失,本小白在编写有关NBT的脚本时走了不少弯路,这篇教程是我到目前为止所摸索出来的一些方法,希望对于刚入坑KubeJS的新手有所帮助。
本篇教程所涉均为Forge端1.20.1版本。
首先,你需要具备一些JavaScript基础知识,如果你是纯正的0基础新手,请移步前往给 KJS 用户的 JavaScript 快速入门,这对你后续编写KubeJS脚本具有很重要的意义。
接下来让我们粗浅地了解一下NBT是什么,如何查看物品的NBT,以及怎样对NBT进行编辑。
NBT是Minecraft中用于存储各种数据的文件格式,特别用于存储方块、实体和物品的信息。每个方块、实体和物品都有一组NBT标签,这些标签以树形结构存储数据,每个标签都有一个独立的ID和名称。说人话,NBT能够反映当前方块、实体、物品的状态。
查看物品NBT的方法很简单,在游戏内按下F3 + H打开高级提示框,在任意GUI中将光标移动到物品上按下Shift即可查看物品当前具有的NBT信息。至于如何查看方块或实体NBT,恕我愚钝,目前还未使用过,无法给出一个简便的方法。
NBT在显示时是被大括号包裹起来的,每个NBT之间都用逗号隔开,那么你能够联想到什么?没错,就是对象。
这也就使得NBT编辑变得相当便利,不妨看看下面这段代码。
item.nbt.Damage 上述item是任意的,注意不要忽略其他的代码段,这里的写法仅仅只是为了展示基本的NBT写法,不要无脑抄!
如何访问NBT?上述代码给出了最简单的写法,即通过类似对象的写法来访问具体的NBT,这里的Damage代表了该物品当前的损毁度,为0即为满耐久。
除了这种最简单的访问NBT的写法之外,有更严格的写法,需要调用方法get。
item.nbt.getInt('Damage') 这里的写法更加严格,getInt就代表着返回值是整数。
熟悉JavaScript的同学知道,在JS中还有 ?.,即可选链的方式来访问对象,如果访问的对象不存在就返回undefined,防止报错。但是,可选链的应用是有一定限制的,例如下面的代码。
item.nbt?.Damageitem.nbt?.getInt('Damage') 第一种方式不会报错,如果该物品没有Damage这个NBT,返回的就是undefined,第二种方式不论物品有没有这个NBT,一定报错,切记!
get这个方法中还有许多,不仅仅能够返回Int类型的数据,Float、Double、String等都是可以返回的。
接下来,我们尝试如何修改NBT。
修改NBT主要包括以下三类:修改物品本身具有的NBT、添加物品不具有的NBT、移除物品的NBT。我们先讲如何修改物品本身具有的NBT。
item.nbt.Damage = item.nbt?.Damage + 1 这一段代码应当是修改NBT最简单的方法,其代表的意义就是将物品的损毁度 + 1,也即耐久度 - 1。这里需要注意,如果你使用这种方法来修改NBT,修改后的NBT部分不能使用可选链。
这一个方法虽然简单,但是只能用于修改物品已有的NBT,如果我们想要添加物品本身没有的NBT该怎么做呢?
item.setNBT({ Hurt: 1}) 通过setNBT的方法,我们就能够设置物品的NBT,但是需要注意,该方法会改变原有的物品NBT。
item.nbt.merge({ Hurt: 1 })item.nbt.putInt('Hurt', 1) 这两个方法都是在不改变原先NBT的基础上添加自定义的NBT标签。同理,put也能够添加Float等类型的数据。
同时,我们也可以对嵌套的NBT进行修改或完全自定义。
item.nbt.map = {}item.nbt.map.attackAttribute = 10 首先,我们先定义了map这个NBT,把它作为一个对象,attackAttribute作为其中的一个属性,赋值为10。通过类似的方式,我们就可以定义嵌套的NBT。
那么,如何删除NBT?这很简单,只需要一个remove就可以了。
item.nbt.remove('Damage') 这样写就能够删除Damage这个NBT标签啦。
上述的修改方法仅仅只是提供了基础的NBT修改方式,事实上,关于NBT还有许多方法没有讲,大家可以自行探索。