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

模组百科页面: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 铜锭的材质:[宝宝早教] OpenLoader 简单使用以及其它想聊的东西-第1张图片

按照上面的路径中,唯一可能有困难的应该是模组 ID。以超多生物群系(Biomes O' Plenty)为例,打开它的 jar 包。

[宝宝早教] OpenLoader 简单使用以及其它想聊的东西-第2张图片

打开 assets 文件夹

[宝宝早教] OpenLoader 简单使用以及其它想聊的东西-第3张图片所示即模组 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

   ┕ dataresources 并列,自动生成

      ┕ 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 个。


好,接下来开始排九宫格。

首先给所有参与的物品每种一个“代号”,我们叫它 keykey 取什么字母没有讲究,大写小写,随心所欲。在九宫格图案的排布过程中,这些代号就可以用来指代一长串的 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" 的值,这个数组里的三个字符串元素就分别表示工作台的一二三行。抽象的文字转换成实际的合成表就是这样:

[宝宝早教] OpenLoader 简单使用以及其它想聊的东西-第4张图片


费劲分析完,把铁锭换成金锭想想都简单。在你解压下来放在正确路径里的 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 一次性编写成套的配方。