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

首先你需要一个做好的机器:

CrT兼容MM教程-第1张图片当然此时还不行,你得用建造选择工具或GuGuUtils提供的范围建造选择工具

先把除了机器控制器以外的所有方块点击一遍,范围选择直接点击两个角即可:

CrT兼容MM教程-第2张图片

然后点击这个机器控制器:

CrT兼容MM教程-第3张图片下面显示的最后一排请记住,那是你的新机器的文件名!

打开根目录/config/modularmachinery/machinery文件夹:

CrT兼容MM教程-第4张图片

其中machine-....开头的是我们刚刚新建的机器,另外三个则是原版MM提供的例子。

你可以先给你的机器文件改个名字,改什么你随便。

打开此文件(我这里使用Sublime Text作为演示软件):

CrT兼容MM教程-第5张图片

可以看见有很多的信息,这些信息是你刚刚机器中的方块信息,先找到信息中的"nbt"的那一行,一般是在xyz信息的下面:

CrT兼容MM教程-第6张图片必须将"nbt"所在的这一行删除,并且使nbt下面一行与xyz三行相连:

CrT兼容MM教程-第7张图片每个信息都必须删除"nbt"!

然后删完了回到顶部,你可以发现这里只有一个parts的部分,这是用来记住你的机器的方块的。

请在parts的前面写上这些东西:

CrT兼容MM教程-第8张图片

JSON为:

"registryname": "my_machine",
"localizedname": "machine.my_machine",
"requires_blueprint": false,
"color": "000000",

你必须要保证他们的第一个"和parts的第一个相同。

然后我们来解读一下这些个标签:

首先registryname就是机器的注册名,你应该填你机器的而不是我这里写的,并且每个机器不能相同。

localizedname表示的是机器的本地化名,可以填写lang key,但是注意不要变成硬编码了。

requires_blueprint代表了一个机器是否需要蓝图来启动机器,false则无需,true则需要。

color为机器成型后MM的方块会显示的颜色,填写16进制RGB。

然后记住机器的registryname即可。

到这里你可以关掉JSON,打开scripts文件夹。


新建一个名称随意的ZenScript文件,在里边先导入包:

import mods.modularmachinery.RecipeBuilder;
import mods.modularmachinery.RecipePrimer;

这里首先呼出一个RecipeBuilder:

RecipeBuilder.newBuilder(String 配方名称, String 机器注册名称, int 处理时间,单位tick);
RecipeBuilder.newBuilder(String 配方名称, String 机器注册名称, int 处理时间,单位tick, int 配方优先级);

这两个都可以使用于配方呼出,不过第二个添加了一个优先级的配置,意思就是但你的两个配方输入物品一样那么优先执行配方优先级高的配方。

这个时候看起来就像这样:

CrT兼容MM教程-第9张图片当然你并不用写注释,注释是一段不会运行的字,他是写给人看的,让人读得懂这段代码。

现在就可以开始下一步了!


下一步是配置配方的RecipePrimer,这段直接会把所有的Primer都写出来。

这里的Primer是RecipeBuilder的方法,你可以任意调用于你的配方:

首先是能源与燃料:

addEnergyPerTickInput(int 能源每tick输入);
addEnergyPerTickOutput(int 能源每tick输出);

addFuelItemInout(int 总计需要的燃烧时间);
//这里的方法是把这个配方声明为需要燃料的配方,并且填入这个燃烧时间需要三思,官方的意思是也许会出现问题。
//如果我填了100那么就需要这个配方输入总燃烧时间为100tick的燃料。

添加输入:

addItemInput(IItemStack stack); //输入的物品,直接是IItemStack。

addItemInput(IOreDictEntry oreDict); //输入的物品,但是使用矿物词典来匹配物品
addItemInput(IOreDictEntry oreDict, int amount); //多了数量


addFluidInput(ILiquidStack stack); //流体输入,为ILiquidStack

添加输出:

addItemOutput(IItemStack stack); //添加物品输出

addItemOutput(IOreDictEntry oreDict); //不确定能不能用,输出一个矿物词典?
addItemOutput(IOreDictEntry oreDict, int amount); //比上一个多了个数量


addFluidOutput(ILiquidStack stack); //流体输出

设置概率:

setChance(float  概率);

float是一种数据类型;然后这里的设置概率会把你输入的数字后面加一个%,例如你输入了1.5,那么概率就是1.5%。

这里的setChance既可以用在输入,也可以用于输出。

输入时代表概率消耗,输出时代表概率产出。

使用时放在一个方法的后面,例如:

addItemOutput(<minecraft:grass> * 3).setChance(1.5);

构建配方:

build();

将这个配方构建完成。


官方给出的例子:

val reci = RecipeBuilder.newBuilder("recipe1", "machine1", 1000, 0);

reci.addEnergyPerTickInput(100);
reci.addItemInput(<ore:ingotIron>);
reci.addItemOutput(<minecraft:gold_ingot>);
reci.build();



val rec = RecipeBuilder.newBuilder("anotherRecipeRegistryName", "associatedMachineRegistryName", 1000, 0);
rec.addEnergyPerTickInput(100).addFluidInput(<liquid:water> * 1000).addFluidInput(<liquid:lava> * 1000).addItemOutput(<minecraft:obsidian> * 2).build();

这两种写法都是可以的。