用户:MashKJo/1.12.2模组开发教程/1.构建开发环境

MashKJo留言 | 贡献2024年12月2日 (一) 19:56的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)

这一步,可以说是最难的一步。

不要以为笔者在开玩笑,实际上很多潜在的Modder都被这一步拦住了。

构建步骤

首先访问Forge官网:https://files.minecraftforge.net

然后选择版本,找到1.12.2,选择2859这个版本的“Mdk”一栏下载。注意如果你网不好,直接点击下载是不行的,因为这一步中插入了广告,在国内互联网环境下访问很不畅(丝滑顺畅)。因此你得先耐心等待Forge官网加载完全,然后点击“Mdk”后加载出的一个小按钮图标,即可开始下载。

下载完之后解压,然后打开命令行,切换到你解压出的这个文件夹中,依据你使用的IDE的不同,有如下三条构建命令可以选择:

gradlew genIntellijRuns
gradlew genEclipseRuns
gradlew genVSCodeRuns

以上是Windows系统的写法,对于Mac或Linux,在最前面加上./即可。

什么?你说你不用IDE而是用文本编辑器写模组?差不多得了。虽说网上有“用记事本写代码很高端,一看就是大佬”的风气,但是具体到写MC模组这件事上,没有IDE还真不行,因为你需要时刻查阅Referenced Libraries中的代码,而且,你也不希望写几行代码就手动import某个类吧(笑)。

然后你要做的就是耐心等待了,直到出现BUILD SUCCESSFUL的绿色字样。

残酷的事实

但是,到如今,上面的那段话,基本等同于没有价值的废话。

为什么?因为现在如果你在国内网络环境中,就按照上面的步骤来构建开发环境,99.9%会失败。

原因大致有如下几条:

  1. Forge使用Gradle来管理开发项目,且下载源默认为Gradle官网。但是在国内网络环境下,从这个源下载Gradle可以说是一定会超时。
  2. Forge自己的服务器经常会抽风。
  3. 1.12.2在如今(2024年)已经算是很陈旧的版本了,而Forge官方恰好又对“提供对旧版本MC的Forge的开发环境的支持”这种事很抵触(点名批评LexManos)。

所以,现在要构建1.12.2的环境,常见的方法是:使用镜像下载源,或使用构建好的离线包。

使用镜像下载源,需要更改gradle-wrapper.propertiesbuild.gradle中的链接。其中,build.gradle文件中,应该有这样一个部分:

buildscript {
    repositories {
        maven { url = 'https://maven.minecraftforge.net/' }
        mavenCentral()
    }
    dependencies {
        classpath 'net.minecraftforge.gradle:ForgeGradle:3.+'
    }
}

把其中的链接替换成你要用的镜像源链接即可。

但笔者建议直接下载构建好的离线包,当然下载完之后还是要在命令行中输入一下相关的构建命令。


修改build.gradle和Mod元数据

如果你没有什么特殊需求的话,那么,对于build.gradle,你只需要修改以下的地方:

version = '1.0'
group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = 'modid'
jar {
    manifest {
        attributes([
            "Specification-Title": "examplemod",
            "Specification-Vendor": "examplemodsareus",
            "Specification-Version": "1", // We are version 1 of ourselves
            "Implementation-Title": project.name,
            "Implementation-Version": "${version}",
            "Implementation-Vendor" :"examplemodsareus",
            "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
        ])
    }
}

根据你的项目包名和模组的modid修改即可。

另外在文件末尾再加上这些,这是为了保证resources文件夹中的内容被读取:

sourceSets
{ 
    main 
    { 
        output.resourcesDir = output.classesDir 
    } 
}

另外,在路径src/main/resources下,你应该会找到mcmod.infopack.mcmeta这两个文件。其中,mcmod.info是这样的:

[
{
  "modid": "examplemod",
  "name": "Example Mod",
  "description": "Example placeholder mod.",
  "version": "${version}",
  "mcversion": "${mcversion}",
  "url": "",
  "updateUrl": "",
  "authorList": ["ExampleDude"],
  "credits": "The Forge and FML guys, for making this example",
  "logoFile": "",
  "screenshots": [],
  "dependencies": []
}
]

按需修改即可。

至于pack.mcmeta,这个文件是用于资源包的,显然每个Forge模组都相当于一个资源包,这里要注意的是pack_format必须为3。如果你不小心删除了这个文件,启动游戏测试时,虽然这个文件会自动生成,但pack_format会莫名其妙的变成2,如果发现了这个情况,要手动改成3。至于为什么?去Minecraft Wiki的相关条目可以找到答案,这属于原版的知识了。

测试与发布Mod

运行客户端Minecraft:

gradlew runClient

运行服务端Minecraft:

gradlew runServer

另外,运行这两个命令时,会尝试连接Forge的服务器,如果这个时候Forge服务器正好抽风了,那就会BUILD FAILED,那么,你可以选择加上参数--offline,以离线运行游戏。

发布Mod:

gradlew build

然后你就可以在路径build/libs下看到一个.jar文件,这就是构建好的Mod了。

在IDE中执行Gradle Task

上述Gradle Task都是ForgeGradle这一Gradle插件提供的。实际上,你不需要非要在命令行中执行这些task,上述的三种IDE:IDEA、Eclipse和VSCode都有Gradle支持插件,因此理论上如果你使用这三种IDE之一,是可以直接在IDE中执行task的。但实际上VSCode似乎还需要经过手动的配置才可以使用此项功能。