Skip to content
This repository has been archived by the owner on Jun 1, 2022. It is now read-only.

feat(preparing): gradle, ide, forge, fg and mdk rewrite #19

Merged
merged 5 commits into from
Mar 30, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion docs/.vuepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ module.exports = {
children: [
'/preparing/java',
'/preparing/mdk',
'/preparing/gradle-ide',
'/preparing/ide',
'/preparing/gradle',
'/preparing/mcp',
'/preparing/forge',
'/preparing/fg',
Expand Down
3 changes: 2 additions & 1 deletion docs/preparing/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)上述的东西。
Expand Down
98 changes: 75 additions & 23 deletions docs/preparing/fg.md
Original file line number Diff line number Diff line change
@@ -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#)。
24 changes: 12 additions & 12 deletions docs/preparing/forge.md
Original file line number Diff line number Diff line change
@@ -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 活了下来,最后这俩还合并了。
32 changes: 0 additions & 32 deletions docs/preparing/gradle-ide.md

This file was deleted.

25 changes: 25 additions & 0 deletions docs/preparing/gradle.md
Original file line number Diff line number Diff line change
@@ -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。

39 changes: 39 additions & 0 deletions docs/preparing/ide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# IDE

集成开发环境(Integrated Development Environment,IDE)是一种特殊的软件,它通常包含了你在开发程序时可能会用到的任何东西,比如:

- 依赖管理
- 代码高亮
- 代码补全
- 代码生成
- 自动排版
- 静态分析
- 构建
- 运行与调试
- 对各种工具(Git、Gradle 等)的兼容
- ……

简单来说就是一站式服务。

## 我选什么 IDE 好?

你可以使用 {{ide[0]}}、{{ide[1]}} 或 {{ide[2]}} 来开发模组。

::: warning
虽然 IDE 不是必须,但是我们建议你选择 IntelliJ IDEA 或者 Eclipse 作为你的IDE,它可以帮助你很多。
SeraphJACK marked this conversation as resolved.
Show resolved Hide resolved
:::

<script>
export default {
data() {
return {
ide: ["Eclipse","IntelliJ IDEA","VSCode"]
}
},
mounted () {
this.ide.sort(function() {
return .5 - Math.random();
});
}
}
</script>
8 changes: 5 additions & 3 deletions docs/preparing/mdk.md
Original file line number Diff line number Diff line change
@@ -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:推荐版。
Expand Down