觉得hbm太咸鱼了?满地单质矿,熔炉烧啥出啥,钢粉直接在工作台上手拌出来,超导体能在电力时代之前被手搓出来;还是觉得hbm科技线太臃肿了?一个平平无奇的铋,愣是七拐八绕塞了一堆制作流程,还和rbmk、FEL、pwr搭上了关系,还莫名其妙的成为了聚变阶段的敲门砖,以及那被许多人诟病的石化线;又或者你只是想做出点有特色的东西来?要实现上面这些,hbm的作者bob已经提供了近乎完备的一套魔改系统,允许你即使不懂java编程也能对现有科技线进行大刀阔斧的改动,而本篇教程将要讲解的就是这套魔改系统中相当重要的一环————自定义机器。

准备工作

建议使用vscode等软件编辑json文件,自带格式报错提醒自动对齐等功能,不香吗?

相关文件位置

这套系统主要有两个文件,一个是config\hbmConfig下的“hbmCustomMachines.json”,控制各个机器的注册信息、名称、gui内容、结构等机器本身属性,一个是config\hbmRecipes下的“hbmCustomMachines.json”,控制各个机器下的配方。

机器本身属性

打开config\hbmConfig下的“hbmCustomMachines.json”,你会看到一个默认的“Paper Press”机器,算是作者给你的实例,下面我将结合该实例讲解

默认json示例

