diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 6c808a0..442976d 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -24,7 +24,8 @@ module.exports = { children: [ '/preparing/java', '/preparing/mdk', - '/preparing/gradle-ide', + '/preparing/ide', + '/preparing/gradle', '/preparing/mcp', '/preparing/forge', '/preparing/fg', diff --git a/docs/preparing/README.md b/docs/preparing/README.md index d2e7699..3d23791 100644 --- a/docs/preparing/README.md +++ b/docs/preparing/README.md @@ -7,7 +7,8 @@ - [Java](./java.html) - [MDK](./mdk.html) -- [IDE](./gradle-ide.html) +- [Gradle](./gradle.html) +- [IDE](./ide.html) ::: tip 如果你网络不好,你可以在[这里下载](https://jihuayu-my.sharepoint.com/:f:/g/personal/admin_jihuayu_site/EmU2Ep-SW3NOiG4RNjajdDMBLHyvdd3ZHvRde-Eadi0E1w)上述的东西。 diff --git a/docs/preparing/fg.md b/docs/preparing/fg.md index d253a63..f277971 100644 --- a/docs/preparing/fg.md +++ b/docs/preparing/fg.md @@ -1,44 +1,96 @@ # ForgeGradle -::: danger -此页面已经过时,需要修改。 -::: - -ForgeGradle 是 Forge 开发团队推出的 Gradle 插件,主要用途就是简化基于 MCP+Forge 的 Minecraft Mod 开发的流程。 +ForgeGradle 是 Forge 开发团队推出的 [Gradle](gradle.md) 插件,主要用途就是简化基于 MCP 和 Forge 的 Minecraft Mod 开发的流程。 ## 为什么? -思考一下 Mod 开发和发布的流程。通常的情况下,玩家面对的 Minecraft 使用的是混淆名,但是开发者在开发 Mod 时不太可能硬啃混淆名,而是使用某种形式的反混淆名(比如 MCP)。这样一来,当开发者编译 Mod 时,编译器是基于反混淆后的代码,而非玩家实际上使用的混淆代码进行编译的。如此一来,如果不先把 Mod 所引用的 Minecraft 底层代码混淆回去,Mod 是肯定无法运行的。同样的,为了方便开发 Mod,首先你要对 Minecraft 进行反混淆。 - -再往后退一步思考:开发 Minecraft 的 Mod 首先需要 Minecraft 它本身。别忘了 Minecraft 是一个商业软件,你不可能直接从 Maven Central、JCenter、Sonatype 之类的地方下载到它。能下载到它的地方只有 Mojang 自己的服务器。 +思考一下 Mod 开发和发布的流程: -此外,在开发环境运行 Minecraft 还需要下载它所有的 assets,同时还要提供正确的启动参数,基本上等同于写一个 Minecraft 的启动器(除了启动的入口是 IDE 的 Run/Debug 以及两个 Gradle Task,下文会详细说明)。 + - 首先我们要下载 Minecraft 本体。 + - 然后我们要下载 Minecraft 的所有依赖项。 + - 接着我们要反编译并反混淆,这样我们才能读懂 Minecraft 底层。 + - 这个时候我们才能开始写代码。 + - 到了发布 Mod 的时候,在编译好 Mod 的基础上我们还要[重混淆](mcp.md#重混淆(re-obfuscation,reobf))。 -显然,这些 Mod 开发必须经过的流程是可以自动化的。 +显然,我们可以并且应该让 Gradle 帮我们搞定这些。ForgeGradle 应运而生。 ## ForgeGradle 能干什么? - - 部署开发环境(下载 Minecraft、反编译及反混淆 Minecraft、下载 assets),有三种: - - 基本上所有 Mod 开发者在平时开发 Mod 时都会使用的带反编译出的源码的开发环境(`setupDecompWorkspace` task) - - 持续集成服务器(CI)经常使用的用于自动构建 Mod 的环境(`setupCIWorkspace` task) - - 不太常用的仅有反混淆后的 Minecraft 的开发环境(`setupDevWorkspace` task) - - 依赖处理 - - 用于反混淆依赖项目的 scope(`deobfCompile` 和 `deobfProvided`),在开发跨 Mod 兼容或扩展 Mod 时经常用到 + - 部署开发环境 + - 下载、反编译及反混淆 Minecraft + - 下载 assets(音效和语言文件等) + - 反混淆和重混淆 + - Mod 构建时会自动过一遍重混淆 + - 对于依赖项目,可用 `fg.deobf` - IDE 相关 - - 自动生成 IntelliJ IDEA 的 Run/Debug Configuration(`genIntellijRuns` task) - - 连带当前项目一起运行 Minecraft(不常用): + - 自动生成 Run/Debug Configuration,目前支持 Eclipse、IntelliJ IDEA 和 VSCode。 + - 连带当前项目一起运行 Minecraft: - 运行服务器(`runServer` task) - 运行客户端(`runClient` task) - - 在执行 Gradle Java 插件的 `build` task 时可自动完成对源码的重混淆 + - 运行数据生成器(`runData` task) ## 面向用户的配置 -ForgeGradle 需要配置的东西并不多,最常用的选项都可以在 `build.gradle` 的 `minecraft` block 中找到: +ForgeGradle 最常用的选项都可以在 `build.gradle` 的 `minecraft` block 中找到: ```groovy minecraft { - mappings channel: 'snapshot', version: '20190719-1.14.3' + // 在这里指定映射表版本。 + // 关于 MCP 版本号的说明可在 MCP 一节中找到。 + mappings channel: 'snapshot', version: '20200225-1.15.1' + + // 在这里可以修改运行 Minecraft 时的配置。 + runs { + // 客户端配置 + client { + // 指定 Minecraft 根目录(即俗称 .minecraft 的那个目录)的位置 + workingDirectory project.file('run') + + // 调试日志相关,下同。 + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + property 'forge.logging.console.level', 'info' + + // 指定 Minecraft 的启动参数。下面这个参数可以用来修改玩家名称 + args '--username=Foo' + + // 这一串是让游戏识别到你写的代码的,不用管它。下同。 + mods { + examplemod { + source sourceSets.main + } + } + } + + // 服务器配置 + server { + // 指定服务器根目录的位置 + workingDirectory project.file('run') + + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + property 'forge.logging.console.level', 'info' + + mods { + examplemod { + source sourceSets.main + } + } + } + + // 数据生成器配置 + data { + workingDirectory project.file('run') + property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP' + property 'forge.logging.console.level', 'info' + + // 记得把 your_mod_id 换成你的 Mod id。 + args '--mod', 'your_mod_id', '--all', '--output', file('src/generated/resources/') + + mods { + examplemod { + source sourceSets.main + } + } + } + } } ``` - -- `mappings` 代表 MCP 版本号。关于 MCP 版本号的说明[请参阅 MCP 一节](mcp.md#)。 diff --git a/docs/preparing/forge.md b/docs/preparing/forge.md index 6ed91f6..8dfb284 100644 --- a/docs/preparing/forge.md +++ b/docs/preparing/forge.md @@ -1,17 +1,17 @@ # Forge -有了 MCP 后,开发 Minecraft 的 Mod 就变得简单了许多,因为我们现在知道那些被“加密”(混淆)的底层代码都是什么东西了。但 Forge 是什么? +Forge 是个 Mod 开发框架,包含了这么几个部分: -## 历史 + 1. Forge Mod Loader (FML),用于识别并加载 Mod。 + 2. Forge,主要有两部分: + - 修改原版底层暴露出的 API。 + - 一些和 Minecraft 底层关系不是特别大的小系统,比如 Capability。 -一个非常常见的说法是“Forge 是个 API”。 -实际上这个说法并不十分严谨。多数时候,API 只包括公开的接口与方法,不包括它们的底层实现。在一个基于 Minecraft 和 Forge 的开发环境中,我们可以随意访问 Minecraft 的底层,如此看来 Forge 似乎不只是纯粹的 API。 +## 为什么我们要用 Forge? -实际上也的确如此,今天的 Forge 是由两个项目合并而成的,一个叫 MinecraftForge,另一个叫 Forge Mod Loader(简称 FML)。 -先说 FML。顾名思义,FML 是一个“Mod 加载器”。它介入了 Minecraft 的底层,能让你在 Minecraft 中一口气装一大堆 Mod,在你的电脑撑不住前想装多少装多少。 -MinecraftForge 的组成则有些复杂。它实际上包含了两部分: - - 1. 对 Minecraft 底层的修改及因此暴露出的公开方法。当有多个 Mod 因为同时修改 Minecraft 的某一个部分而互相冲突时,Forge 可以介入 Minecraft 的底层来提供一套令这些 Mod 不再冲突的解决方案。 - 2. 一些相对来说独立于 Minecraft 之外的系统。这些系统看起来和 Minecraft 之间没有多少耦合,但能极大改善 Mod 之间的兼容性,代表系统有流体、事件总线和矿物词典。这些小系统比其他 Forge 的组成部分更接近真正的 API。 - -因此,Forge 更像是一套完整的工具包(toolkit),或者说框架(framework)。在它的基础上开发 Mod 可以加快开发速度,同时能自动获得对其他 Mod 的良好兼容。也因此,在 Forge 这个大框架下,Mod 之间已经没有多少真正意义上的兼容性问题了,多数时候我们所说“兼容”问题是指跨 Mod 的交互不符合用户的预期,或者 Mod 在更新版本时引入的二进制不兼容更新。前者需要 Mod 开发者之间的协调,而后者则是软件开发中依赖地狱的一个简化版本。 + 1. 在 Forge 的基础上开发 Mod 可以加快你的开发速度。 + 你可以直接使用 Forge 已经造好的轮子,这样你就不用花时间再自己造一遍了。 + 2. 使用 Forge 可以保证你的 Mod 的和其他人的 Mod 的基本兼容。 + 很久很久以前的 Minecraft Mod(具体来说是 beta 时代甚至更早)是直接拖进 `minecraft.jar` 本体中安装的。在那时,同时装两个甚至更多 Mod 是件难事。 + 专门的 Mod 加载器的出现改变了这个现状。Mod 加载器提供了一套标准化的和 Minecraft 打交道的方式,从而允许两个甚至更多 Mod 同时对同一个地方进行修改(比如注册方块)。 + 在那个时候有各种各样的 Mod 加载器,但最终只有 Forge 和 FML 活了下来,最后这俩还合并了。 diff --git a/docs/preparing/gradle-ide.md b/docs/preparing/gradle-ide.md deleted file mode 100644 index 6b7a339..0000000 --- a/docs/preparing/gradle-ide.md +++ /dev/null @@ -1,32 +0,0 @@ -# Gradle & IDE - -> Gradle 是一个构建工具。它可以帮你搞定构建 Java 项目中遇到的各种问题。 -> 当然,你也可以再来一个 IDE。 - -## Gradle - -你不需要知道 Gradle 是啥,你只需要知道你需要用到它就行了。 - -## IDE - -你可以使用 {{ide[0]}}、{{ide[1]}} 或 {{ide[2]}} 来开发模组。 - -::: warning -虽然 IDE 不是必须,但是我们建议你选择 IntelliJ IDEA 或者 Eclipse 作为你的IDE,它可以帮助你很多。 -::: - - - diff --git a/docs/preparing/gradle.md b/docs/preparing/gradle.md new file mode 100644 index 0000000..abb671d --- /dev/null +++ b/docs/preparing/gradle.md @@ -0,0 +1,25 @@ +# Gradle + +> Gradle helps teams build, automate and deliver better software, faster. +> (Gradle 帮助开发团队更快地构建、自动化并发布更好的软件。) +> \- https://gradle.org + +Gradle 是一个构建工具(Build Tool)。它可以帮你搞定构建 Java 项目中遇到的各种问题。 + +## 我为什么需要 Gradle? + +开发一个 Mod 需要做的事情并不只是编译 Java 源码那么简单。你前前后后需要做的事情大概有: + + - 下载所有的依赖项 + - 编译然后打包,中间需要[重混淆](mcp.md) + - 启动游戏进行调试 + - 签名 + - 自动上传发布 + - …… + +Gradle 的用途就是让这些工作可以一行命令就能完成,你就不用再手动操作了。 + +## 从哪下载 Gradle? + +Forge 的 [MDK](mdk.md) 中自带了 Gradle Wrapper,它可以自动在第一次运行时下载 Gradle。 + diff --git a/docs/preparing/ide.md b/docs/preparing/ide.md new file mode 100644 index 0000000..d293c47 --- /dev/null +++ b/docs/preparing/ide.md @@ -0,0 +1,39 @@ +# IDE + +集成开发环境(Integrated Development Environment,IDE)是一种特殊的软件,它通常包含了你在开发程序时可能会用到的任何东西,比如: + + - 依赖管理 + - 代码高亮 + - 代码补全 + - 代码生成 + - 自动排版 + - 静态分析 + - 构建 + - 运行与调试 + - 对各种工具(Git、Gradle 等)的兼容 + - …… + +简单来说就是一站式服务。 + +## 我选什么 IDE 好? + +你可以使用 {{ide[0]}}、{{ide[1]}} 或 {{ide[2]}} 来开发模组。 + +::: warning +虽然 IDE 不是必须,但是我们建议你选择 IntelliJ IDEA 或者 Eclipse 作为你的IDE,它可以帮助你很多。 +::: + + \ No newline at end of file diff --git a/docs/preparing/mdk.md b/docs/preparing/mdk.md index 06372e6..f5d0b24 100644 --- a/docs/preparing/mdk.md +++ b/docs/preparing/mdk.md @@ -1,11 +1,13 @@ # MDK -> MDK 是 Mod Development Kit 的简称,它用于搭建 forge mod 的开发环境。 +Mod Development Kit(Mod 开发套件)简称 MDK,你只要用它就可以简单搭建 Forge mod 的开发环境。 ## 下载 -打开 [forge 的官网](https://files.minecraftforge.net/),选择你需要的版本,点击下载 MDK。 - + 1. 打开 [Forge 的下载页](https://files.minecraftforge.net/) + 2. 此时你应该能看到“Downloads for Minecraft Forge”。 + 3. 你有两个选择:左边的 Latest 和右边的 Recommended。 + 4. 选一个你想用的版本,然后点 Mdk 按钮即可。你可能需要等五秒跳过广告。 ::: tip Recommended:推荐版。