本篇教程由作者设定未经允许禁止转载。

适用于1.20.1版本,1.18-1.19和1.16分别是另外的方法具体查看官方教程https://newdocs.masterfulmc.com/

使用主要模组为Masterful Machinery,同时该模组提供了kubejs支持以及几个模组的联动以实现模组特有的加工方式。如果不想使用kubejs还可以通过数据包编写,但比较麻烦这里不做介绍

这里以机械动力为例,创建一个多方块“虚空飞轮”产生应力,效果见视频https://www.bilibili.com/video/BV1FQbDeVExn/

一.创建控制器与端口(这一步也可以用kubejs来写,有基础的自行查看教程)

首先,需要创建一个控制器,控制器将会判定多方块的结构。找到配置文件里mm文件夹,打开放控制器的controllers文件夹

游戏版本名\config\mm\controllers

新创建一个txt文本,后缀改成json,文件命名建议直接是id方便查看,里面输入如下

{   
 "type": "mm:machine",   

 "id": "my_controller",  
 
   "name": "My Controller"

   }

type是控制器的类型,目前只有这一种,不用改

id这里是你注册的控制器的物品id,可以改成你想的id

name是游戏中默认显示的名字,你可以用语言文件来翻译,直接写中文命名也行

注意在后面需要引用这个id时前面加上'mm:',如mm:my_controller


返回到mm文件夹打开ports文件夹,我们来创建端口,还是新建json文件

{
  "id": "my_port",
  "controllerIds": "mm:controller_a",
  "name": "My Item Port",
  "type": "mm:item",
  "config": {
    "rows": 3,
    "columns": 3
  }
}

端口是一个用来暂时存储物品并进行后续转换的方块,是多方块机器的接口。这是一个物品端口

id是端口的物品id

"controllerIds"这里写你想连接的控制器的id,"name"是游戏名称,"type"后面的指这个端口只能进行物品的交互

"config": {    "rows": 3,    "columns": 3  }指这个端口内可以存储3行3列的物品

下面是一些其他端口,按需创建你需要的端口

流体端口

{
  "id": "my_port",
  "controllerIds": "mm:controller_a",
  "name": "My Item Port",
  "type": "mm:fluid",
  "config": {
    "rows": 3,
    "columns": 3,
    "slotCapacity": 1000
  }
}

 "config": {"rows": 3,"columns": 3, "slotCapacity": 1000 }这里指有3*3的格子每格子存1000mb液体液体为什么能用格子存

能量端口(EF)

{
  "id": "my_port",
  "controllerIds": "mm:controller_a",
  "name": "My Port",
  "type": "mm:energy",
  "config": {
    "capacity": 1000000,
    "maxReceive": 1000,
    "maxExtract": 1000
  }
}

"config": { "capacity": 1000000, "maxReceive": 1000, "maxExtract": 1000 }最大存储量1000000,每刻从端口接收和提取的最大能量为1000

通用机械联动端口

气体端口

{
  "id": "my_gas_port",
  "controllerIds": "mm:controller_a",
  "name": "My Gas Port",
  "type": "mm:mekanism/gas",
  "config": {
    "capacity": 10000000
  }
}

浆液端口

{
  "id": "my_slurry_port",
  "controllerIds": "mm:controller_a",
  "name": "My Slurry Port",
  "type": "mm:mekanism/slurry",
  "config": {
    "capacity": 10000000
  }
}

颜料端口

{
  "id": "my_pigment_port",
  "controllerIds": "mm:controller_a",
  "name": "My Pigment Port",
  "type": "mm:mekanism/pigment",
  "config": {
    "capacity": 10000000
  }
}

输液端口

{
  "id": "my_infuse_port",
  "controllerIds": "mm:controller_a",
  "name": "My Infuse Port",
  "type": "mm:mekanism/infuse",
  "config": {
    "capacity": 10000000
  }
}

机械动力联动端口

{
  "id": "my_kinetic_port",
  "controllerIds": "mm:controller_a",
  "name": "My Create Kinetic",
  "type": "mm:create/kinetic",
  "config": {
    "stress": 4
  }
}

"config": { "stress": 4 }端口方块对于应力的影响,数值越大转换/消耗的应力就越大

