本篇教程由作者设定使用 CC BY-NC 协议。

由于笔者是初次尝试魔改,把经验分享给有想法魔改GTM的玩家,因此难免会有差错,还望谅解斧正

主要参考了官方给出的文档https://github.com/Drackion/GregTechCEu-1.19/wiki/KubeJS#recipe-additions


配方类型(recipe_type)

众所周知KubeJS添加配方需要知道合成配方的配方类型,在1.20版本的Minecraft,版本为1.0.13.a的GTM、版本为2001.6.3-build.52的KubeJS环境下,在游戏内输入/kubejs export导出所有注册的配方类型,在主目录/local/kubejs/export/registries下的recipe_type可以看到,涉及到GTCEU的主要是:(翻译稍后补充)


"gtceu:steam_boiler": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",  
"gtceu:electric_furnace": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:alloy_smelter": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:arc_furnace": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:assembler": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:autoclave": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:bender": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:brewery": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:macerator": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:canner": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:centrifuge": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:chemical_bath": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:chemical_reactor": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:compressor": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:cutter": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:distillery": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:electrolyzer": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:electromagnetic_separator": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:extractor": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:extruder": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:fermenter": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:fluid_heater": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:fluid_solidifier": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:forge_hammer": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:forming_press": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:lathe": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:mixer": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:ore_washer": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:packer": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:polarizer": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:laser_engraver": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:sifter": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:thermal_centrifuge": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:wiremill": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:circuit_assembler": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:gas_collector": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:rock_breaker": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:combustion_generator": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:gas_turbine": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:steam_turbine": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:plasma_generator": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:large_boiler": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:coke_oven": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:primitive_blast_furnace": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:electric_blast_furnace": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",    //电力高炉
"gtceu:distillation_tower": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:pyrolyse_oven": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:cracker": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:implosion_compressor": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:vacuum_freezer": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:assembly_line": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:large_chemical_reactor": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:fusion_reactor": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:alloy_blast_smelter": "com.gregtechceu.gtceu.api.recipe.GTRecipeType",
"gtceu:create_mixer": "com.gregtechceu.gtceu.api.recipe.GTRecipeType"

    我们主要记住:前面的键值即可

添加配方(recipe_type)

KubeJS的添加配方是服务器脚本(/reload时可以重新载入),在添加GTCEU配方时,首先在主目录/kubejs/server_scripts下创建任意一个js文件,比如test.js,随后在里面进行编辑

首先写入服务器脚本的框架

ServerEvents.recipes(event => {

})

我们随后在大括号内进行编辑,添加配方的代码格式如下

    event.recipes.gtceu.配方类型('id')            
        .itemInputs('物品id','物品id',....)
        .itemOutputs('物品id')
        .duration(时间)
        .EUt(功率)

其中配方类型这里要替换为上面对应的配方类型,特别注意要把冒号(:)换成点(.)    例如笔者要修改电力高炉的配方那么配方类型这四个字应当替换为gtceu.electric_blast_furnace

随后的各个成员的含义主要为:

itemInputs:输入物品,填写物品id,输入多少个物品就写多少个,用逗号隔开,物品id用单引号框起(游戏内可以使用JEI查看id-可能要打开F3+H),也可以用/kubejs hand查看手里物品id(包括NBT)

多个物品的格式,在物品id前加上 数量x(小写英文字母),例如2个泥土 '2x minecraft:dirt'

itemOutputs:输出物品,填写格式同上

duration:配方执行所需要时间(填写一个整数,以tick为单位,1s=20tick)

EUt:耗能功率,填写一个整数,单位是EU/t,(结合duration成员就决定了一个配方的总耗能)

除此以外还有一些参数:

inputFluids:流体输入,格式为:inputFluids(Fluid.of('流体id1', 数量),Fluid.of('流体id2', 数量),...),流体id的查询方法同物品(建议使用JEI,而不是查手中——可能查的是桶),数量是整数以mB为单位

