介绍
文章是基于Forge文档翻译过来的,旨在理解和学习,存在错误请指正。
链接地址为https://docs.minecraftforge.net/en/1.18.x
Forge入门
这是一个简单的指南,让你从无到有的写出一个基本的Mod。本文档的其余本部为这里的详细介绍。
从零开始
-
在电脑上安装Java17开发工具包(JDK)和64位的Java虚拟机(JVM)。Minecraft和MinecraftForge都是针对Java17编译的。
-
从Forge网站站点获取Mod开发工具包(MDK)。
-
将下载的MDK放到空目录中。你应该能看到src/main/java中有一堆文件和示例Mod。这些文件中只有少数是Mod开发所必须的,你可以在所有项目中重复是有这些文件。这些文件是:
- build.gradle
- gradlew.bat
- gradlew
- gradle文件夹
-
将上面列出的文件移到新的文件夹中。这将是你的Mod项目文件夹中。
-
选择你的IDE
- Forge只明确支持使Eclipse进行开发,但对于Inerllij IDEA、Visual Studio Code平台有额外运行任务进行开发。然而,任何平台都可以进行开发。
- 对于Intellij IDEA和Eclipse,他们的Gradle集成可以配置初始工作区的设置。
- 对于build.gradle文件更改要生效,则需要调用Gradle重新加载项目。
-
生成IDE启动/运行配置
- 对于Eclipse,运行genEclipseRuns Gradle任务(gradlew genEclipseRuns) 。这将生成启动配置并下载游戏运行所需的所有资源。完成后,刷新/重启你的项目。
- 对于IEDA,运行genIntellijRuns gradle任务(gradlew-genIntellijRun)。这将生成启动配置并下载游戏运行所需的所有资源。如果遇到一个错误:“module not specified”,可以在编辑配置选择“main”,也可以通过ideaModule属性指定它。
- 对于VsCode,运行genVSCodeRuns Gradle任务(gradlew-genVSCodeRun)。这将生成启动配置并下载游戏运行所需的所有资源。
自定义Mod信息
用自定义Mod的构建方式去编辑build.gradle文件。
重要:
不要编辑build.gradle文件buildscript{}部分,它的默认配置是ForgeGradle运行所必需的。
所有的配置都在//下面进行编辑修改,许多东西都可以在此进行移除和定制。
简单的自定义build.gradle配置
强烈建议所有的项目使用这些自定义项:
- 更改生成文件的名称,编辑archivesBaseName的值
- 更改项目包名,编辑group的值
- 更改版本号,编辑version的值
- 要更改运行配置需要将所有的examplemod替换自己的ModId
迁移官方映射到Mojang’s
Forge在未来会使用Mojang’s的官方映射或者MojMaps。官方映射中提供 类、方法、和字段名称。此映射集不提供参数和JavaDocs。目前无法保证这些映射是安全的,但是Forge已决定使用。
构建和测试Mod
- 构建Mod,运行Gradlew中的build。这将在build/libs中输出一个名为[archivesBaseName]-[version].jar的文件。这个文件可以放到Forge的Minecraft中的mods文件中。
- 测试Mod,运行Gradle中的runClient。这将从位置启动我的世界,以及运行配置中指定的Mod代码。默认的MDK包括主源代码集,因此应在src/main/java中编写代码。
- 可以在服务器运行配置或者通过Gradlew中运行runServer运行专用服务器。这将启动带有GUI的Mincraft服务器。第一次运行后,服务器将立即关闭,直到修改run/eula.txt接受minecraft EULA.一旦接受,服务器将加载并通过直接链接到localhost进行访问。?
如果Mod在专用服务器环境中运行,最好是在专用服务器上进行测试。
构建Mod
Mod是由那些文件组成,这些文件是做什么的?让我们来了解一下。
包(Packaging)
选择一个唯一的包名称。如果你有相关的域名,也可以作为其顶级包。例如,如果你拥有"example.com"域名,则可以使用con.example作为顶级包。
如果没有域名,请不要将其作为顶级包。你可以使用你的电子邮件、名字、用户名,只要他在你的项目里面是唯一。
在拥有顶级包之后,你会为你的Mod附加一个唯一的名称,比如examplemod。在这个例子中,它将以com.example.examplemod结束。(我这边的设置为com.zw.yaotu)
mods.toml
mods.toml中的license字段是必须的。如果未提提供或删除,则会发送错误。license字段是Mod的许可证,是必须的。具体参数也可以查看如下网址:https://choosealicense.com/
这个文件定义了Mod的初始数据,用户可以通过在游戏主屏幕的"Mods"按钮查看其Mod信息。多个Mod库由一个文件来进行描述。
mods.toml文件的格式为toml,MDK中的示例文件提供了相关注释。它应该被存在src/main/resources/META-INFO/mods.toml中。一个基本的mods.toml。描述了一个mod,例如:
# 加载程序类型名称,对于常规FML它应该为"javafml"
modLoader="javafml"
# 与所述mod加载程序匹配的版本范围,对于常规FML它就是Forge对于的版本
# Forge1.18对应版本38以上
loaderVersion="[38,)"
# Mod许可证,这是必须的并且更容易理解你分配的属性。我在这里用的 MIT
# 相关选项可以去这个网址查看("https://choosealicense.com/")
license="All Rights Reserved"
# Mod运行出错时,提供解决方案的网址
issueTrackerURL="github.com/MinecraftForge/MinecraftForge/issues"
# 该字段定义是否显示为独立资源包
showAsResourcePack=false
# Mod定义
[[mods]]
modId="examplemod"
version="${file.jarVersion}"
displayName="Example Mod"
updateJSONURL="minecraftforge.net/versions.json"
displayURL="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.
'''
# 依赖Mod
[[dependencies.examplemod]]
modId="forge"
mandatory=true
versionRange="[38,)"
ordering="NONE"
side="BOTH"
[[dependencies.examplemod]]
modId="minecraft"
mandatory=true
versionRange="[1.18,1.19)"
ordering="NONE"
side="BOTH"
如果以下任意字符=“ f i l e . j a r V e r s i o n " (例如: v e r s i o n = " {file.jarVersion}"(例如:version=" file.jarVersion"(例如:version="{file.jarVersion}”),在Forge运行是会用jar配置中的指定版本替换掉该字符串。由于用户开发环境没有可从中提取的jar配置,因此这个字符会被改为NONE。因此,通常建议不要使用这个进行版本控制。这里只是一个建议。因为缺少属性会导致错误。
属性(Property) | 类型(Type) | 默认值(Default) | 描述(Description) |
---|---|---|---|
modid | string | mandatory | ModId为文件的唯一标识,用于关联到此处 |
version | string | mandatory | mod的版本。最好符合Forge的结构。 |
displayName | string | mandatory | Mod的名称 |
updateJSONURL | string | “” | JSON版本的地址 |
displayURL | string | “” | Mod主页链接 |
logoFile | string | “” | Mod的Logn文件 |
credits | string | “” | Mod的感谢语录 |
authors | string | “” | Mod的作者 |
description | string | mandatory | Mod的描述 |
dependencies | [list] | [] | ModId为文件的唯一标识,用于关联到此处 |
*所有版本范围都使用Maven的版本范围规范。
Mod文件
通常,我们会使用一个你自己命名的Mod文件开始,并放到你自己的包中。这个是你Mod的入口,并且需要一些特殊的注解来进行标记。
什么是 @Mod 注解
@Mod是一个注解,用于标识一个Mod的入口。并且它的值应当和src/main/resources/META-INF/mods.toml文件中的NodId匹配。
子包
在项目中,你可以按照各个功能建立不同的子包,用于代码的整洁性。
类命名方案
学习过Java的同学会了解基本的命名规则,驼峰命名法等。这个按照自己习惯就好。比如包的命名为全小写。类的命名是首字母大写,后面为驼峰命名法等。按照自己的习惯就好。
版本控制
在平常的项目中,经常使用版本控制(格式为 大版本.小版本.序号)
大版本:Mod方法变化,数据结构变化等
小版本:Mod的添加方块、物品等
序号:Mod的Bug修复等