气动工艺联动

{
  "id": "my_air_port",
  "controllerIds": "mm:controller_a",
  "name": "My Air Port",
  "type": "mm:pneumaticcraft/air",
  "config": {
    "danger": 11.0,
    "critical": 12.0,
    "volume": 20000
  }
}

"config": {"danger": 11.0, "critical": 12.0,  "volume": 20000}

  "volume"是储存的空气容积,"danger"高压红区,"critical"压力阈值


这时你打开游戏应该能在mm的标签页下找到所创建的控制器和端口,这里我创建了一个控制器、一个机械动力传动端口、一个液体端口,每个端口有输入输出两个方块

如何创建自定义多方块结构-第1张图片二.搭建多方块结构

准备工作完成,开始搭建多方块结构,后面两步在只有【MM】情况下只能通过数据包实现,推荐使用kubejs模组更加方便。以下操作都可以打开游戏进行

安装kubejs后,游戏文件夹会多出一个kubejs文件夹,打开下面位置

游戏版本\kubejs\server_scripts

新建txt文本,后缀改成js,这里推荐使用VScode打开,没有的话记事本先打开写完后再改后缀也行。游戏中命令输入/reload来重新加载

MMEvents.createStructures(event => {
    event.create("mm:my_structure")//你的结构id
        .controllerId("mm:controller_a")//使用的控制器id
        .name("My Machine")//结构显示名称
        .layout(a => {
            a.layer([
                "BCB"//从上往下第一层方块
            ]).layer([
                "ABA"//第二层方块
            ]).key("A", {
                block: "minecraft:glass"//方块id
            }).key("B", {
                block: "minecraft:white_wool"
            })
        })
})

利用字母,你可以自由搭建你的结构,最后方块注册时记得把字母对应的方块id填入。

代替方块的字母:可以使用除了大写C以外的所有大小写字母和数字,每一个代表一种方块,大写C则代表控制器方块,所有多方块结构中必须含有C(控制器),C最后不需要方块注册,

在官方给出的案例中,多方块结构长这样如何创建自定义多方块结构-第2张图片

这是第二个例子,我搭建的多方块

MMEvents.createStructures(event => {
    event.create("mm:cloud")
        .controllerId("mm:cloud")
        .name("静电传动")
        .layout(a => {
            a.layer([
                " AAA ",
                " AAA ",
                " AAA ",
                " AAA "
            ]).layer([
                "A   A",
                "A   A",
                "A   A",
                "A   A"
            ]).layer([
                "A B A",
                "A D A",
                "A C A",
                "A E A"
            ]).layer([
                "A   A",
                "A   A",
                "A   A",
                "A   A"
            ]).layer([
                " AAA ",
                " AAA ",
                " AAA ",
                " AAA "
            ]).key("A", {
                block: "cloudstorage:static_cloud"
            }).key("B", {
                block: "create:flywheel"
             }).key("E", {
                block: "mm:cloud_port_input"
            }).key("D", {
                block: "mm:cloud_port_output"
            })
        })
})

这是我搭建的多方块长这样,用JEI可以按U查看多方块,JEI里像机械动力里飞轮这种模型可能不会渲染但不影响使用,同时显示画面时会以控制器为中心,如果位置太偏结构会显示不全。如果你要用多方块结构进行输入输出,结构内要包含至少两个相应的端口方块

如何创建自定义多方块结构-第3张图片

如何创建自定义多方块结构-第4张图片

三.多方块结构配方

文件位置还是在server_scripts,新建或者在上面结构文件接着写都行

MMEvents.createProcesses(event => {
    event.create("mm:my_process_recipe")    //配方id
        .structureId("mm:my_structure")          //配方所使用的结构id
        .ticks(1000)
        .input({                //输入
            type: "mm:input/consume",
            ingredient: {                               //不同类型配方下面参数不同
                type: "mm:item",                   //类型是物品
                item: "minecraft:glass",        //物品id
                count: 10                             //数量
            }
        })
        .input({              //输入
            type: "mm:input/consume",
            ingredient: {
                type: "mm:fluid",                 //类型是流体 
                fluid: "minecraft:water",     //液体id
                amount: 1000                   //1000mb
            }
        })
        .output({          //输出
            type: "mm:output/simple",
            chance: 0.5,    //0.5概率输出可选默认百分百概率
            ingredient: {
                type: "mm:energy",           //类型是能量
                amount: 1000                   //输出1000FE
            }
        })
})

