Mod 文件

Mod 文件

Mod 文件决定哪些 Mod 被打包进 JAR、在“Mods”菜单中显示什么信息,以及游戏应如何加载这些 Mod。

mods.toml 分成 JAR 属性、Mod 属性与依赖配置,examplemod 的 modId 与 javafml 的 @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。