知天易,逆天难。
本教程主要面向那些具有高度自定义需求的腐竹。你可能需要拥有一定编程知识,如果会面向对象编程最好。如果您并没有高度自定义服务器的需求,那么进阶篇的教程已经足够满足你了。
编者水平极其有限,难免会出现错误和遗漏,如果您发现任何问题,或者您有任何其他的教程希望我们推出,都可以随时联系我们。
当然,有任何问题您也可以随时在 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(在服务器上开启一个客户端读取存档来获取地图)。