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]}) | 横扫之刃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个石头
onEvent('recipes', event => { // 监听recipes事件
// 主体修改内容
event.shaped('3x minecraft:stone', [
'SSS',
'S S',
'SSS'
], {
S: 'minecraft:sponge'
})
})
可以看到,KubeJS采用了类似原版的格式 来修改配方,如果你的配方不需要三行的话,直接留空即可
注:下文为了表述简洁将省略onEvent部分
2、无序配方添加
语句:event.shapeless(输出物品 , 输入物品)
例子:用1个石头和1个带萤石粉标签的物品合成4个圆石
event.shapeless('4x minecraft:cobblestone', ['minecraft:stone', '#forge:dusts/glowstone'])
3、切石机、熔炉、高炉、烟熏炉、锻造台配方的添加
// 添加切石机配方:用1个minecraft:golden_apple合成4个minecraft:apple
event.stonecutting('4x minecraft:apple'/* 输出物品 */, 'minecraft:golden_apple'/* 输入物品 */)
// 添加切石机配方:用1个minecraft:golden_apple合成2个minecraft:carrot
event.stonecutting('2x minecraft:carrot'/* 输出物品 */, 'minecraft:golden_apple'/* 输入物品 */)
// 添加熔炉配方:用1个minecraft:golden_apple合成2个minecraft:carrot
// (event.recipes.minecraft.smelting的缩写)
event.smelting('2x minecraft:carrot'/* 输出物品 */, 'minecraft:golden_apple'/* 输入物品 */)
// 添加高炉,营火和烟熏炉的配方(与上文类似)
event.blasting('3x minecraft:apple', 'minecraft:golden_apple')
// 添加锻造台配方,将后2个物品合并成第一个物品 (将minecraft:gold_ingot和minecraft:apple合成为minecraft:golden_apple)
event.smithing('minecraft:golden_apple', 'minecraft:apple', 'minecraft:gold_ingot')
4、NBT和配方ID
带NBT的配方修改
event.shaped('minecraft:book', [
'CCC',
'WGL',
'CCC'
], {
C: '#forge:cobblestone',
L: Item.of('minecraft:enchanted_book', {StoredEnchantments:[{lvl:1,id:"minecraft:sweeping"}]}),
// 尽管格式是相同的,但是对于附魔来说,你还可以将其简写成如下形式:
W: Item.of('minecraft:enchanted_book').enchant('minecraft:respiration', 2),
G: '#forge:glass'
})
mc中所有的配方都有一个随机的ID,但以下配方被指定了一个唯一的静态ID。这个功能对于编写Patchouli手册比较有用
event.smelting('minecraft:golden_apple', 'minecraft:carrot').id('wudjimodpack:wudji_first_recipe_id'/* 配方ID */)