Skip to content

2.2 配方的添加,修改和移除

关于ProbeJS提示

带有🔎符号的段落代表该段内容ProbeJS中有语言文档,或使用ProbeJS编写较为简便。


一、配方事件

要修改配方,你需要在ServerEvents.recipes事件下注册一个“事件监听器”,并在该事件下完成所有修改,例如:

js
ServerEvents.recipes(event => {
  // 该部分为回调函数
  // 本节中的示例脚本将只包括此部分内容
  console.info('ServerEvents.recipes触发')
})

以下为配方事件支持的部分方法:

方法 描述 返回值
forEachRecipe(RecipeFilter 过滤器, Consumer consumer) 对所有满足过滤器的配方进行修改 void
countRecipes(RecipeFilter 过滤器) 返回满足过滤器的配方个数 整形
containsRecipe(RecipeFilter 过滤器) 返回是否存在满足给定过滤器的配方 布尔值
remove(RecipeFilter 过滤器) 移除满足给定过滤器的配方,并返回移除个数 整形
replaceInput(RecipeFilter 过滤器, IngredientMatch 被替换物品, Ingredient 替换物品) 对所有满足过滤器的配方进行修改:替换输入物品,并返回操作个数 整形
replaceOutput(RecipeFilter 过滤器, IngredientMatch 被替换物品, ItemStack 替换物品) 对所有满足过滤器的配方进行修改:替换输出物品,并返回操作个数 整形

二、配方添加

🔎 event.recipes可以获取所有存在的配方类型(DocumentedRecipes),其属性为命名空间。你可以通过这种情况修改所有支持的配方,例如:

js
ServerEvents.recipes(event => {
	// 营火配方:红石烧烤得到红石火把
	event.recipes.minecraft.campfire_cooking('minecraft:redstone_torch','minecraft:redstone')
})

以下为一些简写方法:

1、有序配方添加

语句:event.shaped(输出物品 , 形状 , 输入物品)

例子:用 4个海绵 和 4个钻石 合成 3个石头

js
event.shaped(Item.of('minecraft:stone', 3), [
		'LOL',
		'O O',
		'LOL'
	],
    {
		L: 'minecraft:sponge',
		O: 'minecraft:diamond'
})

2、无序配方添加

语句:event.shapeless(输出物品 , 输入物品)

例子:用 1个海绵 和 1个带有木板标签的物品 合成2个石头

event.shapeless(Item.of('minecraft:stone', 2), ['minecraft:stone', Ingredient.matchAny('#minecraft:planks')])

3、锻造台配方

语句:event.smithing(输出物品, 目标物品, 消耗物品)

例子:苹果 + 金锭 -> 金苹果

js
event.smithing('minecraft:golden_apple', 'minecraft:apple', 'minecraft:gold_ingot')

4、熔炉配方

语句:event.smelting(输出物品, 输入物品)

例子:1个金苹果 经熔炉烧炼得到 32个胡萝卜

js
event.smelting('32x minecraft:carrot', 'minecraft:golden_apple')

5、烟熏炉配方

语句:event.smoking(输出物品, 输入物品)

例子:玻璃经烟熏炉烧炼得到遮光玻璃

event.smoking('minecraft:tinted_glass', 'minecraft:glass')

注:燃料需要在烧炼事件中进行更改

6、营火配方

语句:event.campfireCooking(输出物品, 输入物品)

例子:木棍经过营火烧炼得到火把

js
event.campfireCooking('minecraft:torch', 'minecraft:stick')

7、切石机

语句:event.stonecutting(输出物品, 输入物品)

例子:1个带有木板标签的物品合成3个木棍

js
event.stonecutting('3x minecraft:stick', '#minecraft:planks')

8、高炉

语句:event.blasting(输出物品, 输入物品)

例子:金苹果经过高炉烧炼得到3个苹果

js
event.blasting('3x minecraft:apple', 'minecraft:golden_apple')

三、配方过滤器及配方的修改和移除

1、配方过滤器

