2.1 新建配方及物品表示
一、物品的表示方法——IngredientJS和ItemstackJS
KubeJS提供了IngredientJS和ItemstackJS用于表示物品。比如,标签Ingredient.of("#minecraft:logs")
就是Ingredient,Item.of('minecraft:iron_ingot')
就是一个Itemstack
其中Ingredient多用于匹配物品。你可以使用Ingredient.matchAny("条件")
来获得一个包含当前筛选条件的物品组,其中条件可以为物品ID(minecraft:diamond
),mod注册名(@tinkersconstruct
),标签(#minecraft:logs
)
Itemstack主要用于表示准确的物品组,ItemstackJS可使用的属性/函数如下:
属性 | 功能 | 返回值 |
---|---|---|
id | 返回该物品组的id | 字符串 |
tags | 返回该物品组的tags | Collection tags |
count | 设置/返回该物品组中物品数量 | int |
block | 返回当前物品是否为方块 | 布尔值 |
nbt | 返回当前物品组的nbt | CompoundTag |
nbtString | 返回字符串形式的nbt | 字符串 |
name | 返回当前物品组的名称 | Text |
enchantments | 返回当前物品组的附魔 | MapJS |
harvestSpeed | 返回当前物品组的破坏速度 | 浮点型 |
itemGroup | 返回当前物品组在创造物品栏的位置 | 字符串 |
vanillaPredicate | 获取当前物品谓词(?) | Predicate |
empty | 返回当前物品组是否为空 | 布尔值 |
函数 | 功能 | 返回值 |
---|---|---|
hasTag(tag) | 判断物品是否有指定tag | 布尔值 |
withCount(整形 数量) | 返回一个指定数量的物品组 | ItemStackJS |
hasNBT() | 判断是否具有NBT | 布尔值 |
removeNBT() | 移除物品的NBT | void |
withNBT(CompoundTag nbt) | 返回具有指定NBT的物品组 | ItemStackJS |
withName(Text 名称) | 返回一个具有指定名称的物品组 | ItemStackJS |
strongEquals(any) | 将当前物品组与给定内容对比(同时比较数量等) | 布尔值 |
hasEnchantment(字符串 附魔ID, 整形 等级) | 判断当前物品组是否有给定的附魔 | 布尔值 |
enchant(字符串 附魔ID, 整形 等级) | 返回一个添加了指定附魔的物品组 | ItemStackJS |
enchant(MapJS 附魔内容) | 返回一个添加了指定附魔的物品组 | ItemStackJS |
ignoreNBT() | 返回忽略的NBT的IngredientJS | IngredientJS |
weakNBT() | 返回部分忽略的NBT的IngredientJS | IngredientJS |
areItemsEqual(ItemStackJS 对比对象) | 将当前物品组与给定物品组对比 | 布尔值 |
isNBTEqual(ItemStackJS 对比对象) | 将当前物品组与给定物品组的NBT对比 | 布尔值 |
getHarvestLevel(ToolType 工具类型, nullable PlayerJS 玩家, nullable BlockContainerJS 方块) | 返回其挖掘等级 | 整形 |
getHarvestSpeed(nullable BlockContainerJS 方块) | 返回其挖掘速度 | 浮点型 |
配方修改需要用到的大都是上表加粗的内容,剩余的内容大都等到第15章判断物品状态时才会用到。
估计你看到上面这些东西得有点麻了,不要慌,让我们看几个例子
例子 | 意义 |
---|---|
Item.of("minecraft:iron_ingot").withCount(5) | 5个铁锭 |
Item.of("minecraft:iron_ingot").withCount(5).withName("KubeJS魔改教程") | 5个名字为"KubeJS魔改教程"的铁锭 |
Item.of("minecraft:diamond_sword").ignoreNBT() | 忽略了NBT的钻石剑(长用于忽略物品耐久、附魔等属性) |
Item.of("minecraft:enchanted_book", {StoredEnchantments:[{lvl:1,id:"minecraft:sweeping"}]}) | 横扫之刃I附魔书(直接添加NBT例子) |
Item.of("minecraft:enchanted_book").enchant("minecraft:sweeping", 1) | 横扫之刃I附魔书(使用函数添加NBT例子) |
Item.of(/create:.*/) | 所有机械动力物品(正则表达式) |
显然,上面的方法表示物品非常麻烦。KubeJS提供了一些简写方法:
你可以使用命名空间ID直接表示一个物品,如"minecraft:iron_ingot"
你可以直接使用标签的字符串表示这一标签下的使用物品,如"#minecraft:logs"
你可以在命名空间前加上倍数来表示物品个数,如"5x minecraft:iron_ingot"
表示五个铁锭
当然,你也可以直接使用正则表达式
你可以使用指令/kubejs hand来快速获取手持物品信息,详见1.1 基础代码格式和常用指令
二、配方的添加
1、有序配方添加
语句:event.shaped(输出物品 , 输入物品)
例子:用8个海绵合成3个石头
可以看到,KubeJS采用了类似原版的格式来修改配方,如果你的配方不需要三行的话,直接留空即可
注:下文为了表述简洁将省略onEvent部分
2、无序配方添加
语句:event.shapeless(输出物品 , 输入物品)
例子:用1个石头和1个带萤石粉标签的物品合成4个圆石
3、切石机、熔炉、高炉、烟熏炉、锻造台配方的添加
4、NBT和配方ID
带NBT的配方修改
mc中所有的配方都有一个随机的ID,但以下配方被指定了一个唯一的静态ID。这个功能对于编写Patchouli手册比较有用