本篇教程由作者设定未经允许禁止转载。
模组百科页面:https://www.mcmod.cn/class/3002.html
1.16 的资源加载模组 OpenLoader 和 1.12 的 ResourceLoader 所要求的路径结构有所区别,这篇教程将尽可能无微不至,老妪能解地讲解 OpenLoader (Forge) 的基本使用方法,非常简单,人人都可以学得会。
当然了,你得知道自己在干什么,自己想干什么,并且了解资源包/数据包的基本概念。如果不清楚,下面会给一些实际案例。
同时,如果你一向喜欢通过粗暴修改模组 jar 包的方式来篡改资源或数据,这个模组可能对你无所裨益。
再者,文本编辑用 VSCode 或者其它带高亮的编辑器。记事本永远不会告诉你哪里少了个逗号。
下文不涉及 CraftTweaker 相关内容。下文提及的部分内容使用 CrT 实现可能成倍简单。你知道,我知道你知道,你也应该知道我知道。
资源加载
相当于资源包。内含语言文件、材质、模型等内容
文件夹结构:
.minecraft 你应该知道它在哪里
┕ openloader 安装 OpenLoader 并首次启动后会自动生成该文件夹
┕ resources 也为自动生成的文件夹,这里应该存放的是资源(resource),与数据(data)区分
┕ immersiveengineering
┕ botania
┕ mekanism
┕ 模组 ID 新建一个(或一些)文件夹,用你想修改资源的模组 ID(MODID)命名它们,譬如上面的沉浸工程、植物魔法和通用机械。
┕ assets 新建这样一个文件夹,这里是模组所有资源的聚集地,下属路径应与模组 jar 内的完全一致
┕ 模组 ID 是的,一样。这里是各种资源(材质、方块状态、语言文件等等)的存放位置
┕ textures
┕ blockstates
┕ lang
实际案例:将寂静机械(Silent's Mechanisms)模组中的铜锭材质更换为 Minecraft 1.17 中的铜锭材质
因为在 1.16 ,资源和数据都是可以热重载(在游戏运行的情况下重新加载)的,所以你可以首先打开游戏,进入世界。
准备一个 Minecraft 1.17 铜锭的材质:
按照上面的路径中,唯一可能有困难的应该是模组 ID。以超多生物群系(Biomes O' Plenty)为例,打开它的 jar 包。
打开 assets 文件夹
所示即模组 ID:biomesoplenty
如此也可获得寂静机械的模组 ID:silents_mechanisms。
接下来开始查找寂静机械原本的铜锭材质在哪里。这一点不详细说明。只要是资源,就一定位于 jar 包的 assets 文件夹内。
可以快速找到铜锭材质及路径为 assets\silents_mechanisms\textures\item\copper_ingot.png
assets,因为是资源
silents_mechanisms,因为是它的模组 ID
textures,因为是材质
item,因为是物品
copper_ingot.png,因为是铜锭
那么参考上面的结构解析,就可以将这个路径复刻到 OpenLoader 里,所以新建一系列文件夹,构建这样的路径:
.minecraft\openloader\resources\silents_mechanisms\assets\silents_mechanisms\textures\item
在 item 文件夹里,放入你准备好的新铜锭材质。注意:必须保证你新的材质文件名与你在 jar 包里找到的材质文件名一致,才能覆盖掉旧材质。
放好之后,回到游戏,按下 F3+T,等待读条。此时最好不要进行任何操作,游戏出现未响应、冻结等属于正常情况。
待重载完毕即可。
数据加载
相当于数据包。内含标签(tag)、配方、进度、战利品表及模组自定义内容等
文件夹结构:
.minecraft
┕ openloader
┕ data 与 resources 并列,自动生成
┕ tconstruct
┕ quark
┕ harvestcraft
┕ 模组 ID
┕ pack.mcmeta 游戏识别数据包的必要文件,下面会详细说明
┕ data 这里是模组所有数据的聚集地,下属路径应与模组 jar 内的完全一致
┕ 模组 ID 这里就是各种数据,像下面的战利品表、标签、配方等等的存放位置了
┕ loot_tables
┕ tags
┕ recipes
pack.mcmeta
根据 Minecraft Wiki,当根目录中存在一个包含 JSON 格式数据的 pack.mcmeta 文件时才能被 Minecraft 识别为一个数据包。
具体不多赘述,你只需要新建一个文本文档,重命名为 pack.mcmeta(如果扩展名 txt 改不了自行百度),打开之后,复制入下面的 JSON:
{
"pack": {
"pack_format": 6,
"description": "OpenLoader Loaded Data"
}
}
"pack_format" 为数据包版本,在特定 Minecraft 版本区间之间会有所不同。1.16.5 版本对应的 pack_format 为 6。其它请至 Minecraft Wiki 查阅。
"description" 可以随意自定义。
实际案例 1:将 Pipez 的物品管道配方中的铁锭改为金锭
可以首先打开游戏,进入世界。
开始查找 Pipez 原本的物品管道配方数据文件在哪里。这一点不详细说明。只要是数据,就一定位于 jar 包的 data 文件夹内。
可以快速找到该数据文件及路径为 data\pipez\recipes\item_pipe.json
data,因为是数据
pipez,因为是它的模组 ID
recipes,因为是配方
item_pipe.json,因为是物品管道
参考上面的结构解析,将这个路径复刻到 OpenLoader 里,新建一系列文件夹,构建这样的路径,注意不要忘记 pack.mcmeta:
.minecraft\openloader\data\pipez\data\pipez\recipes
将 jar 包内的 item_pipe.json 解压进来,打开后可以看到:
{
"type": "minecraft:crafting_shaped",
"pattern": [
"III",
"DRD",
"III"
],
"key": {
"D": {
"item": "minecraft:dropper"
},
"I": {
"tag": "forge:ingots/iron"
},
"R": {
"tag": "forge:dusts/redstone"
}
},
"result": {
"item": "pipez:item_pipe",
"count": 16
}
}
把这个 JSON 转换成人话就是:
"type": "minecraft:crafting_shaped",
这个配方的类型(type)是工作台(crafting)里的有序(shaped)合成配方,类型全名就叫 minecraft:crafting_shaped
"result": {
"item": "pipez:item_pipe",
"count": 16
}
这个配方的产物(result)是一个物品(item),ID 叫做 pipez:item_pipe,数量(count)是 16 个。
好,接下来开始排九宫格。
首先给所有参与的物品每种一个“代号”,我们叫它 key。key 取什么字母没有讲究,大写小写,随心所欲。在九宫格图案的排布过程中,这些代号就可以用来指代一长串的 ID 或者标签。
要一个投掷器,是一个物品,ID 是 minecraft:dropper,代号就取首字母叫 D
要一个铁锭,为了和其它模组里可能的同标签物品所兼容(譬如气动工艺的压缩铁),这里就采用它的标签 forge:ingots/iron。
forge,因为这个标签是 Forge 给的,原版不自带,因为原版并不会有第二种铁锭,但是模组说不准
ingots,因为这个东西的类型是一个锭,不是粒,不是粉,不是齿轮
iron,因为这个锭是铁的,不是金,不是银,不是铿铀
盲写的话,标签大多可以靠猜。基础材料类型一般都在 forge 名下。譬如钛锭肯定是 forge:ingots/titanium,流明齿轮肯定是forge:gears/lumium。晚安的梦境模组在几个版本之前并没有将自己的材料纳入 Forge 的标签体系,必定会对统一性造成困难。同时,一些模组会对原版的标签进行扩充。拿沙子来说,原版的沙子有两种:沙子、红沙,这种情况下这两种物品八成有一个同样的标签,就是 minecraft:sand。绝大多数模组的沙子(譬如你将去的生物群系中的各色沙子)都在这个标签下。
言归正传。对于 forge:ingots/iron 这个标签,同样取首字母叫 I
再要一个红石。模组物品用 forge:ingots/iron 标签的已经少之又少了,红石估计更少,但是为了保险起见(贯彻友谊同志有矿词必用矿词的精神),还是取标签 forge:dusts/redstone 。依然是:谁给的?Forge。是什么?粉。什么的粉?红石的粉。给它个代号,R。
现在我们有了一个物品(item),minecraft:dropper,代号(key)是“D”;
一个标签(tag),forge:ingots/iron,代号“I”;
还有一个标签(tag),forge:dusts/redstone,代号“R”。
写成不是人话的 JSON 就是:
"key": {
"D": {
"item": "minecraft:dropper"
},
"I": {
"tag": "forge:ingots/iron"
},
"R": {
"tag": "forge:dusts/redstone"
}
},
万事俱备,开始排队。
在九宫格里,这些代号是以什么式样(pattern)排布的呢?
"pattern": [
"III",
"DRD",
"III"
],
不难发现,属性 "pattern" 的值,这个数组里的三个字符串元素就分别表示工作台的一二三行。抽象的文字转换成实际的合成表就是这样:
费劲分析完,把铁锭换成金锭想想都简单。在你解压下来放在正确路径里的 JSON 里把
"I": {
"tag": "forge:ingots/iron"
},
换成
"I": {
"tag": "forge:ingots/gold"
},
换个代号?可以。但是千万记住把 pattern 里的 I 也改了
"G": {
"tag": "forge:ingots/gold"
},
不想用标签,想直接用物品 ID?可以。但是也不要忘记把 "tag" 改成 "item"。两者不匹配会导致配方加载失败。如果你加载失败了,先看指定的 key 跟 pattern 里的 key 是否一致,以及标签和物品有没有不匹配。
"G": {
"item": "minecraft:gold_ingot"
},
那么你现在得到的 JSON 应该是这样:
{
"type": "minecraft:crafting_shaped",
"pattern": [
"GGG",
"DRD",
"GGG"
],
"key": {
"D": {
"item": "minecraft:dropper"
},
"G": {
"item": "minecraft:gold_ingot"
},
"R": {
"tag": "forge:dusts/redstone"
}
},
"result": {
"item": "pipez:item_pipe",
"count": 16
}
}
那如果我想把这个配方直接删掉呢?
把 JSON 解压到正确路径,把里面东西全部删掉,保存。
上面一直在强调解压,复制,是因为无论你对 JSON 里面的内容做了怎样的修改甚至清空,它的文件名你绝对不可以动。item_pipe.json 必须永远是 item_pipe.json。在配方数据里,文件名也作为这个配方的配方 ID 而存在。
修改完毕之后,回到游戏,输入命令 /reload,等待重载。重载数据的速度比重载资源快得多,其中只会有 1-2 次轻微的卡顿。
待重载完毕即可。
实际案例 2:将通用机械(Mekanism)的结构玻璃设置为可搭建缤纷蜜蜂(Resourceful Bees,汉化包译“丰饶蜜蜂”)的蜂场的方块
同样可以首先打开游戏,进入世界。
通过对官方资料的参阅可知,可搭建蜂场的方块均由标签 resourcefulbees:valid_apiary 定义。
开始查找缤纷蜜蜂定义 resourcefulbees:valid_apiary 标签的数据文件。这一点不详细说明。只要是数据,就一定位于 jar 包的 data 文件夹内。
可以快速找到该数据文件及路径为 data\resourcefulbees\tags\blocks\valid_apiary.json 以及 data\resourcefulbees\tags\items\valid_apiary.json
data,因为是数据
resourcefulbees,因为是它的模组 ID
tags,因为是标签
blocks 和 items,因为需要遵照其它蜂场方块一样,同时赋予它物品和方块标签
valid_apiary.json,因为这是定义有效蜂场方块标签的文件
首先参考上面的结构解析,将这个路径复刻到 OpenLoader 里,所以新建一系列文件夹,构建这样两个路径,注意不要忘记 pack.mcmeta:
.minecraft\openloader\data\resourcefulbees\data\resourcefulbees\tags\blocks
.minecraft\openloader\data\resourcefulbees\data\resourcefulbees\tags\items
在 blocks 和 items 文件夹里,分别将 jar 包内的 valid_apiary.json 解压进来,接着打开两份文件,可以看到(两份文件有细微差别,下面是 items 文件夹下的 valid_apiary.json):
{
"replace": false,
"values": [
"resourcefulbees:t1_apiary",
"resourcefulbees:t2_apiary",
"resourcefulbees:t3_apiary",
"resourcefulbees:t4_apiary",
"resourcefulbees:apiary_storage",
"resourcefulbees:apiary_breeder",
"#minecraft:wool",
"#minecraft:planks",
"#minecraft:sand",
"#minecraft:logs",
"#minecraft:doors",
"#minecraft:stairs",
"#minecraft:slabs",
"#minecraft:walls",
"#minecraft:leaves",
"#minecraft:trapdoors",
"#minecraft:fences",
"#forge:end_stones",
"#forge:fences",
"#forge:glass",
"#forge:glass_panes",
"#forge:gravel",
"#forge:netherrack",
"#forge:obsidian",
"#forge:ores",
"#forge:sand",
"#forge:sandstone",
"#forge:stone",
"#forge:storage_blocks",
"#forge:fence_gates",
"minecraft:bricks",
"minecraft:farmland",
"minecraft:glowstone",
"minecraft:redstone_lamp",
"minecraft:shroomlight"
]
}
"replace" 属性决定下面的内容是在原有内容上进行增添还是覆盖。在不改动原本设定的情况下,只把结构玻璃加进这个标签名下,直接可以保持 replace 为 false 不动,去除 "value" 数组的所有原有元素,加上一条 mekanism:structural_glass :
{
"replace": false,
"values": [
"mekanism:structural_glass"
]
}
replace 属性为 false,即不影响原版,不影响其它模组,我 OpenLoader 只在你们的基础上加点东西。
如果想让结构玻璃成为唯一能搭建蜂场的方块,模组原本的设定统统推倒,那么把 replace 设为 true 即可:
{
"replace": true,
"values": [
"mekanism:structural_glass"
]
}
replace 属性为 true,即唯 OpenLoader 最大,不管谁加了什么,都以我为万物之始,所有解释权只在我一份文件之中。
最上面原始内容中 value 的数组里还有一些带井号(#)的元素。看样子就知道了,是标签。那么如果只想让结构方块和所有能搭建信标的方块能够搭建蜂场,从 Minecraft Wiki 中可以获知(相关条目),用于检查信标下方的方块是否能够激活信标的标签为 minecraft:beacon_base_blocks(仅为方块标签故无需加入 items\valid_apiary.json),就可以写成:
{
"replace": true,
"values": [
"mekanism:structural_glass",
"#minecraft:beacon_base_blocks"
]
}
最后保存修改,/reload,待重载完毕即可。
上面提到了 Forge 对各模组提供的非常棒的统一标签格式,下次讲讲我为什么会那么讨厌晚安的梦境模组(当然它现在改了)以前的标签状况以及如何利用这些格式高度统一化的标签借助 CraftTweaker 一次性编写成套的配方。