{
  "machines": [
    {
      "recipeKey": "paperPress",
      "unlocalizedName": "paperPress",
      "localization":{
         "de_DE": "Papierpresse"
      }
      "localizedName": "Paper Press",
      "fluidInCount": 1,
      "fluidInCap": 1000,
      "itemInCount": 3,
      "fluidOutCount": 1,
      "fluidOutCap": 1000,
      "itemOutCount": 2,
      "generatorMode": false, 
      "maxPollutionCap":100,
      "fluxMode":false,
      "recipeSpeedMult": 1.0,
      "recipeConsumptionMult": 1.0,
      "maxPower": 10000,
      "maxHeat":0,
      "recipeShape": [
        "IPI",
        "PCP",
        "IPI"
      ],
      "recipeParts": ["I",["dict","ingotSteel"],"P",["dict","plateSteel"],"C",["item","hbm:item.circuit_aluminium"]
      ],
      "components": [
        {"block":"hbm:tile.cm_block","x":-1,"y":-1,"z":0,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":-1,"y":-1,"z":1,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":-1,"y":-1,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_sheet","x":-1,"y":0,"z":0,"metas":[0]},
        {"block":"hbm:tile.cm_sheet","x":-1,"y":0,"z":1,"metas":[0]},
        {"block":"hbm:tile.cm_sheet","x":-1,"y":0,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":-1,"y":1,"z":0,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":-1,"y":1,"z":1,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":-1,"y":1,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":0,"y":-1,"z":1,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":0,"y":-1,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_sheet","x":0,"y":0,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":0,"y":1,"z":1,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":0,"y":1,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":1,"y":-1,"z":0,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":1,"y":-1,"z":1,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":1,"y":-1,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_sheet","x":1,"y":0,"z":0,"metas":[0]},
        {"block":"hbm:tile.cm_sheet","x":1,"y":0,"z":1,"metas":[0]},
        {"block":"hbm:tile.cm_sheet","x":1,"y":0,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":1,"y":1,"z":0,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":1,"y":1,"z":1,"metas":[0]},
        {"block":"hbm:tile.cm_block","x":1,"y":1,"z":2,"metas":[0]},
        {"block":"hbm:tile.cm_port","x":0,"y":-1,"z":0,"metas":[0]},
        {"block":"hbm:tile.cm_port","x":0,"y":1,"z":0,"metas":[0]}
      ]
    }
   ]
 }

逐项说明

1.配方集名称

"recipeKey": "paperPress"

必填,该值定义了该机器可以使用的配方集,如何定义配方集将在后面解释。 多台机器可以使用相同的配方集(就像不同级别的同一台机器),所以该值不必是每台机器独有的。

2.机器实体非本地化名称

"unlocalizedName": "paperPress"

必填,这是机器用来识别自身的内部非本地化名称。这个名称在游戏内任何地方都看不到,但是在保存游戏的时候用来存储机器类型。这个值必须是每台机器独有的。

3.机器多语言本地化名称集

"localization":{
         "de_DE": "Papierpresse"
      }

为机器本地化名称提供多语言支持,可让机器在不同的游戏语言下显示对应语言的名称,如 "zh_CN": "压纸机" 即为机器添加了中文名称

4.机器本地化名称

"localizedName": "Paper Press"

必填,这是物品栏和机器gui上显示的机器名称。不要求它是每台机器独有的,但是仍然推荐这么干,免得弄不清哪台机器是干嘛的。

5.输入流体槽数量

"fluidInCount": 1

必填,这是机器具有的流体输入槽的数量。如果想设置机器没有流体输入,将其设置为0。最多3个流体槽。

6.输入流体槽容量

"fluidInCap": 1000

必填,流体输入槽的容量,以毫桶为单位。如果有流体输入槽,该值是强制性的,但如果没有流体输入槽,则该值无效。

7.输入物品槽数量

"itemInCount": 3

必填,机器拥有的物品输入槽数量。如果想设置机器没有物品输入,则将其设置为0。最多6个槽。每个创建的物品输入槽也将自动生成一个用于过滤物品的模板槽。

8.输出流体槽数量

"fluidOutCount": 1

必填,同"fluidInCount"

9.输出流体槽容量

"fluidOutCap": 1000

必填,同"fluidInCap"

10.输出物品槽

"itemOutCount": 2

必填,物品输出槽的数量。如果想设置机器没有物品输出,则将其设置为0。最多6个槽。

11.发动机模式

"generatorMode": false

必填,默认为"false",改为"true"后将把机器变为发电机,将根据配方内的"consumptionPerTick"值发电而不是耗电,同时配方内所有的输入都在过程的开始而不是结束时被消耗,防止玩家通过在过程中途拿出物品而无中生能量

12.最大污染容量

"maxPollutionCap":100

选填,在X4879版本后新增的选项,控制机器内污染物容量,值越大机器在配方产生的污染物突破容量前能储存的污染物越多

13.中子通量模式

"fluxMode":false

选填,在X4879版本后新增的选项,控制机器是否能接收来自研究反应堆的中子通量(开启后记得在结构内加入X4879版本后新增的自定义机器结构方块Neutron Flux Receiver才能让机器接收贴着这个方块的研究反应堆的中子通量)

14.配方消耗时间倍数

"recipeSpeedMult": 1.0

必填,配方消耗时间的倍数。

15.配方消耗电量倍数

"recipeConsumptionMult": 1.0

必填,配方消耗电量的倍数。

16.机器内部最大缓冲能量

"maxPower": 10000

必填,这台机器内部缓冲的最大能量。必须至少比耗电最高的配方高,推荐值是这个值的100倍以上,以提供足够5秒的电力。

17.机器最大热容量

"maxHeat":0

选填,在X4879版本后新增的选项,控制机器最大热容量,设置为0则无法接收热量(开启后记得在结构内加入X4879版本后新增的自定义机器结构方块Heat receiver才能让机器接收这个方块下方的产热设备的热量)

18.机器控制器工作台制作配方

"recipeShape": [
        "IPI",
        "PCP",
        "IPI"
      ],

该机器控制器的工作台制作配方形状。因为机器控制器包含区分类型的特殊NBT,因此不能使用其他hbmRecipe配置添加配方。形状代表工作台网格,必须始终形成一个适当的矩形,例如两行各三个字符或三行各一个字符将是有效的,而超过三行或不同字符数的行则无效。空的槽可以由任何字符表示,只要在下面recipeParts的定义中没有给它赋值。如果省略该值,将不会生成工作台配方。mt同款

19.机器控制器工作台制作配方中元素

"recipeParts": ["I",["dict","ingotSteel"],"P",["dict","plateSteel"],"C",["item","hbm:item.circuit_aluminium"] ]

单个字符的数组,后跟物品堆(item或dict)定义。如此示例中"I"表示"ingotSteel"矿辞下的物品,"P"表示"plateSteel"矿辞下的物品,"C"表示物品"hbm:item.circuit_aluminium"。这将分配先前的recipeShape中使用的不同物品。任何没有被分配物品的字符将会导致配方中有一个空槽。如果省略该值,将不会生成工作台配方。

20.机器多方块结构

"components": [
        {"block":"hbm:tile.cm_block","x":-1,"y":-1,"z":0,"metas":[0]},
        .........
      ]

必填,定义什么块需要在多方块结构中的什么位置。组件列表中的每个条目都有一个数组,其中包含不同的值。其中:"block"后的值为方块内部非本地化名称。"x":-1,"y":-1,"z":0指相对于核心块位置坐标,"metas":[0]指允许的方块meta值,可以有多个,中间要用逗号隔开。其实这些看完下面就会这里面发现大部分不用你手打,可能就只需要往"metas"里加几个方块meta值


是不是感觉上面最难的就是"components"?要一个一个计算结构里每个方块和控制器的位置关系还要一个一个打上去,太折磨了,没关系,有一个方便的工具,就是“Custom Machine Structure Output Wand”和"Custom Machine Structure Positioning Anchor",

如何自己动手,使用hbm自定义机器来构建属于自己的科技线-第1张图片

用“Custom Machine Structure Output Wand”右击"Custom Machine Structure Positioning Anchor"后,再右击两个方块,

如何自己动手,使用hbm自定义机器来构建属于自己的科技线-第2张图片这时再右击除"Custom Machine Structure Positioning Anchor"外的方块或者空气后,就会把以点击的两个方块为对角的长方体内所有的方块的信息按符合的格式输出到config\hbmConfig下的“CMstructureOutput.txt”,然后就能直接复制粘贴到config\hbmConfig下的“hbmCustomMachines.json”里了。

机器配方集

打开config\hbmRecipes下的“hbmCustomMachines.json”,你会看到一个默认的“paperPress”配方集,算是作者给你的实例,下面我将结合该实例讲解(“//”后面既是讲解)

注意!!!该文件与其他机器的配方更改一样,更改完后需要将文件名“_hbmCustomMachines.json”前的“_”删去(或者你直接新建一个hbmCustomMachines.json在里面写)才会生效,“_hbmCustomMachines.json”每次启动游戏都会被覆盖为默认配方,别到时候吭哧吭哧写了一大堆末了忘了另存为hbmCustomMachines.json,一开游戏改动的内容全被覆盖了(惨痛的教训)

默认json示例

{
  "recipes": [
    {
      "recipeKey": "paperPress",
      "recipes": [
        {
          "inputFluids": [
            ["WATER",250]
          ],
          "inputItems": [
            ["item","hbm:item.powder_sawdust",1,0]                     
          ],
          "outputFluids": [],
          "outputItems": [
            ["minecraft:paper",3 ,0,0.5]
          ],
          "duration": 60,
          "consumptionPerTick": 10,
          "pollutionType":"SOOT",
          "pollutionAmount": 0.03,
          "radiationnAmount": 0.0,
          "flux":0,
          "heat":0
        }
      ]
    }
  ]
}

逐项说明

1.配方集名称

"recipeKey": "paperPress"

配方集的名称,用于自定义机器读取。每个集合都需要一个唯一的名称。

2.配方输入流体要求

"inputFluids": [
            ["WATER",250]
          ]

配方要求的流体(即流体注册表名后跟数量的数组)最多三个,中间用逗号隔开。目前还不支持流体压力要求。

3.配方输入物品要求

"inputItems": [
            ["item","hbm:item.powder_sawdust",1,0]                                        
          ]

配方要求的输入物品组(item对于物品注册表名称、dict对于矿物辞典名称,后两个数分别为要求物品数量和meta数据,不填则默认为1和0)。支持包含多个物品组,中间用逗号隔开。

4.配方输出流体

"outputFluids": []

配方产出的流体,最多三个

5.配方输出物品

"outputItems": [
            ["minecraft:paper",3 ,0,0.5]
          ]

配方产出的物品组(按顺序分别为:物品注册表名称、产出数量(不填默认为1)、meta数据(不填默认为0)、产出概率,1.0意味着100%的输出机会,0.5表示50%等。)

6.配方所需时间

"duration": 60

完成此配方所需的时间。0或更低的值很可能会使游戏崩溃。该值乘以机器的"recipeSpeedMult"值为最终生产所需时间。

7.加工此配方每tick耗电量

"consumptionPerTick": 10

加工此配方每tick所需的电量。该值乘以机器的"recipeConsumptionMult"值为最终每tick耗能。若机器的"generatorMode"设置为“true”则为发电量。

8.配方产生污染类型

"pollutionType":"SOOT"

选填,在X4879版本后新增的选项,控制该配方产生的污染类型

9.配方每秒产生/吸收的污染量

"pollutionAmount": 0.03,

选填,在X4879版本后新增的选项,控制该配方每秒产生/吸收的污染量,可为负值,为负值时将减少污染量(是的,你现在可以拿自定义机器做污染清除机了)

10.配方每秒产生/吸收的区块辐射量

"radiationnAmount": 0.0,

选填,在X4879版本后新增的选项,控制该配方每秒产生/吸收的区块辐射量,可为负值,为负值时将减少区块辐射量

11.配方所需中子通量水平

"flux":0

选填,在X4879版本后新增的选项,控制该配方所需中子通量水平

12.配方每tick消耗的热量

"heat":0

选填,在X4879版本后新增的选项,控制该配方每tick消耗的热量


该配方文件也支持/ntmreload命令来热重载,无需退出游戏重进来生效。

官方WIKI

本文主要信息来源:https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT/wiki/Custom-Machines-Guide

官方提供的多个自定义机器实例:https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT/releases/tag/1.0.27X4670