概述

Dalarion 的 Croparia 原版就已提供了关于作物自定义的功能,但需要手动设置贴图与翻译信息。

Croparia IF 版在 Croparia 原版的基础上,提供了更为强大且便利的文件格式。此处基于 IF 版的官方 Wiki 进行说明。

步骤

此处假设你想要为 附魔金苹果 创建对应的自定义作物。

1、根据基本属性创建作物(必须)

首先,我们要确定作物可以产出什么材料。定义作物对应的材料有两种方式:物品 ID 或 物品标签。

假如使用物品 ID,则表示作物会产出 ID 指定的物品;如果使用物品标签,则表示作物会产出物品标签中的第一个物品。

想要获取一个物品的 ID,在游戏中按顺序同时按住 F3 + H 开启高级信息框后,在物品栏中即可查看到物品 ID。

添加自定义作物-第1张图片

如图(上)所示,附魔金苹果的 ID 为:

1
minecraft:enchanted_golden_apple

接着,我们定义作物相关贴图的颜色(可以使用 QQ 截图等工具获取):0xf5d2a1

之后,我们需要确定合成这个作物种子需要的基础魔种等级。这里我们选用五阶魔种,则该作物对应的等级为 5。

再然后,我们给对应的作物起一个名字 enchanted_golden_apple (仅由小写字母、下划线和数字构成)。


根据以上信息,我们在游戏目录下的 crops 文件夹下创建自定义作物文件:enchanted_golden_apple.json (文件名随意但后缀必须为 .json)

在文件中,填入我们刚刚定义的基本属性:

1
2
3
4
5
6
{
    "name": "enchanted_golden_apple",
    "tier": 5,
    "material": "minecraft:enchanted_golden_apple",
    "color": "0xf5d2a1"
}

注意:如果你想通过物品标签定义作物材料,请在 material 对应的值开头带上 #;表示颜色的字段应该是一个字符串,用 # 或者 0x 在开头表示 16 进制。


保存文件并重启游戏,如果一切顺利则就能看到我们自定义的作物相关物品啦~
添加自定义作物-第2张图片

如果出现异常,请查阅游戏日志来定位相关错误。

2、自定义贴图模型(可选)

假设你并不喜欢默认提供的果实与方块的贴图形状(模型),那么你可以在原先的作物定义文件中添加 type 字段。

1
2
3
4
5
6
7
{
    "name": "enchanted_golden_apple",
    "tier": 5,
    "material": "minecraft:enchanted_golden_apple",
    "color": "0xf5d2a1",
    "type": "food"
}

可用的值有:animal, crop(默认), food, monster 和 nature。

重启游戏后,果实与作物方块的模型都会发生改变。

添加自定义作物-第3张图片添加自定义作物-第4张图片


除此以外,假设所有的模型预设你都不喜欢,那么你还可以通过资源包单独指定。

其中,果实的模型在 .../assets/croparia/models/item/fruit_{作物名称}.json ;作物方块的方块状态定义在 .../assets/croparia/blockstates/block_crop_{作物名称}.json 。

3、翻译名称相关(可选)

也许你已经注意到了,在先前的教程中,我们定义的作物对应的物品、方块等都有着默认的翻译名,并且对应的物品会补全前缀与后缀(虽然看起来怪怪的)

没错!Croparia IF 会根据你提供的作物名称,自动生成相关项目的翻译名称。但也如你所见,它只能支持英文转换。因此,作者也提供了快捷的翻译名称自定义方式。

对于我们的示例 附魔金苹果 来说,Minecraft 原版就为其提供了相当全面的翻译,而我们则正好可以利用它。

想要使用已有的翻译,我们需要获取这个物品或方块对应的 Translation Key。通常情况下,一个物品的 Translation Key 为 item.{物品命名空间(物品 ID 冒号前的部分}}.{物品 Path(物品 ID 冒号后的部分)},方块(方块物品)的 Translation Key 为 block.{方块命名空间(方块ID 冒号前的部分}}.{方块 Path(方块 ID 冒号后的部分)}。

对于我们的附魔金苹果(物品)来说,它的 Translation Key 应该为 item.minecraft.enchanted_golden_apple,我们将其补充在作物定义文件上:

1
2
3
4
5
6
7
8
{
    "name": "enchanted_golden_apple",
    "tier": 5,
    "material": "minecraft:enchanted_golden_apple",
    "color": "0xf5d2a1",
    "type": "food",
    "translationKey": "item.minecraft.enchanted_golden_apple"
}

保存文件重启游戏,作物对应的所有物品和方块都有正确的命名啦~

添加自定义作物-第5张图片

此时会有玩家问了:那如果我要定义的作物使用的材料 ID 无法确定的话,怎么办呢?

作者依然提供了解决方案:手动指定各种语言的翻译。

1
2
3
4
5
6
7
8
9
10
11
{
    "name": "enchanted_golden_apple",
    "tier": 5,
    "material": "minecraft:enchanted_golden_apple",
    "color": "0xf5d2a1",
    "type": "food",
    "translationKey": "item.minecraft.enchanted_golden_apple",
    "translations": {
        "zh_cn": "附魔金苹果"
    }
}

如代码所示,用 语言名称 作为键值,对应的材料翻译作为值即可。其中 zh_cn 表示中文。

注意:如果你同时定义了 translationKey 和 translations 的话,其优先级由资源包列表决定(translations 位于名为 croparia 的资源包中);你只需要定义材料部分的翻译即可,对应物品的前后缀如 xx种子、xx果实 会被自动填充。

版本特性 0.2.2

由于 Forge 端的资源包优先级抢占问题,Croparia IF 在 0.2.2 版本起,在 TranslationKey 被指明的情况下,将不会为作物添加默认的英文翻译。该特性在 0.2.3 被修复。

(如果不这么做,Forge 端无法显示 TranslationKey 对应的翻译,只能显示 Translations 定义的翻译)

4、模组依赖(可选)

如果你希望你定义的作物仅在一些模组加载条件下才被启用,那么你可以在作物定义文件中指定模组依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
    "name": "enchanted_golden_apple",
    "tier": 5,
    "material": "minecraft:enchanted_golden_apple",
    "color": "0xf5d2a1",
    "type": "food",
    "translationKey": "item.minecraft.enchanted_golden_apple",
    "translations": {
        "zh_cn": "附魔金苹果"
    },
    "dependencies": [
        [
            "minecraft", "example"
        ],
        [
            "neoforge"
        ]
    ]
}

模组依赖的规则如下:每一个列表中的至少一个模组被加载才可以判定通过。

以该代码为例,它表示:minecraft 和 example 至少有一个存在,并且 neoforge 存在才会加载该作物文件。


使用 KubeJS 添加自定义作物

自本模组 0.2.0 起,你还可以通过 KubeJS 来自定义作物。

在正确安装 KubeJS 并启动过一次游戏后,你的游戏目录下会生成目录 kubejs/startup_scripts。我们需要在此目录下创建一个后缀为 .js 的文件。

在文件中,你的 JS 代码应该遵循以下基本步骤:

  1. 获取 CropRegistry 基类;

  2. 实例化 CropRegistry;

  3. 添加作物;

  4. 触发注册行为。

以下是示例代码:

1
2
3
4
5
6
7
8
9
10
const CropRegistry = Java.loadClass("cool.muyucloud.croparia.kubejs.CropRegistry");  // 1.18 及以下使用 java(...) 代替 Java.loadClass(...)
let crops = new CropRegistry("MyCropRegistry"); // 字符串可以省略,用于日志生成
crops.simpleCrop(
    "example", "minecraft:enchanted_golden_apple", 0xABCDEF, 5, "CROP", "item.minecraft.enchanted_golden_apple",
    {
        "en_us": "My Custom Crop",
        "zh_cn": "我的自定义作物"
    }
);
crops.register();

添加作物时使用的方法 simpleCrop 的参数与前文中你在 JSON 文件定义的键值对作用类似,此处按照方法参数顺序做简单的对照:

  • 作物名称(name)

  • 作物材料(material)

  • 颜色(注意此处应该为整形数字而非字符串)(color)

  • 魔种等级(tier)

  • 作物种类(type)

  • Translation Key(translationKey)

  • 自定义翻译(translations)

注意:

  • 模组依赖(dependencies)不在该方法中,你可以使用 KubeJS 提供的相关 API 来实现更丰富的条件判断。

  • 由于该功能涉及了注册表相关内容,请务必不要手动触发这个脚本的重载!