Mod 文件
Mod 文件决定哪些 Mod 被打包进 JAR、在“Mods”菜单中显示什么信息,以及游戏应如何加载这些 Mod。
原创说明图,依据 Forge 1.21.x 官方文档 绘制。
mods.toml
mods.toml 定义 Mod 的元数据,也包含“Mods”菜单中显示的信息以及加载方式。文件采用 TOML 格式,必须位于所使用源集的资源目录中的 META-INF 文件夹下;对于 main 源集,路径为 src/main/resources/META-INF/mods.toml。例如:
modLoader = "javafml"
loaderVersion = "[52,)"
license = "All Rights Reserved"
issueTrackerURL = "https://github.com/MinecraftForge/MinecraftForge/issues"
showAsResourcePack = false
clientSideOnly = false
[[mods]]
modId="examplemod"
version="1.0.0.0"
displayName="Example Mod"
updateJSONURL="https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json"
displayURL="https://minecraftforge.net"
logoFile="logo.png"
credits="I'd like to thank my mother and father."
authors="Author"
description='''
Lets you craft dirt into diamonds. This is a traditional mod that has existed for eons. It is ancient. The holy Notch created it. Jeb rainbowfied it. Dinnerbone made it upside down. Etc.
'''
displayTest="MATCH_VERSION"
[[dependencies.examplemod]]
modId="forge"
mandatory=true
versionRange=" [52,)"
ordering="NONE"
side="BOTH"
[[dependencies.examplemod]]
modId="minecraft"
mandatory=true
versionRange=" [1.21.1,)"
ordering="NONE"
side="BOTH"
文件分为三部分:关联 Mod 文件的非 Mod 专属属性;每个 Mod 各有一节的 Mod 属性;以及每个 Mod 的依赖配置。下文中“必填”表示必须提供值,否则会抛出异常。
非 Mod 专属属性
这些属性与 JAR 本身关联,指定 Mod 的加载方式及其他全局元数据。
| 属性 | 类型 | 默认值 | 说明 | 示例 |
|---|---|---|---|---|
modLoader |
字符串 | 必填 | 语言加载器,可用于支持 Kotlin 对象等其他语言结构或其他入口判定方式。Forge 提供 Java 加载器 javafml 和低代码加载器 lowcodefml。 |
"javafml" |
loaderVersion |
字符串 | 必填 | 可接受的语言加载器版本范围,使用 Maven 版本范围。javafml 和 lowcodefml 的版本是 Forge 版本的主版本号,例如 [46,)。 |
"[46,)" |
license |
字符串 | 必填 | JAR 中 Mod 所用的许可证。建议使用 SPDX 标识符或许可证链接,例如 MIT;可参考 Choose a License。 |
"MIT" |
showAsResourcePack |
布尔值 | false |
为 true 时,将 Mod 资源作为独立资源包显示,而不是合并到“Mod resources”资源包。 |
true |
clientSideOnly |
布尔值 | false |
为 true 时,独立服务器跳过加载该文件声明的所有 Mod;客户端运行时为它们设置正确的 displayTest。 |
true |
services |
数组 | [] |
Mod 使用的服务列表,用于 Forge Java 模块系统实现所创建的模块。已弃用,建议使用独立服务文件或 module-info.java 的 uses 指令。 |
["net.minecraftforge.forgespi.language.IModLanguageProvider"] |
properties |
表 | {} |
替换属性表,供 StringSubstitutor 将 ${file.<key>} 替换为对应值。目前只用于替换 Mod 属性中的 version。例如 { "example" = "1.2.3" } 可通过 ${file.example} 引用。 |
{ "example" = "1.2.3" },以 ${file.example} 引用 |
issueTrackerURL |
字符串 | 无 | 报告和跟踪 Mod 问题的 URL,例如 https://forums.minecraftforge.net/。 |
"https://forums.minecraftforge.net/" |
services 在功能上等同于模块中的 uses 指令,允许加载指定类型的服务。
Mod 专属属性
使用 [[mods]] 标题将属性关联到特定 Mod。这是一个表数组,下一个标题之前的键值均属于该 Mod。
# examplemod1 的属性
[[mods]]
modId = "examplemod1"
# examplemod2 的属性
[[mods]]
modId = "examplemod2"
| 属性 | 类型 | 默认值 | 说明 | 示例 |
|---|---|---|---|---|
modId |
字符串 | 必填 | 唯一标识符,必须匹配 ^[a-z][a-z0-9_]{1,63}$:2–64 个字符,以小写字母开头,只含小写字母、数字和下划线。 |
"examplemod" |
namespace |
字符串 | modId 的值 |
覆盖命名空间,匹配 ^[a-z][a-z0-9_.-]{1,63}$:2–64 个字符,以小写字母开头,可含小写字母、数字、下划线、点和连字符。目前未使用。 |
"example" |
version |
字符串 | "1" |
Mod 版本,建议采用 Maven 版本编号变体。设为 ${file.jarVersion} 时替换为 JAR 清单中的 Implementation-Version;开发环境显示 0.0NONE。 |
"1.21.1-1.0.0.0" |
displayName |
字符串 | modId 的值 |
在 Mod 列表、不匹配提示等界面显示的名称。 | "Example Mod" |
description |
字符串 | "MISSING DESCRIPTION" |
Mod 列表中的描述,建议使用 TOML 多行字面字符串。 | "This is an example." |
logoFile |
字符串 | 无 | Mod 列表中使用的图片文件名及扩展名;文件必须位于 JAR 根目录或源集根目录,例如 src/main/resources。 |
"example_logo.png" |
logoBlur |
布尔值 | true |
渲染 logoFile 时使用 GL_LINEAR*(true)还是 GL_NEAREST*(false)。 |
false |
updateJSONURL |
字符串 | 无 | 更新检查器使用的 JSON URL。 | "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json" |
features |
表 | {} |
特性要求,见下文。 | { java_version = "17" } |
modproperties |
表 | {} |
与 Mod 关联的键值表,Forge 目前不使用,主要供 Mod 使用。 | { example = "value" } |
modUrl |
字符串 | 无 | Mod 下载页面 URL,目前未使用。 | "https://files.minecraftforge.net/" |
credits |
字符串 | 无 | Mod 列表中显示的致谢信息。 | "The person over here and there." |
authors |
字符串 | 无 | Mod 列表中显示的作者。 | "Example Person" |
displayURL |
字符串 | 无 | Mod 列表中显示的 Mod 页面 URL。 | "https://minecraftforge.net/" |
displayTest |
字符串 | "MATCH_VERSION" |
参见端与单端 Mod。 | "NONE" |
特性
特性系统允许 Mod 要求加载时具备特定设置、软件或硬件。未满足要求时加载会失败并告知用户。目前 Forge 提供 java_version:用 Maven 版本范围表示可接受的 Java 版本范围,应该与 Minecraft 所支持的版本一致,例如 "[17,)"。译注:此处保留原文示例;Forge 1.21.x 入门页要求 Java 21,实际配置应与所支持的 Minecraft 和 Java 版本一致。
依赖配置
Forge 在加载 Mod 前检查声明的依赖。使用表数组 [[dependencies.<modid>]] 创建配置,其中 modid 是声明依赖的 Mod ID。
| 属性 | 类型 | 默认值 | 说明 | 示例 |
|---|---|---|---|---|
modId |
字符串 | 必填 | 作为依赖项的 Mod 标识符。 | "example_library" |
mandatory |
布尔值 | 必填 | 不满足依赖时游戏是否崩溃。 | true |
versionRange |
字符串 | "" |
可接受的版本范围,采用 Maven 版本范围格式;空字符串匹配任何版本。 | "[1, 2)" |
ordering |
字符串 | "NONE" |
Mod 是否必须在依赖之前(BEFORE)或之后(AFTER)加载;顺序无关时为 NONE。 |
"AFTER" |
side |
字符串 | "BOTH" |
依赖必须存在的物理端:CLIENT、SERVER 或 BOTH。 |
"CLIENT" |
referralUrl |
字符串 | 无 | 依赖项下载页面 URL,目前未使用。 | "https://library.example.com/" |
警告:两个 Mod 的
ordering可能形成循环依赖并导致崩溃,例如 A 必须在 B 之前加载,而 B 又必须在 A 之前加载。
Mod 入口点
填写 mods.toml 后,需要提供入口点以开始编写 Mod。入口点是执行 Mod 的起点,由 mods.toml 中的语言加载器决定。
javafml 和 @Mod
javafml 是 Forge 提供的 Java 语言加载器。入口点是带 @Mod 注解的公共类,注解的值必须是 mods.toml 中声明的 Mod ID 之一。初始化逻辑(例如注册事件或添加 DeferredRegister)可以写在构造函数中。通过作为构造函数参数传入的 FMLJavaModLoadingContext 获取 Mod 总线:
@Mod("examplemod") // 必须与 mods.toml 匹配
public class Example {
public Example(FMLJavaModLoadingContext context) {
// 在此初始化
var modBus = context.getModEventBus();
// ...
}
}
lowcodefml
lowcodefml 是一种语言加载器,可将数据包和资源包作为 Mod 分发,无需代码入口点。它被称为 lowcodefml 而非 nocodefml,是为了给将来可能需要少量代码的小幅扩展留有余地。
原文:Mod Files。