本篇教程由作者设定使用 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导致不显示,笔者的修改方法是把硅粉改成硅锭,这样在不影响大体成本的情况下使得配方可用,代码如后所示
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没有给出温度的修改方式,导致这配方不需要温度
值得注意的是如果在其后加上.circuit(2)发现仍然不起效果(JEI内不显示编程电路,也无法执行磷掺杂配方),可以认为是移植问题
我们放入对应物品进入高炉,发现无法执行,经排查原因就出在温度为0K上,代码内部的逻辑可能认为0K配方无法执行,如何设置配方的温度呢?官方文档没有给出函数,需要我们自己去找,这时候就可以用到ProbeJS,具体操作请参见ProbeJS的教程
在安装ProbeJS,KubeJS和GTCEU的情况下再进入一次存档并dump后,打开VSCode进行编辑,会发现此时VSCode利用ProbeJS生成的文件探测出了内部的成员函数,表现出来的就是在后面继续打一个点(.),会开始联想相关的成员函数(或者说方法method),
我们逐一寻找(或者键入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 果然能运行该配方
其余的添加材料、矿物生成、自定义多方块等待补(最近笔者不太有时间)