配方过滤器可在配方修改或移除中用于匹配符合条件的配方,其包括以下类型

写法 描述 示例
{output:'物品'} 匹配输出物品 {output: '#minecraft:wool'}
{input:'物品'} 匹配输入物品 {input: '#forge:dusts/redstone'}
{mod:'模组ID'} 匹配模组ID {mod: 'kubejstutorial'}
{recipe:'配方ID'} 匹配配方ID {mod: 'xplusmodpack'}
{type: '配方类型'} 匹配配方类型 {type: 'minecraft:campfire_cooking'}
{条件1:"值",条件2:"值"} 组合过滤器(与) {output: 'minecraft:cooked_chicken', type: 'minecraft:campfire_cooking'}
[{条件1:"值"}, {条件2:"值"}] 组合过滤器(或) [{type:'minecraft:smelting'}, {type:'minecraft:blasting'}]
{not:{条件:"值"}} 组合过滤器(非) {not:{type:"minecraft:smelting"}}

上表中组合过滤器依旧可以多层叠加,从而实现更复杂的条件判断,详见下方示例。

2、配方修改

语句 描述
event.replaceInput(配方过滤器, 被替换物品, 替换物品) 修改输入物品
event.replaceOutput(配方过滤器, 被替换物品, 替换物品) 修改输出物品

例子:在输出物品为minecraft:ladder的配方中,将输入物品中的木棍替换为树苗

js
event.replaceInput(
    { output: 'minecraft:ladder' }, // 物品过滤器(匹配输出物品)
    'minecraft:stick', // 被替换物品
    Ingredient.of('#minecraft:saplings') // 替换物品
    // 注意:流体标签在Fabric端不可用。
)

例子:在所有配方中,将输出物品中的minecraft:stick替换为minecraft:oak_sapling

js
event.replaceOutput({}, 'minecraft:stick', 'minecraft:oak_sapling') // 物品过滤器留空

例子:在所有无序配方中,将minecraft:iron_nugget替换为minecraft:gold_nugget

js
event.replaceInput({type: 'minecraft:crafting_shapeless'}, 'minecraft:iron_nugget', 'minecraft:gold_nugget')

3、配方移除

语句:event.remove()

js
// 物品过滤器例子 + 配方移除例子
// 移除所有配方:
event.remove({}) 
// 移除输出物品为石斧的配方:
event.remove({output: 'minecraft:stone_pickaxe'}) 
// 移除输出物品带有羊毛tag的配方:
event.remove({output: '#minecraft:wool'})
// 移除输入物品带有红石tag的配方:
event.remove({input: '#forge:dusts/redstone'})
// 移除农夫乐事添加的配方:
event.remove({mod: 'farmersdelight'})
// 移除所有营火配方:
event.remove({type: 'minecraft:campfire_cooking'}) 
// 移除除熔炉以外所有输出物品为石头的配方:
event.remove({not:{type:"minecraft:smelting"},output:"stone"}) 
// 移除输出物品为熟鸡肉的营火配方:
event.remove({output: 'minecraft:cooked_chicken', type: 'minecraft:campfire_cooking'})
// 移除熔炉或高炉的输出物品为铁锭的配方:
event.remove([{type:'minecraft:smelting',output:'minecraft:iron_ingot'}, {type:'minecraft:blasting', output:'minecraft:iron_ingot'}])	  
// 通过ID移除配方(data/minecraft/recipes/glowstone.json):
// 注:配方ID和输出物品是两个概念!
event.remove({id: 'minecraft:glowstone'})

另请参阅:RecipesEventJS

四、配方ID

mc中所有的配方都有一个随机的ID,但以下配方被指定了一个唯一的静态ID,可用于编写Patchouli手册或覆盖已存在配方等。

你可以通过JEI/REI来便捷地查询配方的ID。

js
event.smelting('minecraft:golden_apple', 'minecraft:carrot').id('wudjimodpack:wudji_first_recipe_id')

Contributors

Changelog