下面是不同类型的配方的参数形式

物品

ingredient: {
    type: "mm:item",
    tag: "forge:ingots",
    count: 5
}

流体

ingredient: {
    type: "mm:fluid",
    fluid: "minecraft:water",
    amount: 1000
}

能量

ingredient: {
    type: "mm:energy",
    amount: 1000
}

通用机械

气体

ingredient: {
    type: "mm:mekanism/gas",
    gas: "mekanism:hydrogen",
    amount: 10
}

浆液

ingredient: {
    type: "mm:mekanism/slurry",
    slurry: "mekanism:clean_tin",
    amount: 10
}

颜料

ingredient: {
    type: "mm:mekanism/pigment",
    pigment: "mekanism:blue",
    amount: 20
}

输液

ingredient: {
    type: "mm:mekanism/infuse",
    infuse: "mekanism:bio",
    amount: 20
}

机械动力转速

ingredient: {
    type: "mm:create/kinetic",
    speed: 16
}

还是我上面那个多方块结构的例子

MMEvents.createProcesses(event => {
    event.create("mm:cloud")
        .structureId("mm:cloud")
        .ticks(1000)
        .input({
            type: "mm:input/consume",
            ingredient: {
                type: "mm:create/kinetic",
                speed: 0
            }
        })
        .output({
            type: "mm:output/simple",
            ingredient: {
                type: "mm:create/kinetic",
                speed: 256
            }
        })
})

输入输出全是机械动力的RPM转速,输入0转速,输出256,代表无需消耗资源只要搭建好即可输出应力

同样,也可以稍微改一下

MMEvents.createProcesses(event => {
    event.create("mm:cloud")
        .structureId("mm:cloud")
        .ticks(1000)
        .input({
            type: "mm:input/consume",
            ingredient: {
                type: "mm:fluid",
                fluid: "minecraft:water",
                amount: 1000
            }
        })
        .output({
            type: "mm:output/simple",
            ingredient: {
                type: "mm:create/kinetic",
                speed: 256
            }
        })
})

如何创建自定义多方块结构-第5张图片


输入1000mb水才能产生应力,注意构件多方块结构相应的输入接口也要从机动端口改成液体端口

#疑似有小bug,有时候改了结构后/reload重载会把多方块结构判定删掉,需要重启游戏一下

现在你可以自由搭建自己结构魔改配方了!

四.自定义纹理

如果你觉得默认的控制器和接口材质不符合你的整合包风格,可以自定义。找到这个位置

游戏版本/config/mm/pack/assets/mm/models/block/(json文件)

这里放着刚刚注册的控制器和端口方块文件,根据ID打开你要修改的方块,找到这里

"base": {
      "parent": "minecraft:block/cube_all",
      "render_type": "minecraft:solid",
      "textures": {
            "all": "mm:block/base_block"
      }
}

"all": "mm:block/base_block"可以修改纹理,比如改成"all": ""minecraft:block/sponge""就是以原版海绵为底纹理。F3+T重新加载资源包方块纹理就更新了

模组方块引用

比如我要用机械动力的铜机壳做纹理,先打开mod文件找到对应模组,用压缩文件管理器打开找到你要用到的方块纹理

assets\create\textures\block\copper_casing.png

从纹理文件夹(textures)开始写,注意斜杠方向,不用加图片格式后缀

"all": "create:block/copper_casing"

我把控制器和端口全改一下,F3+T重载资源包,修改纹理只是修改底图,相应的方块特征(如控制器的像显示屏一样的图案)还是在的

如何创建自定义多方块结构-第6张图片如果打开纹理文件有另一种情况,比如机械动力的铜砖瓦,纹理在纹理文件夹-方块纹理-铜-铜砖瓦里,套了好几层文件夹

assets\create\textures\block\copper\copper_shingles.png

格式要这样写,把所有文件夹都要带进去

"all": "create:block/copper/copper_shingles"

如何创建自定义多方块结构-第7张图片到此一个完整的多方块结构就完成了!