我的世界kubejs本体编写mod机器配方的builder
由于犀牛引擎不支持JavaScript的class对象,所以只能使用function的protype来建立一个类似于class的function,具体解析如下:
配方Json样本:
{
"type": "ae2:inscriber",
"mode": "inscribe",
"result": {
"item": "ae2:printed_calculation_processor"
},
"ingredients": {
"top": {
"item": "lazierae2:universal_press"
},
"middle": {
"item": "ae2:certus_quartz_crystal"
}
}
}
代码:
//AE2的压印机
function ae2Inscriber() {
//初始化配方主体
this.recipe = {
type: 'ae2:inscriber',
mode: 'press',
result: {},
ingredients: {}
}
}
//定义方法,注意每个方法除了build和replace方法为最终创建方法外,都需要return本身以方便多次调用方法来设置属性
ae2Inscriber.prototype = {
//更改配方模式
setMode: function (mode) {
this.recipe.mode = mode;
return this;
},
//更改输出物品
setResult: function (result) {
this.recipe.result = result;
return this;
},
//更改顶部输入,格式为Ingredient
setIngredientsTop: function (ingredientsTop) {
this.recipe.ingredients.top = ingredientsTop;
return this;
},
//更改中间输入,格式为Ingredient
setIngredientsMiddle: function (ingredientsMiddle) {
this.recipe.ingredients.middle = ingredientsMiddle;
return this;
},
//更改底部输入,格式为Ingredient
setIngredientsBottom: function (ingredientsBottom) {
this.recipe.ingredients.bottom = ingredientsBottom;
return this;
},
//如果是shapeless配方怎么办?即输入的Ingredients为一个数组,这里假设压印器的ingredients是一个数组
//addIngredients: function (Ingredients) {
//this.recipe.ingredients.push(Ingredients);
// return this;
//},
//Over
//创建配方,需要传入recipe事件和配方名称,自动生成配方的ResourceLocation,namespace为预先设置的常量,或者直接改为你需要的字符串即可
//可以取消配方名称设置但是下面的replace方法也要去掉该变量的传入
build: function (event, recipename) {
event.custom(this.recipe).id(namespace + ':inscriber/' + recipename);
return;
},
//替代配方,先根据配方id删除配方,然后调用build创建配方
replaceRecipe: function (event, recipeid) {
event.remove({ id: recipeid });
let recipename = recipeid.split(':')[1].split('/').pop();
this.build(event, recipename);
}
};
//上面一个压印器的builder定义就完成了,以下是调用
onEvent('recipes', event => {
//在recipes事件内调用builder
new ae2Inscriber()
//设置输出,参数为Ingredient,支持修改数量、NBT等,详见其他教程,下同
.setResult(Item.of('ae2:logic_processor').toJson())
//设置压印模式为压印
.setMode('press')
//设置顶部输入为逻辑电路板
.setIngredientsTop(Item.of('ae2:printed_logic_processor').toJson())
//设置中间输入为标签:铜锭
.setIngredientsMiddle(Ingredient.of('#forge:ingots/copper').toJson())
//设置底部输入为硅板
.setIngredientsBottom(Item.of('ae2:printed_silicon').toJson())
//调用替代方法,替代原有的配方
.replaceRecipe(event, 'ae2:inscriber/logic_processor');
});