boxmoe_header_banner_img

Welcome to ICETOWNE

文章导读

制作第一个我的世界 Forge 模组(二)-修改模组并运行 Minecraft


avatar
SYLVIA 2026年9月24日 90

认识 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进程也会随之结束。

制作第一个我的世界 Forge 模组(二)-修改模组并运行 Minecraft
CC CCCC BYCC NCCC SA
作者SYLVIA
发布于2026-09-24
许可协议CC BY-NC-SA 4.0


评论(0)

查看评论列表

暂无评论


发表评论