官方文档给我干懵了,我研究了一个下午加晚上还翻了源代码,人都麻了

特别鸣谢: [ET2] 玄理2 (EnigTech 2) 

IMachineRegistry - CraftTweaker Documentation (blamejared.com)

diy一个发电机

在我们写机器的zs文件之前,我们需要为机器准备正面贴图,这个需要前置 [RL] 资源加载 (Resource Loader) 

我们需要在

.minecraft\versions\“你的整合包名字”\resources

里新建一个文件夹,名字是英文+小写

然后在里面新建一个文件夹textures(必须是这个)

最后我们把需要用到的贴图全部塞进去(你可以去把exu2的预设贴图全部搬过来)

自定义单方块机器与发电机教程-第1张图片

大概是这个样,出于分类的考虑,我在textures目录下多创了一个block文件夹,这个是不影响的,只要我们后面路径写对了即可(所有贴图必须在textures下)

好的我们开始写scripts了:

#loader preinit
import extrautilities2.Tweaker.IMachineRegistry;
import extrautilities2.Tweaker.IMachineSlot;
import extrautilities2.Tweaker.IMachine;

//测试用发电机(注意这里的函数是“generator”)
IMachineRegistry.createNewGenerator(
    "generator_test", //机器名称
    10000, //电量缓存
    4000, //最大输出
    [
    IMachineSlot.newFluidSlot("test_liquid", 4000,true,null), //流体槽(槽位名称,流体容量,是否可选,流体过滤器)
    IMachineSlot.newItemStackSlot("test_item",true,64) //物品槽(槽位名称,是否可选,槽位容量)
    ], //这个中括号里边的是输入槽
    [], //输出槽(由于是发电机所以没写输出槽,写当然是可以写的,可以参考后面机器的写法)
    "test:block/generator_off", //待机时的正面贴图(没有textures和.png)
    "test:block/generator_on", //工作时的正面贴图(没有textures和.png)
    0xe8f100 //颜色代码,可以不写,默认是ffffff
);

多槽位意味着我们必须把“是否可选”改成“true”,不然会出现:配方里只需要物品槽的物品,但是流体槽是必选的,这个配方就运作不了的情况

注意,由于exu2在写流体槽创建函数的时候没有把“是否可选”和“过滤器”分开,所以如果要让槽位可选,就不得不加上后面的过滤器

注注意,由于#loader preinit,机器的过滤器功能无法获取任何流体或物品,所以只能写null

补充,没有#loader preinit会导致机器没有正面贴图(但是可以使用exu2已有机器的贴图,预设贴图不行,必须是已加载的)

自定义单方块机器与发电机教程-第2张图片

接下来我们添加本地化(在resources文件夹里新建exu2的文件夹及其language文件夹)

resources\extrautils2\lang

新建文件zh_cn.lang

写法为

machine.crafttweaker:注册名=本地化名称

machine.crafttweaker:generator_test=测试用发电机

自定义单方块机器与发电机教程-第3张图片

然后我们另开一个zs写机器配方

import extrautilities2.Tweaker.IMachineRegistry;
import extrautilities2.Tweaker.IMachineSlot;
import extrautilities2.Tweaker.IMachine;

var generator_test = IMachineRegistry.getMachine("crafttweaker:generator_test");

generator_test.addRecipe({
    test_item : <minecraft:iron_ingot>*2, //注意,exu2虽然支持矿词,但是这会导致只能输入输出一个物品
},
 {}, 10000, 100, {}); //配方添加(输入物品或流体,输出物品或流体,产出能量,持续时间,产出物概率)

generator_test.addRecipe({
    test_liquid : <liquid:test>*4000
},
 {}, 10000, 100, {});

 generator_test.addRecipe({
    test_item : <ore:ingotTest>, //这里的矿词就只能*1了,不能写*2以上
    test_liquid : <liquid:test>*4000
},
 {}, 30000, 100, {});

注意,配方输入输出的写法是关联数组,为花括号{ }里key值对应的物品或流体(key值为槽位名称)

如果没有输出物品就写个空数组即可

自定义单方块机器与发电机教程-第4张图片

成了

diy一个机器

#loader preinit
import extrautilities2.Tweaker.IMachineRegistry;
import extrautilities2.Tweaker.IMachineSlot;
import extrautilities2.Tweaker.IMachine;

//注意这里的函数名称变了
IMachineRegistry.createNewMachine(
    "alloy_furnace",
    65565,
    4064,
    [
    IMachineSlot.newItemStackSlot("item1"),
    IMachineSlot.newItemStackSlot("item2"),
    IMachineSlot.newItemStackSlot("item3"),
    IMachineSlot.newItemStackSlot("item4")
    ],
    [IMachineSlot.newItemStackSlot("output")],
    "test:block/alloy_furnace_off",
    "test:block/alloy_furnace_on",
    0x576363
);

然后是本地化

machine.crafttweaker:alloy_furnace=四槽合金炉

最后是配方

import extrautilities2.Tweaker.IMachineRegistry;
import extrautilities2.Tweaker.IMachineSlot;
import extrautilities2.Tweaker.IMachine;

var alloy_furnace = IMachineRegistry.getMachine("crafttweaker:alloy_furnace");

alloy_furnace.addRecipe({
    item1 : <ore:ingotIron>,
    item2 : <ore:ingotNickel>,
    item3 : <ore:ingotManganese>,
    item4 : <ore:ingotChrome>
}, //由于我用了矿词,所以输入输出不能写多个
 {output : <ore:ingotModularium>}, 10000, 100, {output : 1.0 as float}); //注意这里的产出概率的写法也是数组

自定义单方块机器与发电机教程-第5张图片自定义单方块机器与发电机教程-第6张图片

好了,教程结束,如果有误请帮我指出

exu2的diy机器非常不完善,bug还多,不推荐用来做非常复杂的机器,做个发电机过过瘾就差不多了