知天易,逆天难。
本教程主要面向那些具有高度自定义需求的腐竹。你可能需要拥有一定编程知识,如果会面向对象编程最好。如果您并没有高度自定义服务器的需求,那么进阶篇的教程已经足够满足你了。
编者水平极其有限,难免会出现错误和遗漏,如果您发现任何问题,或者您有任何其他的教程希望我们推出,都可以随时联系我们。
当然,有任何问题您也可以随时在 MUA 各群聊中询问,我们非常乐意提供咨询和技术援助。
编者:Polaris_Light
Paper 使用与 Spigot 相同的 Patch 系统来构建项目。什么是 Patch 呢? Patch 实际上就是一个类似 Git 的记录系统,一个 patch 文件记录了对原仓库的某个文件的修改。例如:
- this.random = SHARED_RANDOM; // Paper
+ this.random = top.leavesmc.leaves.LeavesConfig.useVanillaRandom ? RandomSource.create() : SHARED_RANDOM; // Paper // Leaves - vanilla plz
也就是说,如果你删除了Paper的所有Patch后再构建项目,它就会变成一个 Spigot。如果你删除了 Spigot 的所有Patch,就会变成一个 CraftBukkit + Bukkit。
而许多破坏原版的行为实际上是 Paper 引入的,这是因为 Paper 追求一个可以供普通人联机的服务器,因此破坏原版特性以进行优化是可以接受的。
所以说,只要将这些破坏原版特性的Patch再通过Patch修回来后,就能得到一个保留了原版特性并兼有优化的服务端;当然也可以变得更加激进,破坏所有细枝末节的特性来获得极致的优化。
由此诞生了一大堆不同的Paper分支,他们或针对性恢复了原版特性,或尝试极致的优化。因此可以根据服务器的性质来选择最适合的服务端,在“原版特性”与“优化”之间取到一个平衡。这篇文章能帮助你更好地理解这些 Fork 之间的不同。
当然要注意的是,几乎所有 Paper 分支都存在着跑路的可能,因为这些分支往往应用范围极小又缺少人手维护。因此请务必做好随时迁移的心理准备。
这里举出一些支持最新版本的常见Paper分支:
| 核心名称 | 介绍 | 链接 |
| Purpur | Purpur 为 Paper 提供了更多的配置选项。这些配置选项或恢复了原版的特性,或修改了一些原版的设定,或提供了更为激进的优化。 缺点是恢复原版特性的程度比较有限。 Purpur 的维护者比较多,因此不太有跑路的风险。 |
🌏 |
| Leaves | 生电狂魔,修复了几乎所有的原版特性与 Mojang 的修复,并引入了大量生电相关协议与假人系统。 缺点是优化相较原版 Paper 较弱,且有些修复为暴力修复,可能并不原版。由于使用人数相当多,Leaves 目前的跑路风险不大( |
🌏 |
| Gale | Gale 在 Paper 的基础上引入了一定的多线程,从 AirPlane 与 Lithium 取用了一些不破坏原版特性是优化,并引入了 Purpur 的一些配置选项,因此成为了在原版特性与优化平衡最好的服务端。 缺点是多线程可能会导致潜在的问题,且存在一定的跑路风险。 拿来做复原项目的服务端相当不错。 |
🌏 |
| Mirai | 优化战神()优缺点都很明显的服务端。 缺点是随时可能跑路,原作者已经跑路了。 |
🌏 |
Folia 也是 Paper 的下游,但 Folia 整个重写了区块系统,采用多线程,与原本的 Paper 相去甚远。Folia 在核心较多的情况下能充分调用所有核心,因此成为了超大型 SMP 与校园复原参观服的最佳选择;但是由于对原有 Bukkit 插件的不兼容以及潜在的问题,依然要谨慎选择将 Folia 投入生产环境中。
你可以在这里找到目前支持Folia的插件。
当然,与 Paper 一样, Folia 也有大量的分支;但是考虑到 Folia 本身也不太稳定,此处不作推荐。
MC不仅仅有基于官方服务端的服务端,还有一些第三方服务端。他们千奇百怪,大多不用 Java 编写,从根本上解决了J ava 性能差与 Minecraft 版权的问题;当然这些服务端大多不能实现完整的生存游玩,仅实现了基本的功能。
你可以在这里找到一个第三方服务端的列表,可能并不完整。
这里可以着重关注一下 Obsidian 与 Minestom ,如果你有足够的Java开发经验可以尝试构建一个自己的Minestom服务端。
编者:Polaris_Light
你需要拥有以下东西:
原版 ChatBridge 项目:https://github.com/TISUnion/ChatBridge
原版 ChatBridge 有如下的问题:
FDCraft 的修改版:https://github.com/FDCraft/ChatBridge
对原版的修改可以查看 README.md 。
如果你有其他的需求(例如使用需要使用支持非 Onebot 协议的无头客户端,接入 Discord 或者 Matrix等),可以参考这两个项目的代码来自行实现,或者在原项目的 Fork 中寻找相应的 Implementation。
新建一个文件夹,此处为CB, 复制一份 ChatBridge.pyz 到文件夹内。
参考项目的README.md安装依赖。
mcdreforged>=2.2.0
pycryptodome
colorlog
在CB打开控制台(cmd或bash等),输入python ChatBridge.pyz server(windows)或python3 ChatBridge.pyz server(linux)启动中央服务器。
此时程序应该崩溃,并生成配置文件。对配置文件进行配置。
{
"aes_key": "MUAlliance", // 秘钥
"hostname": "localhost", // 中央服务器IP
"port": 30001, // 中央服务器端口
"clients": [ // 客户端列表,要与客户端对应上
{
"name": "Survival", // 客户端名称,不能重复
"password": "Survival" // 客户端密码
},
{
"name": "Creative",
"password": "Creative"
},
{
"name": "CQ",
"password": "CQ"
},
{
"name": "KOOK",
"password": "KOOK"
}
]
}
5. 再次启动中央服务器,搭建完成。
复制 ChatBridge.pyz 到各子服的plugins文件夹内。
启动MCDR,生成配置文件。
对配置文件进行配置。这里的秘钥与客户端名称、密码应当与中央服务器对应。
{
"aes_key": "MUAlliance", // 中央服务器秘钥
"name": "Survival", // 客户端名称
"password": "Survival", // 客户端密码
"server_hostname": "127.0.0.1", // 中央服务器IP
"server_port": 30001, // 中央服务器端口
"enable": true,
"debug": false
}
新建一个文件夹,此处为CBCQ, 复制一份 ChatBridge.pyz 到文件夹内。
参考项目的 README.md 安装依赖。
websocket>=0.2.1
websocket-client>=1.2.1
在CBCQ打开控制台(cmd或bash等),输入python ChatBridge.pyz cqhttp_bot(windows)或python3 ChatBridge.pyz cqhttp_bot(linux)启动中央服务器。
此时程序应该崩溃,并生成配置文件。对配置文件进行配置。
{
"aes_key": "MUAlliance", // 中央服务器秘钥
"name": "CQ", // 客户端名称
"password": "CQ", // 客户端密码
"server_hostname": "127.0.0.1", // 中央服务器IP
"server_port": 30001, // 中央服务器端口
"enable": true,
"debug": false,
"ws_address": "127.0.0.1", // 无头QQ客户端的正向WS (ForwardWebSocket) IP
"ws_port": 6700, // 无头QQ客户端的正向WS (ForwardWebSocket) 端口
"access_token": "", // 无头QQ客户端的正向WS (ForwardWebSocket) 的 access_token, 没有就留空
"react_group_id": 12345, // 互通群群号
"client_to_query_stats": "Survival", // 查询数据的客户端的名称, 需要安装有stats_helper
"client_to_query_online": "Survival", // 查询在线人数的客户端,需要是OnlineCommand客户端或者任意能响应!!online命令的客户端
"server_display_name": "UAS" // 服务器名称
}
修改版的依赖与配置文件有所不同。
matplotlib
{
"array": false, // 是否使用Array格式传输消息,以兼容更多的无头QQ客户端
"mcsm_apikey": "" // MCSM超级用户的apikey,不用!!info就留空
}
注意此处以修改版为例,原版仅支持Python ≤ 3.8,且存在潜在的问题。
新建一个文件夹,此处为CBKOOK, 复制一份 ChatBridge.pyz 到文件夹内。
参考项目的 README.md 安装依赖。
khl.py>=0.3.16
matplotlib
在打开CBKOOK控制台(cmd或bash等),输入python ChatBridge.pyz kaiheila_bot(windows)或python3 ChatBridge.pyz kaiheila_bot(linux)启动中央服务器。
此时程序应该崩溃,并生成配置文件。对配置文件进行配置。
{
"aes_key": "MUAlliance", // 中央服务器秘钥
"name": "CQ", // 客户端名称
"password": "CQ", // 客户端密码
"server_hostname": "127.0.0.1", // 中央服务器IP
"server_port": 30001, // 中央服务器端口
"enable": true,
"debug": false,
"client_id": "", // KOOK机器人的 client id
"client_secret": "", // KOOK机器人的 client secret
"token": "", // KOOK机器人的 token
"channels_for_command": [ // 响应机器人指令的频道id
"123400000000000000",
"123450000000000000"
],
"channel_for_chat": "123400000000000000", // 互通频道id
"command_prefix": "!!", // 命令前缀,一般不变
"client_to_query_stats": "Survival", // 查询数据的客户端的名称, 需要安装有stats_helper
"client_to_query_online": "Survival", // 查询在线人数的客户端,需要是OnlineCommand客户端或者任意能响应!!online命令的客户端
"server_display_name": "UAS" // 服务器名称
}
注意:如果你的 Nonebot 或者 Koishi 上也有 KOOK 机器人,请不要与 Nonebot 或者 Koishi 共用同一个机器人!
编者:Polaris_Light
项目地址:https://github.com/xymb-endcrystalme/LinearRegionFileFormatTools
Linear Region File 是一种新型的 Minecraft 区域文件格式。
要搞明白这个问题,首先需要说明 Minecraft 默认的区域文件格式,Anvil。如果你曾经用过诸如 MCASelector 之类的软件编辑过区块或者手动删除区块以减小存档大小,你会知道 Minecraft 的区块使用一种后缀名为.mca的文件格式储存。
这种格式被称为Anvil文件格式。 Anvil 文件格式在 Minecraft 1.2 中被引入,其前身为运行在 Minecraft Beta 1.3 上由 Scaevolus (Optifine 的作者) 带头编写的 MCRegion 格式。Anvil 对 MCRegion 进行了大量的优化,例如不去储存未生成区块等,但是其核心算法并未改变。关于 MCRegion 格式,具体的数据结构可以参考 mcwiki ,在这里你只需要知道它大致是这样生成的:
.mca文件;.mcc文件,而不储存在.mca文件中,.mca文件中仅留下一个标识。在 Anvil 中,这个数据结构并没有发生大的改变,更多的改变在于对SNBT本身的优化与功能增加。在当时,对于SNBT本身的优化已经能够带来可观的提升,而这个数据结构本身也已经是在CPU、内存、磁盘之间进行平衡后比较好的选择了。
但是随着 Minecraft & Mod 内容的丰富与深度化,地图的大小显著增长,存档大小经常能达到 10GB 乃至 TB 的级别。此时 CPU 内存磁盘之间的平衡被打破, Anvil 变得力不从心。
Anvil 有如下三个历史遗留问题:
.mcc文件的存在是为了限制.mca文件的大小在4GB,这可能是当时的内存较小所致;而现在.mcc文件已经不再被需要。| Compressor name | Ratio | Compression | Decompress |
|---|---|---|---|
| zstd 1.5.1 -1(Linear的算法) | 2.887 | 530 MB/s | 1700 MB/s |
| zlib 1.2.11 -1(Anvil的默认算法) | 2.743 | 95 MB/s | 400 MB/s |
| brotli 1.0.9 -0 | 2.702 | 395 MB/s | 450 MB/s |
| zstd 1.5.1 --fast=1 | 2.437 | 600 MB/s | 2150 MB/s |
| zstd 1.5.1 --fast=3 | 2.239 | 670 MB/s | 2250 MB/s |
| quicklz 1.5.0 -1 | 2.238 | 540 MB/s | 760 MB/s |
| zstd 1.5.1 --fast=4 | 2.148 | 710 MB/s | 2300 MB/s |
| lzo1x 2.10 -1 | 2.106 | 660 MB/s | 845 MB/s |
| lz4 1.9.3(24w04a加入的新算法) | 2.101 | 740 MB/s | 4500 MB/s |
| lzf 3.6 -1 | 2.077 | 410 MB/s | 830 MB/s |
| snappy 1.1.9 | 2.073 | 550 MB/s | 1750 MB/s |
为了解决这些问题, Linear Region File 便由此诞生。
.mcc文件。通过这样的变更,Linear 宣称能比 Anvil 在主世界和下界节省 50% 的储存空间,在末地节省 95% 的空间。实测的结果为,在压缩率参数选择 6 时,主世界与下界为原先的 70.17%,末地为原本的 29.39%。
.linear文件。.mca文件的插件/模组兼容,目前已知的有Bluemap(在服务器上开启一个客户端读取存档来获取地图)。