outputFluids:流体输出,格式为:outputFluids(Fluid.of('流体id', 数量),...),解释同上

inputStress:没有说明,也没见使用例,如果有新发现再补充

rpm:与机械动力联动方块(例如动力搅拌器)的参数,格式为rpm(转速),转速填入整数

chancedOutput:概率产物(例如研磨增产),格式为:chancedOutput(Item.of('物品id', 数量), 概率, 升压概率增益)

概率单位为万分之一,升压概率增益即超过1等级电压给予的概率加成,同样以万分之一为单位,例如

 chancedOutput(Item.of('minecraft:dirt', 1), 5000, 500)

多个物品可能是通过多个.chancedOutput进行,待试验

circuit:增加配方需要的编程电路板,格式为circuit(电路板id),填写整数


实例分析(recipe_type)

GTM 1.20 版本1.0.13中有一个电力高炉的配方BUG,即制作单晶硅和磷掺杂的单晶硅,由于上下配方都含有硅粉和小撮砷化镓(并且都是32:1),导致电力高炉优先识别普通单晶硅配方而无法合成单晶硅,据作者称,配方里本来有2号编程电路,但是由于BUG导致不显示,笔者的修改方法是把硅粉改成硅锭,这样在不影响大体成本的情况下使得配方可用,代码如后所示


GTM+KubeJS魔改试探讨-第1张图片

GTM+KubeJS魔改试探讨-第2张图片

ServerEvents.recipes(event => {
    event.remove({output: 'gtceu:phosphorus_boule'})
    event.recipes.gtceu.electric_blast_furnace('rainsfield_new_pboule_recipe')            
        .itemInputs('64x gtceu:silicon_ingot', '8x gtceu:phosphorus_dust','2x gtceu:gallium_arsenide_small_dust')
        .itemOutputs('gtceu:phosphorus_boule')
        .inputFluids(Fluid.of('gtceu:nitrogen', 8000))
        .duration(12000)
        .EUt(480)
})

其中第二行为删除原版配方,匹配方式是直接删除制造磷掺杂单晶硅的所有配方,由于该物品只有这一种合成方式因此这样没有问题

在游戏内键入/reload后,果然成功,只是似乎GTM没有给出温度的修改方式,导致这配方不需要温度

GTM+KubeJS魔改试探讨-第3张图片

值得注意的是如果在其后加上.circuit(2)发现仍然不起效果(JEI内不显示编程电路,也无法执行磷掺杂配方),可以认为是移植问题


我们放入对应物品进入高炉,发现无法执行,经排查原因就出在温度为0K上,代码内部的逻辑可能认为0K配方无法执行,如何设置配方的温度呢?官方文档没有给出函数,需要我们自己去找,这时候就可以用到ProbeJS,具体操作请参见ProbeJS的教程

在安装ProbeJS,KubeJS和GTCEU的情况下再进入一次存档并dump后,打开VSCode进行编辑,会发现此时VSCode利用ProbeJS生成的文件探测出了内部的成员函数,表现出来的就是在后面继续打一个点(.),会开始联想相关的成员函数(或者说方法method),GTM+KubeJS魔改试探讨-第4张图片

我们逐一寻找(或者键入temp这样可能的关键词),发现blastFurnanceTemp这个方法(也显示在了上面的截图里)就是设定配方温度的函数,我们利用它进行设置,最终代码如下

ServerEvents.recipes(event => {
    event.recipes.gtceu.electric_blast_furnace('rainsfield_new_pboule_recipe')            
        .itemInputs('64x gtceu:silicon_ingot', '8x gtceu:phosphorus_dust','2x gtceu:gallium_arsenide_small_dust')
        .itemOutputs('gtceu:phosphorus_boule')
        .duration(12000)
        .EUt(480)
        .blastFurnaceTemp(2500)
})

此时再进行reload 果然能运行该配方

GTM+KubeJS魔改试探讨-第5张图片

其余的添加材料、矿物生成、自定义多方块等待补(最近笔者不太有时间)