跳转至

原文:MinecraftForge/Documentation · 目标版本:Forge 1.20.1

模组文件

模组文件(Mod Files)负责确定哪些模组被打包到你的 JAR 中、在「模组」菜单中显示哪些信息,以及你的模组应如何被加载到游戏中。

mods.toml

mods.toml 文件定义了模组的元数据。它还包含在「模组」菜单中显示的附加信息,以及模组应如何被加载到游戏中的配置。

该文件使用 TOML(Tom's Obvious Minimal Language) 格式。文件必须存放在你所用源集的资源目录下的 META-INF 文件夹中(对于 main 源集,路径为 src/main/resources/META-INF/mods.toml)。一个 mods.toml 文件大致如下:

modLoader="javafml"
loaderVersion="[47,)"

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="[47,)"
  ordering="NONE"
  side="BOTH"

[[dependencies.examplemod]]
  modId="minecraft"
  mandatory=true
  versionRange="[1.20.1,)"
  ordering="NONE"
  side="BOTH"

mods.toml 由三部分组成:与模组文件本身关联的非模组专属属性、每个模组各有一段配置的模组专属属性,以及每个模组(或多个模组)的依赖配置。下面将逐一说明 mods.toml 中各属性的含义,其中标注为「必填」的属性必须指定值,否则会抛出异常。

非模组专属属性

非模组专属属性(Non-Mod-Specific Properties)与 JAR 本身关联,用于指示如何加载其中的模组以及任何额外的全局元数据。

属性 类型 默认值 说明 示例
modLoader string 必填 模组使用的语言加载器。可用于支持替代的语言结构,例如以 Kotlin 对象作为主文件,或以接口、方法等方式确定入口点。Forge 提供了 Java 加载器 "javafml" 和低代码/无代码加载器 "lowcodefml" "javafml"
loaderVersion string 必填 语言加载器的可接受版本范围,使用 Maven 版本范围表示法。对于 javafmllowcodefml,版本号对应 Forge 版本的主版本号。 "[47,)"
license string 必填 JAR 中模组所采用的许可证。建议设置为所使用的 SPDX 标识符 和/或许可证链接。你可以访问 https://choosealicense.com/ 来帮助选择合适的许可证。 "MIT"
showAsResourcePack boolean false 设为 true 时,模组的资源将在「资源包」菜单中显示为独立的资源包,而非合并到「模组资源」包中。 true
clientSideOnly boolean false 设为 true 时,Forge 在专用服务器上运行时会跳过加载 mods.toml 中声明的所有模组,并在客户端运行时为它们设置正确的 displayTest true
services array [] 你的模组使用的服务数组。这是 Forge 的 Java 平台模块系统(Java Platform Module System)实现中,为模组创建的模块所消费的配置。该属性已弃用,推荐使用标准的 Java 服务声明方式,即单独的服务文件或 module-info.java 中的 uses 指令 ["net.minecraftforge.forgespi.language.IModLanguageProvider"]
properties table {} 替换属性的键值表。由 StringSubstitutor 用于将 ${file.<key>} 替换为对应的值。目前仅用于替换模组专属属性中的 version { "example" = "1.2.3" },通过 ${file.example} 引用
issueTrackerURL string 用于报告和追踪模组问题的 URL。 "https://forums.minecraftforge.net/"

Important

services 属性在功能上等同于在模块中指定 uses 指令,用于允许加载指定类型的服务。

模组专属属性

模组专属属性(Mod-Specific Properties)通过 [[mods]] 头绑定到指定的模组。这是一个表格数组(array of tables):从该头开始直到下一个头之前的所有键/值属性都将归属于该模组。

# examplemod1 的属性
[[mods]]
modId = "examplemod1"

# examplemod2 的属性
[[mods]]
modId = "examplemod2"
属性 类型 默认值 说明 示例
modId string 必填 代表该模组的唯一标识符。必须匹配 ^[a-z][a-z0-9_]{1,63}$(2–64 个字符的字符串;以小写字母开头;由小写字母、数字或下划线组成)。 "examplemod"
namespace string modId 模组的备用命名空间。必须匹配 ^[a-z][a-z0-9_.-]{1,63}$(2–64 个字符的字符串;以小写字母开头;由小写字母、数字、下划线、点或短横线组成)。目前未使用。 "example"
version string "1" 模组的版本号,建议使用 Maven 版本控制的变体格式。设为 ${file.jarVersion} 时,将被替换为 JAR 清单中 Implementation-Version 属性的值(在开发环境中显示为 0.0NONE)。 "1.20.1-1.0.0.0"
displayName string modId 模组的显示名称。用于在界面上展示模组(如模组列表、模组版本不匹配界面)。 "Example Mod"
description string "MISSING DESCRIPTION" 在模组列表界面中显示的模组描述。建议使用 多行字面量字符串 "This is an example."
logoFile string 在模组列表界面中使用的图片文件名(含扩展名)。Logo 必须位于 JAR 根目录或源集根目录下(例如 main 源集的 src/main/resources)。 "example_logo.png"
logoBlur boolean true 渲染 logoFile 时使用 GL_LINEAR*(true)还是 GL_NEAREST*(false)。 false
updateJSONURL string 更新检查器使用的 JSON URL,用于确认你正在运行的模组是否为最新版本。 "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json"
features table {} 见「特性」一节。 { java_version = "17" }
modproperties table {} 与该模组关联的键/值属性表。Forge 本身目前未使用,主要供模组自行使用。 { example = "value" }
modUrl string 模组下载页面的 URL。目前未使用。 "https://files.minecraftforge.net/"
credits string 在模组列表界面中显示的致谢和鸣谢信息。 "The person over here and there."
authors string 在模组列表界面中显示的模组作者。 "Example Person"
displayURL string 在模组列表界面中显示的模组展示页面 URL。 "https://minecraftforge.net/"
displayTest string "MATCH_VERSION" 见「逻辑端」一节。 "NONE"

特性

特性(Features)系统允许模组在加载时要求某些设置、软件或硬件必须可用。当某个特性要求未被满足时,模组加载将失败,并告知用户相关要求。目前 Forge 提供以下特性:

特性 说明 示例
java_version Java 版本的可接受版本范围,使用 Maven 版本范围表示法。应设置为 Minecraft 所使用的受支持版本。 "[17,)"

依赖配置

模组可以声明其依赖项,Forge 会在加载模组之前检查这些依赖。依赖配置通过表格数组 [[dependencies.<modid>]] 创建,其中 modid 是需要声明依赖的模组的标识符。

属性 类型 默认值 说明 示例
modId string 必填 作为依赖项的模组的标识符。 "example_library"
mandatory boolean 必填 当该依赖未满足时,游戏是否应崩溃。 true
versionRange string "" 依赖的可接受版本范围,使用 Maven 版本范围表示法。空字符串匹配任意版本。 "[1, 2)"
ordering string "NONE" 定义该模组必须在此依赖之前("BEFORE")还是之后("AFTER")加载。如果加载顺序无关紧要,设为 "NONE" "AFTER"
side string "BOTH" 依赖项必须存在的[物理端][dist]:"CLIENT""SERVER""BOTH" "CLIENT"
referralUrl string 依赖项下载页面的 URL。目前未使用。 "https://library.example.com/"

Warning

两个模组的 ordering 可能导致循环依赖而崩溃:例如模组 A 必须在模组 B 之前加载("BEFORE"),而模组 B 又必须在模组 A 之前加载("BEFORE")。

模组入口点

mods.toml 填写完毕后,我们需要提供一个入口点(Entrypoint)来开始编写模组代码。入口点本质上是模组执行的起点。入口点本身由 mods.toml 中使用的语言加载器决定。

javafml@Mod

javafml 是 Forge 为 Java 编程语言提供的语言加载器。入口点通过带有 @Mod 注解的 public 类来定义。@Mod 的值必须包含 mods.toml 中指定的某个模组 ID。在类的构造函数中,可以编写所有初始化逻辑(例如[注册事件][events]、[添加 DeferredRegister][registration] 等)。模组总线(Mod Bus)可以通过构造函数参数传入的 FMLJavaModLoadingContext 获取。

@Mod("examplemod") // 必须与 mods.toml 中的 modId 匹配
public class Example {

  public Example(FMLJavaModLoadingContext context) {
    // 在此处编写初始化逻辑
    var modBus = context.getModEventBus();

    // ...
  }
}

lowcodefml

lowcodefml 是一种语言加载器,用于将数据包和资源包以模组形式分发,而无需编写代码入口点。之所以命名为 lowcodefml 而非 nocodefml,是因为未来可能会添加需要少量编码的辅助功能。