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

须知

  1. 本教程基于1.18.2,mod版本:0.7.2。

  2. 因本人技术有限,该教程必定存在不足之处,敬请谅解。如果您有更好的建议,请在评论区或私信指出。

  3. 对于文档中的名词可能不会进行解释,比如:JSON、属性。请善用搜索引擎。

快速入门

数据包方式加载机器

最快路径: https://download-directory.github.io/?url=https%3A%2F%2Fgithub.com%2FFrinn38%2FCustom-Machinery%2Ftree%2F1.16.5%2Ftest_datapack

根据官网的wiki,下载该基本数据包并且放置在.minecraft\saves\<世界存档>目录下重启游戏即可看到官方的基本示例生成的机器。

最终机器的json文件所在路径是: .minecraft\saves\<世界存档>\datapacks\<自定义的数据包名>\data\<自定义的命名空间>\machines\

其中,尖括号包裹的不是固定的。

KubeJS方式加载机器

安装KubeJS,将创建的json放在:.minecraft\kubejs\data\<自定义的命名空间>\machines\

重启游戏或者退出存档回到主菜单后再进入游戏都可以看到更新后的配置。

你可以使用以下json来进行测试,json命名为全小写并且不能包含空格,只能使用‘_’或‘/’特殊符号:

{
    "name": {
        "text": "第一个机器",
        "color": "red"
    },
    "appearance": {},
    "tooltips": [],
    "components": [],
    "gui": [],
    "jei": [],
    "catalysts": []
}

和数据包不同的是不需要找存档和定义数据包名, 以及配置数据包所需要的元数据信息。(虽然wiki上并不推荐只为了加载json而安装KubeJS)

注意: 以下内容全部以安装了KubeJS为前提编写的。

属性解读

读者应该在wiki查看每个属性的说明, 不应该依赖本教程。

创建一个机器有2个必选和6个可选属性。

机器名称定义

第一个是名称, 它支持直接填写文本,或者按照上面的第一个机器json示例来填写一个对象。 对象中有多个属性。示例只使用了两个,完整的属性信息参阅wiki:文本组件

"name": {
        "text": "机器显示的名称",
        "color": "red" 
}

appearance:外观定义

外观的设定比较复杂,这里不会有过多内容。

如果我们像示例一样传递一个空对象,那么它会使用默认外观,长得就和封面图一样。

外观有多个状态,分别是:

  1. idle:闲置

  2. running:运行

  3. errored:错误

  4. paused:暂停

他在json中应该这样使用(默认示例轻微改造,方便读者举一反三的示例):

"appearance": {
    "block": "minecraft:tnt",
    "item": "custommachinery:block/custom_machine_block",
    "sound": "",
    "lightlevel": 0,
    "color": 16777215,
    "hardness": 3.5,
    "resistance": 3.5,
    "tool": "pickaxe",
    "mininglevel": 1,
    "shape": [[0, 0, 0, 1, 1, 1]],
    "running":{
        "block": "minecraft:glowstone",
    }
}

注意:属性支持表参阅wiki:Creating a custom machine - Custom Machinery 1.18 (gitbook.io)最下面的Properties,用来控制机器的亮度,颜色什么的。

使用自定义模型参阅物品/方块外观wiki:物品外观 - 1.18方块外观 - 1.18

components:组件

组件属性是一个数组,数组中包含N个支持的组件对象。

以最常用的物品槽为例,使用以下JSON可以使机器得到一个物品槽来缓存物品(以下官方示例提供了一个类似熔炉的功能):

"components": [
    {
        "type": "custommachinery:item",
        "id": "slot1",
        "filter": ["minecraft:coal", "minecraft:charcoal"],
        "whitelist": true,
        "mode": "input",
        "variant": "custommachinery:fuel"
    }
]

gui:交互界面

使用gui属性时必须保证你读懂了交互界面Wiki中最下方的【Notes】内容!

根据wiki,我们补充一个玩家物品栏的gui元素和一个插槽元素,插槽指定的id要和组件实例中某个对象指定的id一致才可以绑定起来:

"gui": [{
    "type": "custommachinery:player_inventory",
    "x": 50,
    "y": 80
},
{
    "type": "custommachinery:slot",
    "x": 50,
    "y": 20,
    "id": "slot1"
}]

机器功能实现

到这里相信大家已经对如何创建属于自己的机器有自己的认识了,接下来让我们使用一个简单的合成实例来完成该教程。

我们可以使用CrT或者KubeJS还有数据包三种方式来注册配方。这里我们使用安装的KubeJS来注册配方,而不是使用数据包的方式。(现在不算为了加载机器json而安装KubeJS了)

如果你觉得KubeJS的方式不太习惯,也可以使用数据包来完成: Machine recipe - Custom Machinery 1.18 (gitbook.io)

准备机器

机器json放置路径参阅加载机器章节

{
    "name": {
        "text": "第一个机器",
        "color": "red"
    },
    "appearance": {
        "block": "minecraft:tnt",
        "item": "custommachinery:block/custom_machine_block",
        "sound": "",
        "lightlevel": 0,
        "color": 16777215,
        "hardness": 3.5,
        "resistance": 3.5,
        "tool": "pickaxe",
        "mininglevel": 1,
        "shape": [
            [0, 0, 0, 1, 1, 1]
        ],
        "running": {
            "block": "minecraft:glowstone"
        }
    },
    "tooltips": [],
    "components": [
        {
            "id": "slot1",
            "type": "custommachinery:item",
            "filter": [
                "minecraft:coal"
            ],
            "whitelist": true,
            "mode": "input",
            "variant": "custommachinery:fuel"
        },
        {
            "id": "slot2",
            "type": "custommachinery:item",
            "mode": "output"
        }
    ],
    "gui": [
        {
            "type": "custommachinery:player_inventory",
            "x": 50,
            "y": 80
        },
        {
            "type": "custommachinery:slot",
            "x": 60,
            "y": 20,
            "id": "slot1"
        },
        {
            "type": "custommachinery:slot",
            "x": 180,
            "y": 20,
            "id": "slot2"
        }
    ],
    "jei": [],
    "catalysts": []
}

准备配方

更多配方需求(比如要求光照在多少以上,必须在哪个生物群系)参阅wiki:Recipes - Custom Machinery 1.18 (gitbook.io)

onEvent('recipes', event => {
    // 100表示100ticks, 也就是5秒. "example:first_machine" 在加载机械配置时确定,"example"是命名空间,first_machine表示准备机器时使用的json文件名(不带文件类型后缀)。
    event.recipes.custommachinery.custom_machine("example:first_machine", 100)
        // slot1 槽位指定可以不指定, 如果指定了的话, "minecraft:coal"就只能放在这个槽位.
        // require 表示必须, produce表示生产的东西
        // 这里表示需要9个煤炭
        .requireItem(Item.of("minecraft:coal", 9),"slot1")
        // 这里表示生产一个煤炭块
        .produceItem(Item.of("minecraft:coal_block", 1),"slot2");
});

配方的js放在:.minecraft\kubejs\server_scripts\

结果

自定义机器-快速入门-第1张图片