[MD]
第一部分:你应该知道的
====================
我实话说,很多人并不知道一些计算机的基本常识。如果你可以打开[MineBBS](https://www.minebbs.com/),并且看到了这篇文章,那么我相信,你有能力看懂这篇文章,成为一个出色的Minecraft玩家(冒险家)。
这篇文章也许相当的长,但我希望我可以尽自己最大的能力,用大白话,讲述Minecraft,并且讲明白。
在此之前,我需要声明一些东西,以防你不知道。(排名不分先后)
| 网站 | 描述 |
| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| [Minecraft](https://minecraft.net/) | Minecraft官网。 |
| [Minecraft Wiki](https://zh.minecraft.wiki/) | Minecraft Wiki是一个公开的、可编辑的网站,旨在收集一切有关Minecraft的实用信息。[^1] |
| [Minecraft Wiki(文言)](https://lzh.minecraft.wiki/) | 礦藝大典。 |
| [Minecraft Forge]((https://files.minecraftforge.net/net/minecraftforge/forge/)) | 非官方的,著名的Minecraft加载器 |
| [Minecraft Fabric](https://fabricmc.net/) | 高版本的,轻量且模块化设计的Minecraft加载器。 |
| [Minecraft Quilt](https://quiltmc.org/) | 还在开发中,小有成就的Minecraft加载器。 |
| [Minecraft NeoForged](https://neoforged.net/) | 也许是Forge的后继。高版本的Minecraft加载。 |
| [Minecraft LiteLoader](http://www.liteloader.com/) | 轻量且简单的低版本Minecraft加载器。 |
| [Minecraft Forum](https://www.minecraftforum.net/) | 属于全体Minecraft玩家的论坛。 |
| [我的世界官网](https://mc.163.com/) | 网易代理的中国版我的世界。 |
| [Optifine](https://optifine.net) | Minecraft光影加载器(非必要不建议)。 |
至于剩下的东西,你应该可以在MineBBS的友情链接中找到。
以上讲述的均是基于原版客户端、或者Minecraft本身的东西。接下来我们可以讲述一下第三方的Minecraft客户端。实际上大多数第三方客户端都需要正版账户。(排名不分先后)
| 网站 | 描述 |
| ------------------------------------------------------ | --------------------------------------- |
| [Moonsworth LunarClient](https://www.lunarclient.com/) | 一个现代Minecraft应该具有的魔改。[^2] |
| [BadLion Client](https://www.badlion.net/) | 最棒的玩家应该具有的超级客户端。 |
| [LabyMod Client](https://www.labymod.net/) | 让你的Minecraft体验和其本身都变得牛逼。 |
出色的Minecraft服务端![^3]
| 网站 | 描述 |
| --------------------------------------------------------------------- | ------------------------ |
| [Minecraft Server](https://www.minecraft.net/zh-hans/download/server) | 官方的Minecraft服务端。 |
| [Minecraft Versions](https://mcversions.net/) | 唯一真神。 |
| [Minecraft Spigot](https://getbukkit.org/) | 插件服务端。 |
| [Minecraft Paper](https://papermc.io/) | 生电佬唾弃的插件服务端。 |
实际上还有很多很厉害的Minecraft服务端,请你们自己寻找吧!我并不是服主,只说一些最常见的。
这篇文档以Minecraft客户端为主,如果你是服主,也可以继续看下去,增长一些知识又何乐而不为呢?
## 文件格式
接下来我们可能会遇到一些奇葩的文件格式,不用怕,待我为你逐一讲解。
- `JSON`:一种配置文件。
- `TOML` :一种配置文件。
- `YAML` :一种配置文件。
- `YML` :一种配置文件。
- `INI` :一种配置文件。
- `JAR` :JAVA打包后的产物罢了。
对吧,很简单的,不用害怕。
细讲述一下压缩包。处理这种文件,需要解压缩软件,比如[7ZIP](https://sparanoid.com/lab/7z/)这种,就很不错嘛。
---
[^1] 摘录自Minecraft Wiki自述。
[^2] 网站第一句话翻译的,以下均是,不再赘述。
[^3] 实际上很多Minecraft加载器也支持加载服务端,不再赘述。
第二部分:Minecraft
==================
## Minecraft本身
Minecraft是由Mojang ~~And Bugs~~ Studio研发出来的高自由度的沙盒类冒险游戏。
在下文,将用`Minecraft`特指Mojang AB[^1]的Minecraft,即常说的Minecraft国际版;将用`我的世界`特指网易代理的国服我的世界。
游戏共分为Java版、BedRock版(基岩版),以及其他奇奇怪怪的版本,文章将在后续讲解。
---
[^1] Mojang Studio旧称。
## 基岩版和Java版
### Java版
Java版可以说是最常见的MC版本了。基本各大主播游玩的又是Java版,很多服务器也是Java版服务器,例如`Hypixel`
Java版~~依靠健壮的JVM~~跨操作系统,不受操作系统约束,大概你家Mac或者ArchLinux上运行的也是这个。
包括上文所说的Minecraft加载器,也指的这个版本。
在社区,电脑版MC通常指代Java版Minecraft。
### 基岩版
要说好,是基岩版,不是急眼版!
实际上,常说的Windows10版,手机版,或者是你家Switch或XBox上运行的,大概率都是这个版本。主打一个跨平台。
在社区,手机版MC通常指代基岩版Minecraft。
### 携带版
已经停止更新,并且由基岩版取代。
大概是你还在用`多玩我的世界盒子`的时候……那是什么时候?好像是2011年到2016年的时候。[^1]
### 教育版
教育版基于基岩版制作,包含了可以在课堂里让Minecraft更易理解和更有效果的特性,具体可以参照Minecraft Wiki[^2],这里不再赘述。
除非是拥有Microsoft365,或者学校,拥有学校或组织账户的,才可购买、下载、使用。
## Microsoft
不得不提微软(Microsoft)的一笔最牛逼的投资。
2014年9月15日,微软花费25亿美元收购风靡全球的Minecraft开发商Mojang Studio。同时Mojang在2014年11月6日加入Xbox游戏工作室(当时为微软工作室)。
Mojang AB作为一个法律实体继续作为全资子公司存在。
2020年5月17日,Mojang宣布更名为Mojang Studios,同时使用了新的徽标及动画。
## Minecraft衍生游戏
这些并不是这本文章要讲述的,但是可以简单提一下。
例如[Minecraft地下城](https://zh.minecraft.wiki/w/Minecraft_Dungeons)。此链接指向地下城Wiki,前方道路相当明亮。
## 正版账户
以往的Mojang账户不复存在,要和Microsoft账户合并。可以在上文中的Minecraft官网中花费¥89购买,也可以等到有活动骨折价入手。
而这你买的,其实是Minecraft Java版正版账户和Windows上的基岩版,至于Google Play和App Store上的还要单独购买。
当然,下文启动器有可以让大家白嫖的方法。
---
[^1] 根据Minecraft Wiki记载。
[^2] <https://zh.minecraft.wiki/w/教育版#特性>
第三部分:Java
=============
这一部分,如果你不是专业玩家,或者计算机底层爱好者,可能会面临看不懂、看困了情况。不要慌张,针对这种情况,你可以选择跳过,或者晚上看就地睡着。此片段拥有最强催眠能力。
## Java About
我们不提它的历史,只要记住它的作者是`詹姆斯·高斯林`就好了。
Java是一个及其抽象的编程语言,它创造了`JVM`并且野心蓬勃,想让一切程序都跑在`JVM`之上。这固然是不可能的。
## Java Native Interface
在讲述一切之前,应该讲述一下`JNI`,也就是本片段题目,`Java本地接口`。实际上,从编程语言角度来讲,任何编程语言都需要运行时。
哪怕是最基础的C语言。例如`Linux`下,C语言的运行时应该是`GNU LibC`(一般情况下),`Windows`下,C/C++的运行时应该是`Microsoft Visual C++`。这些东西大概率是由汇编写的[^1]
Java的运行时有两个,一个是`rt.jar`,一个是`JNI Library`[^2]。
`JNI`本质上就干了一件事:将本地库加载到`JVM`之中。这样做,直接分离了`JVM环境`和本地环境,可以让Java程序员关心Java应用本身,而不是复杂的和操作系统打交道,或者是不同地方定义的不同API。
## Java Virtual Machine
讲述完了`JNI`,接下来需要讲述一下`JVM`,也就是本片段题目,`Java虚拟机`。
此虚拟机和`Virtual Box`这种虚拟机不同。`JVM`模拟了一个程序应该有的环境,后者则是模拟了整个计算机应该有的环境。两者目的截然不同。
事实上,你写的所有Java程序,除非是JNI的本地库,那么它都应该运行在`JVM`上。也包括上文讲述的所有Minecraft加载器,也包括Minecraft Java版本身。
## Java Application
### Class
在此之前,我要介绍一个专有名词——Class,直译名:类。
Java万物都要写在Class文件里,然后再编译成Java类文件,再由JVM处理。
---
接下来,我们可以讲一些催眠内容。例如Java程序是如何加载的。
Java是一个著名的`JIT`语言,也就是即时编译。这点东西由JVM完成。事实上,Java程序在运行前,往往需要先将其的一部分或整体编译成机器指令,并交给JVM或者JNI。
严格来讲,Java程序是一个个类文件(Java Class File)。它的加载过程应该是这样的:
1. 由外部环境(开发工具也好,或者是启动器也好)拉起Java进程,并且传递程序参数和主类(Jar包就找META-INF文件),并交给`Java Class Loader`处理。
2. 知道了要加载什么,下一步就是JVM准备好运行时(例如`rt.jar`,当然,实际过程比这个复杂),再逐渐加载。
3. 做完一切的准备工作之后,找到程序主类,运行其主方法。接下来程序要干什么,就由程序本身决定了。写的什么,自然就做些什么。
上述过程是每个JIT程序都要经历的冷启动。相比于AOT不同,AOT程序在开始就能达到顶峰性能。
所以,讲了这么多,也许有人没听明白,不要怕,我再简单整理一下。Java程序分层应该是这样分的
| 所处位置 | Java层 | 干了什么 |
| -------- | ------------ | ------------------------------------------------- |
| 第一层 | Java程序层 | 你写的程序,例如Minecraft |
| 第二层 | Java库层 | Java类库,第三方加载项都在这里 |
| 第三层 | Java虚拟机层 | Java虚拟机所处位置,管理程序 |
| 第四层 | Java本地层 | 上文中讲到的JNI所处位置,上接虚拟机,下接本地环境 |
| 第五次 | 本地环境 | 你的电脑~~你电脑啥b样你自己心里没点b数?~~ |
## 内存回收
当然,JVM作为内存大户,自然是需要回收的。实际上,JVM会找一个很合适的时候进行内存回收。
Java的内存回收函数是`System.gc()`,实际上它只是一个包装,本质上是调用的`Runtime.getRuntime().gc()`,这个东西是一个本地方法,它怎么实现不重要。重要的是,它的确回收了部分内存。
内存回收是一个极其耗时、耗能的一件事,JVM会尽量避免干这件事。尤其是`Full GC`。由于要清扫内存中所有的对象,不免要占用一些时间。你在玩游戏时不时的卡一小下,很有可能就是~~你内存炸了~~JVM正在内存回收。
实际上部分Java参数就是针对内存回收的,例如`-Xms[n]M -Xmx[n]M`就是Java程序合理运用的最大最小内存。内存过小可能会导致频繁回收造成性能下降,内存过大可能会导致内存浪费,所以要合理设置。
具体怎么设置合理呢?一般情况下,整合包作者的设置或启动器本身的设置就是合理的,除非你知道一套参数更合理(或者整合包作者和启动器作者人品都不怎么样,脚填数据),不然就少动它。
## Java反射机制
我们不去讲和游戏无关的,例如`Full GC`,因为这种东西是没有意义的。我们来讲一些有用的,你难道不好奇`Minecraft Forge`是怎么加载Mod的吗?(当然,Forge将在后文讲解)
Java反射机制总结起来就一句话——对Java类增删改查[^3]。例如强制访问`private`字段,监听注解。
举个例子:也许你写过Forge Mod,无论干什么,Mod主类里一定会有`@Mod(modid = example.MODID)`,实际上这段用的就是Java注解。Forge并不知道这些类哪个是Mod主类,那个是不需要加载的类,那个是无关紧要的类。Forge所做的就是把他们全部加载起来,然后利用反射找到带有特定注解的类,并进行处理。
## ASM和Mixin
这两位更是重量级。总结起来一句话:修改Java Class。
反射不能干的活,这俩哥们全能干。实际上ASM是Mixin前置。
也许很多反射就能干的活却用ASM或者Mixin干,这不是小题大做,可能有如下三点原因:
1. ASM(Mixin)干得更利索。Java反射是需要跨层的,从Java程序层跨到Java虚拟机层;而ASM(Mixin)不需要跨层。
2. 写起来更简单。也许Java反射也能做,但是有点杀鸡用牛刀,或者写起来纯折磨,用ASM(Mixin)实现起来很简单,而且可读[^4]。
3. 开发者忘了。
以ASM举例,ASM可以动态修改Class文件,对一个类增量修改,甚至还可以动态生成新的Class(当然是在内存里)。
---
[^1] 严格来讲,部分C++运行时是C写的。大部分现代编程语言的运行时都是C或其它语言写的。
[^2] 它不应该叫这个名字,但是苦于我没搜到它具体叫什么。JDK文档可能有,但我懒得翻了。
[^3] 反射不能修改Java Class本体。
[^4] Java反射的代码很抽象,可读性不是很好。
第四部分:Minecraft启动器
=======================
> 考试重难点
> 好了同学们,困了的醒一醒啊,接下来我们来讲述重点啊!
>
> 年年考年年错,醒一醒了啊!
这一部分要讲的不多,只要介绍一些启动器,并且告诉大家如何避雷就可以了。
至于哪款好……这个问题很难回答,因为这些启动器各有各的特色,你只要挑一款你用着舒服的就可以了。没必要因为什么就换启动器什么的。
| 名字 | 作者 | 描述 |
| ---------------------------------------------------------------- | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| [Minecraft Launcher](https://www.minecraft.net/zh-hans/download) | Microsoft | 官方启动器,可以不用,但最好有一份。 |
| [Hello Minecraft Launcher](https://hmcl.huangyuhui.net/) | [Huang Yuhui](https://github.com/huanghongxun) | 新版本没什么要避雷的,出现问题跟着步骤解决就好,但是一定要听话! |
| PCL II | [龙腾猫跃](https://afdian.com/a/LTCat) | ~~据说评价褒贬不一,不敢评价~~启动器还是相当不错的! |
| [Baka XL](https://www.bakaxl.com/) | [TT702](https://github.com/TT702) | BakaXL 是一个非官方的 Minecraft 启动器,与 Mojang Studios、Microsoft 或他们位于中国大陆的代理公司之间并无任何从属或关联。[^1] |
| [LauncherX](https://www.minebbs.com/resources/launcherx.7182/) | [CoronaStudio](https://www.minebbs.com/members/coronastudio.83949/) | 太好了,是MineBBS站内链接,我们有救了! |
启动器的功能和用法,在他们的官方文档中写的很详细,也很清楚。其实这一个东西,就是Minecraft Java版的核心,直接跳到这里的同志们捡到大便宜了!
当然,我大概会以某一个启动器作为样例,详细讲解,手把手教你。介于我现在用的第三方Markdown编辑器不是很方便使用图片,所以只好往后再说了。
除原版启动器外,第三方启动器都支持离线登录,即绕过正版服务器验证,不过这样会导致无法进入正版服务器。[^2]
---
[^1] 事实上TT702太会宣传了,也的确很有实力。之前被针对过,所以才有这句话。
[^2] 有关正版服务器,请参阅第八部分:`有关游戏的事情`中的“服务器”部分。
第五部分:Minecraft Mod
=====================
接下来又是一个重难点,看不下去的可以直接跳,因为我会讲一些Mod底层的东西。如果你想看`Minecraft Mod`资源,请看第九部分:`合理运用工具`
这里我以Forge为例,详细解释一下Minecraft Mod是如何加载的。
在此之前,我们先介绍一下巨人,因为我们今天所做的一切,都站在了巨人的肩膀上。
## Minecraft源代码
抛开混淆映射表,你直接反编译源代码,得到的应该长这样:(并非Minecraft源代码一部分,仅仅只是一个例子,取自Harbinger)
```java
public class a extends b {
private c c1;
private final d d1;
public a(e par1, f par2) {
this.d1 = g(par1);
this.c1 = h(par2)
}
private d g(e par1) {
return ...;
}
public c h(f par1) {
return ...;
}
}
```
我们当然可以直接改着玩意,但没有人会这么做,因为这玩意基本读不了……
但是总有一些人注意力超群,他们看到这份代码,立马就拍桌子,说:“注意到!函数xxx应该是实现了异常信息。”这句话并不是玩笑——更改了变量名字,却改不了代码逻辑。~~就好似你得到了她的身,却得不到她的心~~如果就这样顺藤摸瓜、趁热打铁,很有可能会做出点什么!
MCP(Mod Coder Pack)就是这样诞生的——很久之前,有一帮先驱者们率先开始了对 Minecraft 这个商业软件的人力反混淆工程。最终的成果便是一套完整的反混淆映射表,通称 MCP Mapping。
它代表了社区贡献者站在局外人的视角上对 Minecraft 底层代码的理解,甚至可以认为映射表是猜出来的。
MCP给出的也只是一套“参考解读”。MCP的解读代表的是Minecraft当前底层的现状。正因为此,MCP的理解有可能与Mojang员工实际想表达的意思有偏差,可能Mojang所使用的名称和MCP使用的名称大相径庭,也有可能MCP给出的名称比Mojang所使用的名称所表达的意思更准确。
> 但这还是逆向工程啊!
> 是的,这是逆向工程,所以 MCP 这样的工程仍然落在一个灰色偏黑的地带中。
> 之所以 MCP 这样的工程能活到现在,还是要拜 Mojang 不表态的态度所赐。
> 毕竟 Mojang 也清楚 User-Generated Content(UGC)是 Minecraft 成功的关键一环。
>
> —— [Harbinger](https://harbinger.covertdragon.team/chapter-01/mcp.html)
实际上Mojang已经发布过[Minecraft官方映射表](https://zh.minecraft.wiki/w/%E6%B7%B7%E6%B7%86%E6%98%A0%E5%B0%84%E8%A1%A8?variant=zh-cn),但介于法律条文,所以MCP和Yarn这样的项目还得存在。
## Forge
> Minecraft Forge
> 因此,Forge 更像是一套完整的工具包(toolkit),或者说框架(framework)。
> 在它的基础上开发 Mod 可以加快开发速度,同时能自动获得对其他 Mod 的良好兼容。
> 也因此,在 Forge 这个大框架下,Mod 之间已经没有多少真正意义上的兼容性问题了,多数时候我们所说“兼容”问题是指跨 Mod 的交互不符合用户的预期,或者 Mod 在更新版本时引入的二进制不兼容更新。
> 前者需要 Mod 开发者之间的协调,而后者则是软件开发中依赖地狱的一个简化版本。
>
> —— [Harbinger](https://harbinger.covertdragon.team/chapter-01/forge.html)
在此之前,我们需要解释Forge本身对Minecraft都做了什么~~Play~~。本片段以`Minecraft Forge 1.12.2`作为样例解释说明。
### 事件总线
Minecraft源代码写的非常差,只有开源的那部分写的还不错。所以本身Minecraft就是一个史山。
想要加载Mod,那么必须要有框架,于是Forge采用了事件系统(Event System)。
无一例外,你能想到的,大概都有一个事件。例如注册物品的事件`RegistryEvent.Register<Item>`.
目前Forge事件总线可以分成两套:`MinecraftForge.Event`和`FML.common`。前者是Minecraft事件,后者是Mod加载过程的生命周期。
### Minecraft本身就是一个加载项
是这样的,Forge对Minecraft的改动非常大。也许你安装了Forge,但是没有安装任何依赖和加载项,却要7个加载过程和四个基本加载项,这是因为Forge要加载Minecraft游戏本身。游戏本身的物品、所有的事件(当然是Forge后改的)、方块……都要被加载进Forge注册表。
### Mod加载的七个周期[^1]
| 周期 | 描述 |
| ---------------------- | ----------------------------------------------------------------------------------- |
| 1. Construct Mod | 扫描mods文件夹中的所有Mod文件并尝试加载它们,并为后续的加载过程做准备 |
| 2. Pre-Initialization | Mod开始向游戏注册其核心内容。主要任务包括:注册方块和物品,注册实体,分配矿物词典。 |
| 3. Initialization | 注册世界生成器,合成配方,事件处理器,并发送IMC(Forge中跨Mod通信)信息 |
| 4. Post-Initialization | 处理Mod之间的依赖关系,完成其他操作。 |
| 5,IMC Event | Mod会处理接收到的IMC信息。IMC允许Mod之间在运行时进行通信。 |
| 6. Server Starting | Mod在这个阶段操作服务端。[^2] |
| 7. Client Starting | 为游戏做最后的准备。例如弹出主界面,注册渲染器、设置模型等。 |
---
[^1] 部分内容参考[Forge文档](https://mcforge-cn.readthedocs.io/zh/latest/conventions/loadstages/)。
[^2] 请参阅第八部分:`有关游戏的事情`中“前后端分离”部分。
第六部分:Minecraft额外加载项
===========================
## Optifine
Optifine是老牌的优化、闭源的第三方加载项,和Forge、LoteLoader兼容。是加载光影的不二之选!
新版本和大型整合包不推荐Optifine,因为有Mod代替它,并且完成得更好。
不推荐它的另一个原因,它是闭源的。也许是因为项目的特殊性,总之不好说。
高版本有`元素周期表`系列,而且本身和Fabric并不兼容。~~Fabric Mod优化比这破玩意好多了。~~
## Forge、Fabric、Quilt、Neoforged、LiteLoader
这些客户端,除了LiteLoader和Forge可以兼容,Neoforged和Fabric未来可能兼容以外,其他全部不互相兼容。~~LiteLoader和Fabric的兼容有待考证,LiteLoader甚至没活到Fabric诞生的版本。~~
没有什么要特别讲述的,1.12.2及以下首推Forge+LiteLoader(也许部分Mod不兼容LiteLoader,按需选择)。
1.13到1.14.4比较特殊,只有Forge苟活下来了,有什么就用什么吧。
1.14.4往后,推荐Fabric,因为剩下那俩还在开发,并不稳定。当然你也可以尝鲜,没什么不好的。
### Quilt
这个项目比较特殊,Quilt似乎是Fabric分叉,并且自己实现了Fabric API(Quilted Fabric API)兼容Fabric Mod,而且有自已一套独特的API。
不是很好说Fabric和Quilt哪个更适合。因为后者我没用过(我真的没用过)。
### NeoForged
这个项目是Forge分支,因为cpw和len闹掰了。目前踊跃地和Fabric合作,期待他俩今后的表现。
### Mod
根据加载器不同,可以分为Fabric Mod,Forge Mod……,这些Mod都可分为客户端Mod和服务端Mod,客户端可以加载服务端Mod,但服务端不能加载客户端Mod。
它的位置是`.minecraft/mods`(如果开启了版本隔离,那应该是`.minecraft/version/[你的版本名称]/mods`)
不同加载器的Mod不能混用,否则后果很严重!会导致Minecraft崩溃(确信)。
## 材质包
这个包包含了模型,文字,语言,甚至声音。不只是原版,Mod也可以替换。
考虑后续写一篇材质包制作教程。虽然站内有很多了……
它的位置是`.minecraft/resourcepacks`(如果开启了版本隔离,那应该是`.minecraft/version/[你的版本名称]/resourcepacks`)
不同版本的包少部分可以混用。
## 光影包
需要Optifine或者Iris Mod才可以加载。
应该是OpenGL代码一系列的,等我学会了写一篇教程。
它的位置因不同的加载器而不同,并不好说。
不同加载器的包除非加载器作者或光影包作者明说以外,当不能混用处理。
## 数据包
这位更是重量级,它其实是官方的加载项,利用Minecraft Function文件,有很多玩法,甚至可以比肩Mod。
当然了,因为是数据包,所以并没有Mod支持的多。不过我还不是很会,写不了教程。
它的位置和存档有关,大概是`.minecraft/saves/[存档名称]/datapacks`(如果开启了版本隔离,那应该是`.minecraft/version/[你的版本名称]/saves/[存档名称]/datapacks`)
不同版本的包不能混用。
## 基岩版行为包
大概和数据包一样,不过比数据包要宽广很多。只是微软不干人事,弄了很多很恶心,而且也不怎么开放的东西出来罢了。
## 基岩版RTX光线追踪
这个和加载项无关,需要在基岩版商店中下载(免费的!)固定的地图,并且显卡还得是RTX系列,支持光追的才可以!
不过部分光影包已经可以媲美光追了,所以这部分并不好说。
## 服务端插件
和Mod不一样,服务端插件只可用于服务器,而且是受插件支持的服务端。
第七部分:Minecraft整合包
========================
很好理解,整合包大概有这些打包方式:`我的世界中文论坛`,`CurseForge`,`Modrinth`, `FTB`。其中FTB格式的整合包就不要想打包了,貌似是FTB Term私有的打包格式。前面三个可以。
这些包直接拖入你的启动器就可以,现代启动器一般都支持这么干。当然也可以跟着启动器的操作一步步进行。
也有直接将minecraft游戏整个目录打包的,少部分启动器支持直接导入,但是请注意版本隔离。
整合包一般会有作者的魔改内容,并不是仅仅只是将Mod放在一起就可以了。
第八部分:有关游戏的事情
======================
## 地图种子
相同版本,相同地图种子下生成的世界是相同的,甚至在Minecraft1.21之中,地图种子都确定了随机事件,也就是同一个地图种子下,固定次数的事件回应是相同的。也就导致RNG操作不复存在。
## 游戏存档
可以分享给你的好大儿。基本是`.minecraft/saves`,如果开版本隔离的话是`.minecraft/version/[你的版本名称]/saves`
## 截图
也就是在游戏中按下F2的截图文件,基本存在了`.minecraft/screenshots`,如果开版本隔离的话是`.minecraft/version/[你的版本名称]/screenshots`.
## 服务器
服务器分为正版服务器和离线服务器,正版服务器只有正版账户才可以进入,而离线只能进离线服务器。正版账户可以进入离线服务器。
## 前后端分离
Minecraft采用前后端分离,也就是客户端和服务端分离的方式,这样设计有一个好处,服务端和客户端可以单独做自己的活,只要发包通讯就好了。
所以才存在了假方块,玩家不卡但是实体卡,单人存档被kick这些离奇操作。
客户端主要负责渲染,服务端主要负责运算。
第九部分:合理运用工具
====================
## CurseForge和Modrinth
这两位更是重量级,是非官方的Minecraft资源站,大部分启动器都支持从这里面直接下载东西。
包括数据包,光影包,材质包,地图和Mod。
## NBT标签编辑器
例如[NBT Explorer](https://zh.minecraft.wiki/w/%E8%BE%85%E5%8A%A9%E7%A8%8B%E5%BA%8F%E4%B8%8E%E7%BC%96%E8%BE%91%E5%99%A8/NBTExplorer?variant=zh-cn)。
## MCP和Yarn
这两位前面介绍过了,用来反编译MC的。
## Minecraft社区
例如你现在看的MineBBS,不再强调,有MC玩家的地方就有MC社区。
第十部分:最后的话
================
如果你能看到这里,大概是已经通篇读下来了,
我检讨,将很多高深的知识都写入了,也许也没有顾及到真的不会用电脑的人。
但还是希望看到这里的你,今后可以一帆风顺,心想事成。希望这篇可以扫除你目前对Minecraft的障碍,今后成为出色的Minecraft玩家。答应我,一定要做到!
[/MD]
第一部分:你应该知道的
====================
我实话说,很多人并不知道一些计算机的基本常识。如果你可以打开[MineBBS](https://www.minebbs.com/),并且看到了这篇文章,那么我相信,你有能力看懂这篇文章,成为一个出色的Minecraft玩家(冒险家)。
这篇文章也许相当的长,但我希望我可以尽自己最大的能力,用大白话,讲述Minecraft,并且讲明白。
在此之前,我需要声明一些东西,以防你不知道。(排名不分先后)
| 网站 | 描述 |
| ------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- |
| [Minecraft](https://minecraft.net/) | Minecraft官网。 |
| [Minecraft Wiki](https://zh.minecraft.wiki/) | Minecraft Wiki是一个公开的、可编辑的网站,旨在收集一切有关Minecraft的实用信息。[^1] |
| [Minecraft Wiki(文言)](https://lzh.minecraft.wiki/) | 礦藝大典。 |
| [Minecraft Forge]((https://files.minecraftforge.net/net/minecraftforge/forge/)) | 非官方的,著名的Minecraft加载器 |
| [Minecraft Fabric](https://fabricmc.net/) | 高版本的,轻量且模块化设计的Minecraft加载器。 |
| [Minecraft Quilt](https://quiltmc.org/) | 还在开发中,小有成就的Minecraft加载器。 |
| [Minecraft NeoForged](https://neoforged.net/) | 也许是Forge的后继。高版本的Minecraft加载。 |
| [Minecraft LiteLoader](http://www.liteloader.com/) | 轻量且简单的低版本Minecraft加载器。 |
| [Minecraft Forum](https://www.minecraftforum.net/) | 属于全体Minecraft玩家的论坛。 |
| [我的世界官网](https://mc.163.com/) | 网易代理的中国版我的世界。 |
| [Optifine](https://optifine.net) | Minecraft光影加载器(非必要不建议)。 |
至于剩下的东西,你应该可以在MineBBS的友情链接中找到。
以上讲述的均是基于原版客户端、或者Minecraft本身的东西。接下来我们可以讲述一下第三方的Minecraft客户端。实际上大多数第三方客户端都需要正版账户。(排名不分先后)
| 网站 | 描述 |
| ------------------------------------------------------ | --------------------------------------- |
| [Moonsworth LunarClient](https://www.lunarclient.com/) | 一个现代Minecraft应该具有的魔改。[^2] |
| [BadLion Client](https://www.badlion.net/) | 最棒的玩家应该具有的超级客户端。 |
| [LabyMod Client](https://www.labymod.net/) | 让你的Minecraft体验和其本身都变得牛逼。 |
出色的Minecraft服务端![^3]
| 网站 | 描述 |
| --------------------------------------------------------------------- | ------------------------ |
| [Minecraft Server](https://www.minecraft.net/zh-hans/download/server) | 官方的Minecraft服务端。 |
| [Minecraft Versions](https://mcversions.net/) | 唯一真神。 |
| [Minecraft Spigot](https://getbukkit.org/) | 插件服务端。 |
| [Minecraft Paper](https://papermc.io/) | 生电佬唾弃的插件服务端。 |
实际上还有很多很厉害的Minecraft服务端,请你们自己寻找吧!我并不是服主,只说一些最常见的。
这篇文档以Minecraft客户端为主,如果你是服主,也可以继续看下去,增长一些知识又何乐而不为呢?
## 文件格式
接下来我们可能会遇到一些奇葩的文件格式,不用怕,待我为你逐一讲解。
- `JSON`:一种配置文件。
- `TOML` :一种配置文件。
- `YAML` :一种配置文件。
- `YML` :一种配置文件。
- `INI` :一种配置文件。
- `JAR` :JAVA打包后的产物罢了。
对吧,很简单的,不用害怕。
细讲述一下压缩包。处理这种文件,需要解压缩软件,比如[7ZIP](https://sparanoid.com/lab/7z/)这种,就很不错嘛。
---
[^1] 摘录自Minecraft Wiki自述。
[^2] 网站第一句话翻译的,以下均是,不再赘述。
[^3] 实际上很多Minecraft加载器也支持加载服务端,不再赘述。
第二部分:Minecraft
==================
## Minecraft本身
Minecraft是由Mojang ~~And Bugs~~ Studio研发出来的高自由度的沙盒类冒险游戏。
在下文,将用`Minecraft`特指Mojang AB[^1]的Minecraft,即常说的Minecraft国际版;将用`我的世界`特指网易代理的国服我的世界。
游戏共分为Java版、BedRock版(基岩版),以及其他奇奇怪怪的版本,文章将在后续讲解。
---
[^1] Mojang Studio旧称。
## 基岩版和Java版
### Java版
Java版可以说是最常见的MC版本了。基本各大主播游玩的又是Java版,很多服务器也是Java版服务器,例如`Hypixel`
Java版~~依靠健壮的JVM~~跨操作系统,不受操作系统约束,大概你家Mac或者ArchLinux上运行的也是这个。
包括上文所说的Minecraft加载器,也指的这个版本。
在社区,电脑版MC通常指代Java版Minecraft。
### 基岩版
要说好,是基岩版,不是急眼版!
实际上,常说的Windows10版,手机版,或者是你家Switch或XBox上运行的,大概率都是这个版本。主打一个跨平台。
在社区,手机版MC通常指代基岩版Minecraft。
### 携带版
已经停止更新,并且由基岩版取代。
大概是你还在用`多玩我的世界盒子`的时候……那是什么时候?好像是2011年到2016年的时候。[^1]
### 教育版
教育版基于基岩版制作,包含了可以在课堂里让Minecraft更易理解和更有效果的特性,具体可以参照Minecraft Wiki[^2],这里不再赘述。
除非是拥有Microsoft365,或者学校,拥有学校或组织账户的,才可购买、下载、使用。
## Microsoft
不得不提微软(Microsoft)的一笔最牛逼的投资。
2014年9月15日,微软花费25亿美元收购风靡全球的Minecraft开发商Mojang Studio。同时Mojang在2014年11月6日加入Xbox游戏工作室(当时为微软工作室)。
Mojang AB作为一个法律实体继续作为全资子公司存在。
2020年5月17日,Mojang宣布更名为Mojang Studios,同时使用了新的徽标及动画。
## Minecraft衍生游戏
这些并不是这本文章要讲述的,但是可以简单提一下。
例如[Minecraft地下城](https://zh.minecraft.wiki/w/Minecraft_Dungeons)。此链接指向地下城Wiki,前方道路相当明亮。
## 正版账户
以往的Mojang账户不复存在,要和Microsoft账户合并。可以在上文中的Minecraft官网中花费¥89购买,也可以等到有活动骨折价入手。
而这你买的,其实是Minecraft Java版正版账户和Windows上的基岩版,至于Google Play和App Store上的还要单独购买。
当然,下文启动器有可以让大家白嫖的方法。
---
[^1] 根据Minecraft Wiki记载。
[^2] <https://zh.minecraft.wiki/w/教育版#特性>
第三部分:Java
=============
这一部分,如果你不是专业玩家,或者计算机底层爱好者,可能会面临看不懂、看困了情况。不要慌张,针对这种情况,你可以选择跳过,或者晚上看就地睡着。此片段拥有最强催眠能力。
## Java About
我们不提它的历史,只要记住它的作者是`詹姆斯·高斯林`就好了。
Java是一个及其抽象的编程语言,它创造了`JVM`并且野心蓬勃,想让一切程序都跑在`JVM`之上。这固然是不可能的。
## Java Native Interface
在讲述一切之前,应该讲述一下`JNI`,也就是本片段题目,`Java本地接口`。实际上,从编程语言角度来讲,任何编程语言都需要运行时。
哪怕是最基础的C语言。例如`Linux`下,C语言的运行时应该是`GNU LibC`(一般情况下),`Windows`下,C/C++的运行时应该是`Microsoft Visual C++`。这些东西大概率是由汇编写的[^1]
Java的运行时有两个,一个是`rt.jar`,一个是`JNI Library`[^2]。
`JNI`本质上就干了一件事:将本地库加载到`JVM`之中。这样做,直接分离了`JVM环境`和本地环境,可以让Java程序员关心Java应用本身,而不是复杂的和操作系统打交道,或者是不同地方定义的不同API。
## Java Virtual Machine
讲述完了`JNI`,接下来需要讲述一下`JVM`,也就是本片段题目,`Java虚拟机`。
此虚拟机和`Virtual Box`这种虚拟机不同。`JVM`模拟了一个程序应该有的环境,后者则是模拟了整个计算机应该有的环境。两者目的截然不同。
事实上,你写的所有Java程序,除非是JNI的本地库,那么它都应该运行在`JVM`上。也包括上文讲述的所有Minecraft加载器,也包括Minecraft Java版本身。
## Java Application
### Class
在此之前,我要介绍一个专有名词——Class,直译名:类。
Java万物都要写在Class文件里,然后再编译成Java类文件,再由JVM处理。
---
接下来,我们可以讲一些催眠内容。例如Java程序是如何加载的。
Java是一个著名的`JIT`语言,也就是即时编译。这点东西由JVM完成。事实上,Java程序在运行前,往往需要先将其的一部分或整体编译成机器指令,并交给JVM或者JNI。
严格来讲,Java程序是一个个类文件(Java Class File)。它的加载过程应该是这样的:
1. 由外部环境(开发工具也好,或者是启动器也好)拉起Java进程,并且传递程序参数和主类(Jar包就找META-INF文件),并交给`Java Class Loader`处理。
2. 知道了要加载什么,下一步就是JVM准备好运行时(例如`rt.jar`,当然,实际过程比这个复杂),再逐渐加载。
3. 做完一切的准备工作之后,找到程序主类,运行其主方法。接下来程序要干什么,就由程序本身决定了。写的什么,自然就做些什么。
上述过程是每个JIT程序都要经历的冷启动。相比于AOT不同,AOT程序在开始就能达到顶峰性能。
所以,讲了这么多,也许有人没听明白,不要怕,我再简单整理一下。Java程序分层应该是这样分的
| 所处位置 | Java层 | 干了什么 |
| -------- | ------------ | ------------------------------------------------- |
| 第一层 | Java程序层 | 你写的程序,例如Minecraft |
| 第二层 | Java库层 | Java类库,第三方加载项都在这里 |
| 第三层 | Java虚拟机层 | Java虚拟机所处位置,管理程序 |
| 第四层 | Java本地层 | 上文中讲到的JNI所处位置,上接虚拟机,下接本地环境 |
| 第五次 | 本地环境 | 你的电脑~~你电脑啥b样你自己心里没点b数?~~ |
## 内存回收
当然,JVM作为内存大户,自然是需要回收的。实际上,JVM会找一个很合适的时候进行内存回收。
Java的内存回收函数是`System.gc()`,实际上它只是一个包装,本质上是调用的`Runtime.getRuntime().gc()`,这个东西是一个本地方法,它怎么实现不重要。重要的是,它的确回收了部分内存。
内存回收是一个极其耗时、耗能的一件事,JVM会尽量避免干这件事。尤其是`Full GC`。由于要清扫内存中所有的对象,不免要占用一些时间。你在玩游戏时不时的卡一小下,很有可能就是~~你内存炸了~~JVM正在内存回收。
实际上部分Java参数就是针对内存回收的,例如`-Xms[n]M -Xmx[n]M`就是Java程序合理运用的最大最小内存。内存过小可能会导致频繁回收造成性能下降,内存过大可能会导致内存浪费,所以要合理设置。
具体怎么设置合理呢?一般情况下,整合包作者的设置或启动器本身的设置就是合理的,除非你知道一套参数更合理(或者整合包作者和启动器作者人品都不怎么样,脚填数据),不然就少动它。
## Java反射机制
我们不去讲和游戏无关的,例如`Full GC`,因为这种东西是没有意义的。我们来讲一些有用的,你难道不好奇`Minecraft Forge`是怎么加载Mod的吗?(当然,Forge将在后文讲解)
Java反射机制总结起来就一句话——对Java类增删改查[^3]。例如强制访问`private`字段,监听注解。
举个例子:也许你写过Forge Mod,无论干什么,Mod主类里一定会有`@Mod(modid = example.MODID)`,实际上这段用的就是Java注解。Forge并不知道这些类哪个是Mod主类,那个是不需要加载的类,那个是无关紧要的类。Forge所做的就是把他们全部加载起来,然后利用反射找到带有特定注解的类,并进行处理。
## ASM和Mixin
这两位更是重量级。总结起来一句话:修改Java Class。
反射不能干的活,这俩哥们全能干。实际上ASM是Mixin前置。
也许很多反射就能干的活却用ASM或者Mixin干,这不是小题大做,可能有如下三点原因:
1. ASM(Mixin)干得更利索。Java反射是需要跨层的,从Java程序层跨到Java虚拟机层;而ASM(Mixin)不需要跨层。
2. 写起来更简单。也许Java反射也能做,但是有点杀鸡用牛刀,或者写起来纯折磨,用ASM(Mixin)实现起来很简单,而且可读[^4]。
3. 开发者忘了。
以ASM举例,ASM可以动态修改Class文件,对一个类增量修改,甚至还可以动态生成新的Class(当然是在内存里)。
---
[^1] 严格来讲,部分C++运行时是C写的。大部分现代编程语言的运行时都是C或其它语言写的。
[^2] 它不应该叫这个名字,但是苦于我没搜到它具体叫什么。JDK文档可能有,但我懒得翻了。
[^3] 反射不能修改Java Class本体。
[^4] Java反射的代码很抽象,可读性不是很好。
第四部分:Minecraft启动器
=======================
> 考试重难点
> 好了同学们,困了的醒一醒啊,接下来我们来讲述重点啊!
>
> 年年考年年错,醒一醒了啊!
这一部分要讲的不多,只要介绍一些启动器,并且告诉大家如何避雷就可以了。
至于哪款好……这个问题很难回答,因为这些启动器各有各的特色,你只要挑一款你用着舒服的就可以了。没必要因为什么就换启动器什么的。
| 名字 | 作者 | 描述 |
| ---------------------------------------------------------------- | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| [Minecraft Launcher](https://www.minecraft.net/zh-hans/download) | Microsoft | 官方启动器,可以不用,但最好有一份。 |
| [Hello Minecraft Launcher](https://hmcl.huangyuhui.net/) | [Huang Yuhui](https://github.com/huanghongxun) | 新版本没什么要避雷的,出现问题跟着步骤解决就好,但是一定要听话! |
| PCL II | [龙腾猫跃](https://afdian.com/a/LTCat) | ~~据说评价褒贬不一,不敢评价~~启动器还是相当不错的! |
| [Baka XL](https://www.bakaxl.com/) | [TT702](https://github.com/TT702) | BakaXL 是一个非官方的 Minecraft 启动器,与 Mojang Studios、Microsoft 或他们位于中国大陆的代理公司之间并无任何从属或关联。[^1] |
| [LauncherX](https://www.minebbs.com/resources/launcherx.7182/) | [CoronaStudio](https://www.minebbs.com/members/coronastudio.83949/) | 太好了,是MineBBS站内链接,我们有救了! |
启动器的功能和用法,在他们的官方文档中写的很详细,也很清楚。其实这一个东西,就是Minecraft Java版的核心,直接跳到这里的同志们捡到大便宜了!
当然,我大概会以某一个启动器作为样例,详细讲解,手把手教你。介于我现在用的第三方Markdown编辑器不是很方便使用图片,所以只好往后再说了。
除原版启动器外,第三方启动器都支持离线登录,即绕过正版服务器验证,不过这样会导致无法进入正版服务器。[^2]
---
[^1] 事实上TT702太会宣传了,也的确很有实力。之前被针对过,所以才有这句话。
[^2] 有关正版服务器,请参阅第八部分:`有关游戏的事情`中的“服务器”部分。
第五部分:Minecraft Mod
=====================
接下来又是一个重难点,看不下去的可以直接跳,因为我会讲一些Mod底层的东西。如果你想看`Minecraft Mod`资源,请看第九部分:`合理运用工具`
这里我以Forge为例,详细解释一下Minecraft Mod是如何加载的。
在此之前,我们先介绍一下巨人,因为我们今天所做的一切,都站在了巨人的肩膀上。
## Minecraft源代码
抛开混淆映射表,你直接反编译源代码,得到的应该长这样:(并非Minecraft源代码一部分,仅仅只是一个例子,取自Harbinger)
```java
public class a extends b {
private c c1;
private final d d1;
public a(e par1, f par2) {
this.d1 = g(par1);
this.c1 = h(par2)
}
private d g(e par1) {
return ...;
}
public c h(f par1) {
return ...;
}
}
```
我们当然可以直接改着玩意,但没有人会这么做,因为这玩意基本读不了……
但是总有一些人注意力超群,他们看到这份代码,立马就拍桌子,说:“注意到!函数xxx应该是实现了异常信息。”这句话并不是玩笑——更改了变量名字,却改不了代码逻辑。~~就好似你得到了她的身,却得不到她的心~~如果就这样顺藤摸瓜、趁热打铁,很有可能会做出点什么!
MCP(Mod Coder Pack)就是这样诞生的——很久之前,有一帮先驱者们率先开始了对 Minecraft 这个商业软件的人力反混淆工程。最终的成果便是一套完整的反混淆映射表,通称 MCP Mapping。
它代表了社区贡献者站在局外人的视角上对 Minecraft 底层代码的理解,甚至可以认为映射表是猜出来的。
MCP给出的也只是一套“参考解读”。MCP的解读代表的是Minecraft当前底层的现状。正因为此,MCP的理解有可能与Mojang员工实际想表达的意思有偏差,可能Mojang所使用的名称和MCP使用的名称大相径庭,也有可能MCP给出的名称比Mojang所使用的名称所表达的意思更准确。
> 但这还是逆向工程啊!
> 是的,这是逆向工程,所以 MCP 这样的工程仍然落在一个灰色偏黑的地带中。
> 之所以 MCP 这样的工程能活到现在,还是要拜 Mojang 不表态的态度所赐。
> 毕竟 Mojang 也清楚 User-Generated Content(UGC)是 Minecraft 成功的关键一环。
>
> —— [Harbinger](https://harbinger.covertdragon.team/chapter-01/mcp.html)
实际上Mojang已经发布过[Minecraft官方映射表](https://zh.minecraft.wiki/w/%E6%B7%B7%E6%B7%86%E6%98%A0%E5%B0%84%E8%A1%A8?variant=zh-cn),但介于法律条文,所以MCP和Yarn这样的项目还得存在。
## Forge
> Minecraft Forge
> 因此,Forge 更像是一套完整的工具包(toolkit),或者说框架(framework)。
> 在它的基础上开发 Mod 可以加快开发速度,同时能自动获得对其他 Mod 的良好兼容。
> 也因此,在 Forge 这个大框架下,Mod 之间已经没有多少真正意义上的兼容性问题了,多数时候我们所说“兼容”问题是指跨 Mod 的交互不符合用户的预期,或者 Mod 在更新版本时引入的二进制不兼容更新。
> 前者需要 Mod 开发者之间的协调,而后者则是软件开发中依赖地狱的一个简化版本。
>
> —— [Harbinger](https://harbinger.covertdragon.team/chapter-01/forge.html)
在此之前,我们需要解释Forge本身对Minecraft都做了什么~~Play~~。本片段以`Minecraft Forge 1.12.2`作为样例解释说明。
### 事件总线
Minecraft源代码写的非常差,只有开源的那部分写的还不错。所以本身Minecraft就是一个史山。
想要加载Mod,那么必须要有框架,于是Forge采用了事件系统(Event System)。
无一例外,你能想到的,大概都有一个事件。例如注册物品的事件`RegistryEvent.Register<Item>`.
目前Forge事件总线可以分成两套:`MinecraftForge.Event`和`FML.common`。前者是Minecraft事件,后者是Mod加载过程的生命周期。
### Minecraft本身就是一个加载项
是这样的,Forge对Minecraft的改动非常大。也许你安装了Forge,但是没有安装任何依赖和加载项,却要7个加载过程和四个基本加载项,这是因为Forge要加载Minecraft游戏本身。游戏本身的物品、所有的事件(当然是Forge后改的)、方块……都要被加载进Forge注册表。
### Mod加载的七个周期[^1]
| 周期 | 描述 |
| ---------------------- | ----------------------------------------------------------------------------------- |
| 1. Construct Mod | 扫描mods文件夹中的所有Mod文件并尝试加载它们,并为后续的加载过程做准备 |
| 2. Pre-Initialization | Mod开始向游戏注册其核心内容。主要任务包括:注册方块和物品,注册实体,分配矿物词典。 |
| 3. Initialization | 注册世界生成器,合成配方,事件处理器,并发送IMC(Forge中跨Mod通信)信息 |
| 4. Post-Initialization | 处理Mod之间的依赖关系,完成其他操作。 |
| 5,IMC Event | Mod会处理接收到的IMC信息。IMC允许Mod之间在运行时进行通信。 |
| 6. Server Starting | Mod在这个阶段操作服务端。[^2] |
| 7. Client Starting | 为游戏做最后的准备。例如弹出主界面,注册渲染器、设置模型等。 |
---
[^1] 部分内容参考[Forge文档](https://mcforge-cn.readthedocs.io/zh/latest/conventions/loadstages/)。
[^2] 请参阅第八部分:`有关游戏的事情`中“前后端分离”部分。
第六部分:Minecraft额外加载项
===========================
## Optifine
Optifine是老牌的优化、闭源的第三方加载项,和Forge、LoteLoader兼容。是加载光影的不二之选!
新版本和大型整合包不推荐Optifine,因为有Mod代替它,并且完成得更好。
不推荐它的另一个原因,它是闭源的。也许是因为项目的特殊性,总之不好说。
高版本有`元素周期表`系列,而且本身和Fabric并不兼容。~~Fabric Mod优化比这破玩意好多了。~~
## Forge、Fabric、Quilt、Neoforged、LiteLoader
这些客户端,除了LiteLoader和Forge可以兼容,Neoforged和Fabric未来可能兼容以外,其他全部不互相兼容。~~LiteLoader和Fabric的兼容有待考证,LiteLoader甚至没活到Fabric诞生的版本。~~
没有什么要特别讲述的,1.12.2及以下首推Forge+LiteLoader(也许部分Mod不兼容LiteLoader,按需选择)。
1.13到1.14.4比较特殊,只有Forge苟活下来了,有什么就用什么吧。
1.14.4往后,推荐Fabric,因为剩下那俩还在开发,并不稳定。当然你也可以尝鲜,没什么不好的。
### Quilt
这个项目比较特殊,Quilt似乎是Fabric分叉,并且自己实现了Fabric API(Quilted Fabric API)兼容Fabric Mod,而且有自已一套独特的API。
不是很好说Fabric和Quilt哪个更适合。因为后者我没用过(我真的没用过)。
### NeoForged
这个项目是Forge分支,因为cpw和len闹掰了。目前踊跃地和Fabric合作,期待他俩今后的表现。
### Mod
根据加载器不同,可以分为Fabric Mod,Forge Mod……,这些Mod都可分为客户端Mod和服务端Mod,客户端可以加载服务端Mod,但服务端不能加载客户端Mod。
它的位置是`.minecraft/mods`(如果开启了版本隔离,那应该是`.minecraft/version/[你的版本名称]/mods`)
不同加载器的Mod不能混用,否则后果很严重!会导致Minecraft崩溃(确信)。
## 材质包
这个包包含了模型,文字,语言,甚至声音。不只是原版,Mod也可以替换。
考虑后续写一篇材质包制作教程。虽然站内有很多了……
它的位置是`.minecraft/resourcepacks`(如果开启了版本隔离,那应该是`.minecraft/version/[你的版本名称]/resourcepacks`)
不同版本的包少部分可以混用。
## 光影包
需要Optifine或者Iris Mod才可以加载。
应该是OpenGL代码一系列的,等我学会了写一篇教程。
它的位置因不同的加载器而不同,并不好说。
不同加载器的包除非加载器作者或光影包作者明说以外,当不能混用处理。
## 数据包
这位更是重量级,它其实是官方的加载项,利用Minecraft Function文件,有很多玩法,甚至可以比肩Mod。
当然了,因为是数据包,所以并没有Mod支持的多。不过我还不是很会,写不了教程。
它的位置和存档有关,大概是`.minecraft/saves/[存档名称]/datapacks`(如果开启了版本隔离,那应该是`.minecraft/version/[你的版本名称]/saves/[存档名称]/datapacks`)
不同版本的包不能混用。
## 基岩版行为包
大概和数据包一样,不过比数据包要宽广很多。只是微软不干人事,弄了很多很恶心,而且也不怎么开放的东西出来罢了。
## 基岩版RTX光线追踪
这个和加载项无关,需要在基岩版商店中下载(免费的!)固定的地图,并且显卡还得是RTX系列,支持光追的才可以!
不过部分光影包已经可以媲美光追了,所以这部分并不好说。
## 服务端插件
和Mod不一样,服务端插件只可用于服务器,而且是受插件支持的服务端。
第七部分:Minecraft整合包
========================
很好理解,整合包大概有这些打包方式:`我的世界中文论坛`,`CurseForge`,`Modrinth`, `FTB`。其中FTB格式的整合包就不要想打包了,貌似是FTB Term私有的打包格式。前面三个可以。
这些包直接拖入你的启动器就可以,现代启动器一般都支持这么干。当然也可以跟着启动器的操作一步步进行。
也有直接将minecraft游戏整个目录打包的,少部分启动器支持直接导入,但是请注意版本隔离。
整合包一般会有作者的魔改内容,并不是仅仅只是将Mod放在一起就可以了。
第八部分:有关游戏的事情
======================
## 地图种子
相同版本,相同地图种子下生成的世界是相同的,甚至在Minecraft1.21之中,地图种子都确定了随机事件,也就是同一个地图种子下,固定次数的事件回应是相同的。也就导致RNG操作不复存在。
## 游戏存档
可以分享给你的好大儿。基本是`.minecraft/saves`,如果开版本隔离的话是`.minecraft/version/[你的版本名称]/saves`
## 截图
也就是在游戏中按下F2的截图文件,基本存在了`.minecraft/screenshots`,如果开版本隔离的话是`.minecraft/version/[你的版本名称]/screenshots`.
## 服务器
服务器分为正版服务器和离线服务器,正版服务器只有正版账户才可以进入,而离线只能进离线服务器。正版账户可以进入离线服务器。
## 前后端分离
Minecraft采用前后端分离,也就是客户端和服务端分离的方式,这样设计有一个好处,服务端和客户端可以单独做自己的活,只要发包通讯就好了。
所以才存在了假方块,玩家不卡但是实体卡,单人存档被kick这些离奇操作。
客户端主要负责渲染,服务端主要负责运算。
第九部分:合理运用工具
====================
## CurseForge和Modrinth
这两位更是重量级,是非官方的Minecraft资源站,大部分启动器都支持从这里面直接下载东西。
包括数据包,光影包,材质包,地图和Mod。
## NBT标签编辑器
例如[NBT Explorer](https://zh.minecraft.wiki/w/%E8%BE%85%E5%8A%A9%E7%A8%8B%E5%BA%8F%E4%B8%8E%E7%BC%96%E8%BE%91%E5%99%A8/NBTExplorer?variant=zh-cn)。
## MCP和Yarn
这两位前面介绍过了,用来反编译MC的。
## Minecraft社区
例如你现在看的MineBBS,不再强调,有MC玩家的地方就有MC社区。
第十部分:最后的话
================
如果你能看到这里,大概是已经通篇读下来了,
我检讨,将很多高深的知识都写入了,也许也没有顾及到真的不会用电脑的人。
但还是希望看到这里的你,今后可以一帆风顺,心想事成。希望这篇可以扫除你目前对Minecraft的障碍,今后成为出色的Minecraft玩家。答应我,一定要做到!
[/MD]
- 内容版权许可
- CC BY-NC-SA 署名-非商业性使用-相同方式共享