认识 Forge MDK 项目结构
在上一章中,我们已经完成了 Java、IntelliJ IDEA 和 Forge MDK 开发环境的配置,并通过 Gradle 生成了 IntelliJ IDEA 所需要的 Minecraft 运行配置。
此时再次打开项目,可以发现项目目录比刚刚解压 Forge MDK 时多出了一些文件和目录。
在正式修改模组之前,我们先简单认识一下现在的项目结构。

├─ .gradle ├─ .idea(.vscode) <-取决于您选择的编辑器和Gradle生成对应编辑器配置的选项 *I ├─ build ├─ gradle ├─ run ├─ run-data ├─ src │ └─ main │ ├─ java │ │ └─ com │ │ └─ example │ │ └─ examplemod │ │ └─ ExampleMod.java │ └─ resources │ ├─ META-INF │ │ └─ mods.toml │ └─ pack.mcmeta ├─ build.gradle ├─ gradle.properties ├─ gradlew ├─ gradlew.bat └─ settings.gradle
*I :在上一章节我主要介绍的是IDEA环境,因此使用genIntellijRuns生成IDEA的配置文件,但是在本文我使用VSCode作为演示;编辑器(IDE)的改动不会大幅影响开发示例的展示。 IDEA使用genIntellijRuns,VSCode使用genVSCodeRuns命令生成对应的配置文件。
src/main/java
这个目录主要用于存放mod的Java源代码;Forge 1.16.5 MDK自带了一个名为 com.example.examplemod 的包;其中里面有一个Example.java文件,该文件是Forge 1.16.5 MDK给我们的一个示例mod主类。
//ExampleMod.java
package com.example.examplemod;
...
import net.minecraftforge.fml.common.Mod;
...
@Mod("examplemod")
public class ExampleMod {
public ExampleMod() {
...
}
}
ExampleMod.java是mod的主要入口。
@Mod("examplemod") 中的examplemod是mod的id用于标识mod,在本文后面会将此处修改为自己的mod的id。
在后面的开发中我们会在 src/main/java中存放不同功能的代码。
src/main/resources
这个目录主要用于存放模组所需的各种资源文件,和 src/main/java 一样重要!后面的开发我们可能会在此存放:
- 模组配置
- 语言文件
- 物品名称
- 方块名称
- 物品模型
- 方块模型
- 材质
- 音效
- 配方
- 战利品表
- 等等
mods.toml
该文件位于src/main/resources/META-INF/mods.toml。这是一个非常重要的文件,Forge会通过这个文件读取mod的基本信息:
- Mod ID
- Mod 名称
- Mod 版本
- 作者
- 模组描述
- Minecraft 版本要求
- Forge 版本要求
- 依赖关系
- 等等
主要内容如下
modLoader="javafml" #mandatory
loaderVersion="${loader_version_range}"
license="${mod_license}"
issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional
[[mods]] #mandatory
modId="${mod_id}" #mandatory
version="${mod_version}" #mandatory
displayName="${mod_name}" #mandatory
updateJSONURL="https://change.me.example.invalid/updates.json" #optional
displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional
logoFile="examplemod.png" #optional
credits="" #optional
authors="${mod_authors}" #optional
description='''${mod_description}'''
[[dependencies.${mod_id}]] #optional
modId="forge" #mandatory
mandatory=true #mandatory
versionRange="${forge_version_range}" #mandatory
ordering="NONE"
side="BOTH"
[[dependencies.${mod_id}]]
modId="minecraft"
mandatory=true
versionRange="${minecraft_version_range}"
ordering="NONE"
side="BOTH"
需要注意的是mods配置块中的modId选项,其内容必须和java源代码中的@Mod("examplemod")中的内容一致,必须全小写;dependencies中在本阶段中无需注意。
build.gradle
这是整个Forge项目中非常重要的文件,Forge MDK 使用 Gradle 管理整个项目,而 build.gradle 就是 Gradle 使用的主要构建配置文件之一。
它负责的内容包括:
- Forge 开发环境配置
- Minecraft 运行配置
- 项目依赖
- Java 编译
- Mod 构建
- 最终 JAR 文件生成
- 等等
上一章中我们执行的:genIntellijRuns 就是通过 Gradle 完成的,在当前阶段我们不需要深入了解其内容。
build
在执行了一些Gradle任务之后项目会出现该目录,这是Gradle构建输出的目录。
我们编译项目时产生的临时文件、编译结果、处理后的资源和最终 JAR 文件等内容,都可能出现在这里。
run & run-data
在我们进行调试mod时,Forge会实机运行Minecraft供开发者自由调试,run这个目录会作为当前开发环境的Minecraft游戏目录。
修改默认的ExampleMod
上一部分已经简单介绍了Forge项目的结构,现在开始对Forge给我们的示例程序进行个性化修改,本文及后续我将使用swordpower作为modId进行演示。
modId
在接下来的mod开发中我们会经常使用modId,modId是Forge用来识别不同模组的唯一标识,Forge要求modId可以使用小写英文字母、数字和下划线标识,不能有空格和大写字母,命名尽可能的简短且能够表达自己的mod;之后添加资源文件和数据文件时可能会用到modId对目录进行命名,所以modId一旦确定最好不要再更改。
修改java包名
我们要在IDEA或VSCode中分别将src/main/java下的com、example和examplemod目录的名字改为com、icetowne、swordpower;第一个目录你可以改为org、net等等标识自己的组织或身份;第二个目录你可以改为自己的ID,标识自己;第三个目录你可以改为mod名,标识mod项目名;本文使用com.icetowne.swordpower进行演示。如你在IDEA或VSCode中修改包名,它会自动修改位于ExampleMod.java的package一行信息,如IDE未能自动修改,你需手动修改;如你的包名为com.icetowne.swordpower,你需要将package一行改为package com.icetowne.swordpower;。
修改主类名
Forge给出的示例主类是ExampleMod.java,我们需要将它的名字改为SwordPower.java。当你在IDE中修改了主类名,它会自动将public class ExampleMod改为public class SwordPower
修改主类的modId
在SwordPower.java 中找到@Mod("examplemod") ,将里面的examplemod改为swordpower。
创建MOD_ID
可见@Mod中的内容是直接写死的,如果代码其他地方也需要用到modId的话我们需要再打一次modId,需要修改modId的时候我们还需要一个一个改动会很麻烦;为了方便后面的开发,我打算创建一个MOD_ID用于存储我的id。
在主类public class SwordPower下加入public static final String MOD_ID = "swordpower";,然后将@Mod中的内容改为@Mod(SwordPower.MOD_ID)。
修改mods.toml
在上面的小节,我们已经将java的源代码修改成自己的东西了,下面需要继续修改mods.toml中的内容让forge可以正确识别mod。
将原文件中的
[[mods]] modId="examplemod"
改为
[[mods]] modId="swordpower"
这个值必须和Java代码中的一致。
接着修改显示名、作者和描述
[[mods]]
modId="swordpower"
displayName="${mod_name}"
authors="${mod_authors}"
description='''${mod_description}'''
改为
[[mods]] modId="swordpower" displayName="Sword Power" authors="ICETOWNE.COM" description='''An over-power sword.'''
修改build.gradle的配置
在build.gradle中找到
version = mod_version group = mod_group_id
改为
version = ‘1.0.0’ group = ‘com.icetowne.swordpower’
运行mod
前面我们已经将默认示例mod修改为自己的东西了,接下来启动Minecraft看一下Forge能不能加载它。
在一切之前
请确保IDE工作区没有报错(Error),否则下面的操作都是无用功。
运行Minecraft
在上一章我们已经生成了依赖,因此我们可以在没有错误的前提下运行runClient以启动Minecraft。
运行runClient后控制台会给出一堆调试信息,现在不需要理会;我们等到Minecraft完全启动后,点击Mods查看mod列表检查我们的mod是否正确被Forge加载了。

到现在为止,我们已经完成了一个能够正常运行的 Forge 模组项目。
以后我们继续修改 Java 代码或者添加新的模组内容后,通常只需要再次启动runClient即可重新测试。
测试完成以后,可以像平时一样直接在 Minecraft 中点击Quit Game退出游戏;退出以后,IDE 中的runClient进程也会随之结束。
评论(0)
暂无评论