序章:运维之魂觉醒
我重生了,重生在我的世界与迷你世界一战之时
“像素方块的硬核才是王道😤 你的卡通画风根本没技巧🙄”
“萌趣的世界才受大众喜爱😊 你的硬核玩法早就被时代落败💀”
眼前,闹吃和古振兴正在互相吼着。你定了定神正准备说些什么,天空上一声惊雷响彻云端:“既然无法决出高下,便看看谁做的游戏开出的服务器人玩的最多吧!”
闹吃闻言转身看向你,你猛然回头,所有的记忆都涌入脑海:上一世,你因开服技艺不精,mc玩家在你那bug不断,卡到爆炸的服务器上失望至极,逐渐流失...
“可是这一世,我仍然只是个普通的mc玩家啊......”
就在你准备直接放弃之时,突然,一个飞行的土豆在你身后突然口吐人言:“恭喜您觉醒运维之魂,我是服务器机魂化身,这次将由我指导你开出完美的服务器”
”这次,我一定要打败古振兴,做出世界上最强的服务器!”
写在题目前面:
现在的大学生无不玩过mc,有许多人曾梦想过开一个大型mc服务器却还迟迟未行动过
本题旨在从0培养一名玩家成为一位合格的服务器技术,助力你在大学期间建立一座你的方块帝国。
由于涉及到冷门且深入的游戏技术,我将把这道二面题从零基础开始讲起,这道题可能也是极创二面题里唯一一个含大量简单内容的题目
但我相信,如果你搞明白了所有前置知识并尝试过挑战题,你所付出的工作量与所体现的能力并不会比选其他题目差(其实挑战题非常难)
在运维方面,很多东西是ai无法给出答案的。我们鼓励使用AI解题,但请务必搞清楚AI在干什么,原理是什么,要对你的玩家负责。正如我写这一篇题目没有使用任何AI代笔,我希望在大AI时代你也可以认认真真读完我的题目,而不是使用AI一键读题和生成答案(当然要用AI开发的地方一定要用AI,不要当原始人哦)
祝你们在开服体验中玩得愉快,学到东西
本题任务
本题将指导你开出一个多玩法、高性能、完全属于你原创的mc服务器,题目由多个小型题目组成,涵盖Java开发、逆向开发、mc研究、实体服务器运维、产品设计与游戏策划,推荐有一定的java基础的mc玩家做这道题
考虑到仅使用ai vibe coding服务端会导致服务器上线时运维不稳定,本题要求每一道子题都能够探究其原理和技术内容并能讲出来(不限制AI使用,但要探究其原理)
不要用AI完全接管你的服务器运维,这会导致灾难
子题目将由 基础知识、小试牛刀、挑战题目 三大 模块组成,难度递增且紧密相关,建议逐个题目线性完成。前2个模块可以不做,如果有开服基础,请直接开始尝试挑战题目
点我直接跳转挑战题目
本题前两个模块极为简单,用作给各位喜爱mc但完全没接触过开服基础的玩家作背景引入。真正具有挑战性的是后续挑战题内容,题目解答最低通过要求为 至少各完成1道挑战题
注意,如果你选择略过简单题,请务必确保相关知识都已学会
基础知识
服务器硬件选取
你应该知道的,任何游戏的服务器都得有一个硬件平台供服务器软件运行,mc服务器常见的有 实体机、VPS、内网穿透、面板服
学习1:
上网搜索或向AI咨询服务器平台选取指南,挑选一个除面板服以外的开服形式并准备好,这可能会花费一定的开销,但一顿饭的钱足矣
请安装linux操作系统,如果不熟悉linux相关操作请先进行学习
如果你的服务器初具规模,日活保持在5人以上,可以向Zhongzi8972申领一份免费的14900K虚拟机或一份不限量内穿,仅限前5支队伍
学习1进阶:
如果你选择购入vps,尝试使用vps+内穿软件实现一个内穿,使得外部用户可以通过公网ip访问你的电脑
如果做出此题,保留你的结果以获取额外面试分数
学习2:
深入理解你目前使用的服务器配置,并指出开一个小型mc服务器(10人以内)他的性能瓶颈是什么,为什么会有这种性能瓶颈?
服务器软件选取与学习
mc社区发展至今,各种各样的服务端撑起了mc庞大的服务器社群。除原版端外,他们大致分为插件端、模组端与混合端。作为立志开大服务器的你,应当选择以paper及其子分支为代表的插件端
学习3:
你知道插件端和模组端的区别吗?你客户端上常用的加载器是什么类型?为什么机魂要求你选择插件端?插件端都有哪些?分支关系都是什么?学习并讲述答案
学习4:
尝试获取一份完整的nms,尝试从某个片面的问题去窥视mc的业务实现
加分题1:
找到并阅读耕地的源码,解释耕地的行为原理与方块类实现(生成,种植,被破坏,湿润与干燥等)
加分题2:
阅读随机刻源码,解释tick实现原理和方法
学习5:
理解何为“patch”,并阅读paper/spigot/bukkit端源码,理解并掌握插件端实现功能的魔法技术
在经过详尽调研后,我们选择1.21.11 purpur插件端作为我们的开始,作为优化较为齐全的paper分支,这对我们开大型服务器来说恰恰好
小试牛刀
我的世界,启动!
实践1:启航
开启一个purpur服务端,并尝试使朋友们使用外部网络进去游玩
初始化你的服务器,打开你的白名单,并调整一些gamerule等内容
实践2:hello world!
编写一个paper插件,使每个玩家进游戏时都能收到一句欢迎词
实践3:nms初试
通过nms,实现一个paper端事件库里没有的事件,并尝试fork一份paper把他注入到专属于你自己的paper事件库里
实践4:性能分析
开启spark并正常游玩一段时间,尝试使用spark数据分析你的服务端并得出一定结论
服务端优化
很显然,现在服里的玩家很少,你的服务端并不会产生卡顿,可是如果你的服里有50人,有100人怎么办?尝试给你的服务端调优,这在后面的挑战题里会有用
实践5:purpur端调优
通篇阅读服务端的所有配置文件(不止purpur的哦),尝试写一份优化拉满但不失去游戏体验的配置文件。解释你优化了什么东西
实践6:群组服初体验
使用velocity管理3个子服,尝试不同的分流策略(玩家自主选择或自动分流)将玩家均匀分至不同服务端
服务端升级
velocity管理子服好像非常好用,发现了吗,你可以在一个服务器里集成不同的玩法服务端!现在让我们按照velocity群组服框架开始实现一个不同功能的服务器吧
实践7:大厅
构建一个大厅服务器,使所有玩家连接进入时都会出生在大厅服的固定位置,它至少应当包括如下内容:一个漂亮的大厅建筑、子服传送设施(一般是假人点击后传送至其他子服)、子服悬浮字介绍、登录验证、新人欢迎
实践8:升级群组服体验
安装viaversion系列插件保证玩家可以多版本加入;如果你关闭了正版模式,安装一个皮肤插件供所有离线玩家获得皮肤
加分题3:皮肤站
尝试部署一个皮肤站,并使用皮肤站登录来代替群组的皮肤管理和登录管理,使得玩家皮肤数据独属于你的服务器
加分题4:群服互通机器人
尝试部署一个群服互通机器人,让玩家在QQ群可以自动绑定白名单,并可以和服务器内玩家相互交流
如果你部署了皮肤站,尝试将皮肤站接入群服互通
实践9:生存服与更多的插件
向velocity接入你的第一个生存服,并给他添加以下功能:
基础经济与全球市场、官方商店
公会插件(如果有必要)
头衔插件
至少1个地形数据包
权限管理插件(lp)
日志插件(一般会使用coreprotect)
备份插件
其他你所想安装的插件
实践10:更多的子服务器
尝试找寻并安装一个小游戏服务器放入你的群组服中(起床战争、空岛战争等)
实践11:基岩端适配
安装geyser与floodgate,尝试适配基岩版,让手机也可以游玩你的服务器
特性修复
如果你没有生电玩法需求,跳过这一小节即可
如果你了解过生电,你一定会迫不及待地在你的服务器尝试制造一个生电机器——但很快就会发现好像诸如TNT复制一类的机器并不会奏效
那么,思考一下为什么吧!
实践12:purpur原生特性修复
实际上,paper及其分支服务端为了优化删除了大量原版特性,但他们提供了一定的开关配置。
研究怎么修好特性,并在你配置好的purpur端上进行生电机器测试
实践13:真正的生电端
如果你测试了诸如大型树厂一类的超级生电机器,你可能会发现即使你把特性修复火力全开拼尽全力也无法让他运行——这就是paper端的局限性
如果要一个纯净且功能齐全的生电端,请尝试安装一个fabric carpet地毯端,这在各大平台也有很多教程
将你做好的纯净生电端接入你的velocity群组服(这一步看似简单但可能产生很多问题,祝你研究愉快)
新的物品,新的方块,新的功能,新的生物
一般来说,如果你开的不是纯净生存,你一般会想添加各种你所能想到的自定义物品。你可能会想到使用数据包来实现——但这实在是过时了,现在我来教你一些全新的东西
实践14:CraftEngine初体验
CraftEngine是一个强大的开源插件,它可以添加新的方块、新的自定义物品,学习如何使用他,为你的服务器添加新的至少一种矿物与新的强大的武器,并为他们使用专属的贴图与模型
实践15:新的生物与技能
MythicMobs是一款强大的生物与技能插件,尝试用它覆写原版的怪物生成,做一些不一样的boss
可以搭配ModelEngine做出全新模型和行为的生物哦
挑战题目
终于走到这里了...玩闹到此结束了,你已经学会了服务端的基本知识,现在开始挑战吧!
要求至少完成一道挑战题,欢迎完成多个挑战题
1. 完整的群组服玩法方案与实践demo
如果你照着我的教程走下来了,那么这个任务就是按照之前所述的内容实现一个功能齐备、玩法齐全的服务端
最低验收标准如下:
- 含有一个至少拥有30个实用功能mod(计数指jar数量)的carpet生电端,并提供一个相对应的生电客户端
- 含有一个你原创的小游戏端,玩法可以是市面上现有的玩法(起床战争、空岛战争、战墙等),但管理插件和相关物品设计、数值设计、地图必须为队伍原创
- 含有一个携带资源世界的非生电端玩法服务端,且满足以下内容:
- 完善的经济系统与市场
- 不少于20种原创方块,且必须含有实际用途和功能
- 不少于30种原创物品,包括各类材料、护甲或武器(发挥你的创意)
- 不少于10种新生物,可以从开源项目中提取模型并实现进游戏,生物需要可以自然刷新到世界里
- 至少有1个稀有boss供玩家挑战
- 完善的备份系统与行为日志系统,防止熊孩子
- 一定的任务系统(至少含每日任务)
- 尝试加入地牢副本系统,制作1-2个副本
- 原创的地形(起码是对着网上的开源地形生成器改一改噪声)
- 至少1个原创的结构/地物
- 其他子服
- 子服间玩法需要紧密贴合,逻辑自洽,比如小游戏端参加游戏可以获得货币等奖励
- 游玩人数超过10人,最好日活保持在5人以上
2. 行为日志与回档
CoreProtect(后文简称coi)是paper端最为常用的行为日志之一,可以准确记录玩家的行为以防止熊孩子。可是用多了就会发现有很多问题,现在请你着手处理这些问题
Lv1
虽然coi记录已经非常齐全了,但是有很多空子可以钻:引爆苦力怕炸掉别人的家,或吸引恶魂烧毁建筑
针对这种问题,要求你fork一份coi源码,在其基础上加以修改,实现以下内容:
- 使间歇性破坏可以被溯源(如苦力怕爆炸时记录其仇恨实体)
- 对于极远形式的破坏,比如TNT大炮,或超远点燃东西将火焰传播到别人家烧掉,给出可以溯源的方案并尝试实现
- 大范围传递形火烧,给出整片点火区最早的着火来源(方便溯源)
- 吸引僵尸杀掉交易村民的案例中,记录僵尸的来源(是否由玩家故意吸引)
- 其他形式钻空子作案防范
打开你的思路,比如可以记录关键事件发生时周围指定半径的玩家
Lv2
coi可以对更改区域进行局部回档,但如果你尝试过会发现非常抽象——它是把更改过的方块一个一个setblock回去,这会导致方块在被设置回去时发生更新从而出现各种问题
现在,要求你着手解决这个问题,使得回档可以就像复原某个时刻的存档一样
提示:可以尝试冻结、写入mca文件再重新读取;或尝试冻结该区域的tick并在回档后不触发更新的方案(我并不确定这是否奏效)
验收标准:使用coi回档一个炸膛的世吞,使其能够完好如初
Lv3
coi在长时间累加数据至数据库时,可能会导致数据库文件过大超出系统读取限制从而无法读取文件,使得数据被废弃;且过大的数据库文件会导致数据库查询时间非常长,玩家每次查询coi需要等二十分钟以上才可以得到结果
请你重新设计coi底层数据库逻辑,使得它可以按日/周/月等时间跨度或按大小自动将写入的数据库文件分开存放,并可以做到快捷读取
举例子:按周将数据存入不同的sqlite数据库,并可以快速读取所有的sqlite以提供快速的查询
Lv4
使用coi回档玩家背包时,常常会因为回档指定时间区间内只有玩家背包的变化,没有玩家变化前的原数据,导致背包被回档得乱七八糟
举例子:玩家在12:00时拥有64钻石、64圆石,在12:01时丢弃了32个钻石,在12:20时因服务器bug导致背包被清空(这会导致coi无记录)。玩家要求你回档,你尝试将他的背包使用coi回滚至12:00,这时发现背包里只会被coi返还中途玩家自主丢弃的32个钻石,其他物品会全数丢失
解决这个令人头疼的问题
3. 细致的建筑/红石机器 生成AI模型
你应该看到过关于GPT6做mc建筑的视频——让一个LLM模型去做建筑还是有点难为他了,现在我们希望你训练一个可以按照预期精细化建模的AI模型
我们现在拥有3万套收集好的投影文件,他们刚被收集还未被标注,请你从清洗与标注数据开始,逐步得到一个令人满意的建筑生成模型
Lv1
我们已经把建筑数据进行了初步清洗和格式统一,现在要求你将数据进行标注,使其具备以下特征:
- 详细描述需要树化,例如一个城市投影,需要按基础地形/道路|区划/建筑/ 细分然后标注
- 同时需要标注一份梗概描述,的是保证未来的模型输出具备可控性(梗概->详细描述由另一个专用模型完成以简化用户侧)
- 具备一个快速标注的方案,使这3w套数据可以迅速落实标注
可能有用的解题思路:将标注过程分为两步,使用标注管线直接利用mc的渲染器渲染投影的多视图,由模型生成梗概,并判断是否需要交互式工作台。不需要交互式工作台时模型直接给出详细标注,需要时驱动AI进入游戏内探索和理解
Lv2
使用标注好的数据训练一个建筑生成模型。我们已经通过一定的实验否定了扩散模型的可能,建议你训练时采用sft和rl两步策略,其中sft的监督数据集需要逆向轨迹合成算法来预搜索解,这需要一些高效并行方法,或者手工构造一些然后由rl自行探索
在不使用复杂的模型稀疏化技术时3D空间扩散的硬件开销对大型训练来说几乎无法接受,相比之下自回归生成性能更好,在轨迹预搜索的质量优良时尤其
祝你好运
Lv3
尝试让你的模型理解红石结构与相关逻辑,并尝试训练一个可以造机器的模型
4. 新一代基岩&Java互通方案
长期以往,geyser作为连接基岩和java玩家的桥梁,被数不胜数的服务器当作基石插件使用。可你一旦使用过就知道其bug众多,且问题大多很严重
我们在AI盛行时代前就对其进行深度分析和方案解构,认为其主要原因是糟糕的底层基石与协议翻译并不准确导致的。实际上,社区正需要一个完美的互通产品,取代geyser使基岩玩家可以无缝体验java版本的内容
我们基于对BDS(基岩版专用服务器)的长期研究,已经开发并开源了一套基岩版的协议库(https://github.com/SculkCatalystMC/Protocol),请你基于协议库,开发一套互通插件方案
本题只做Lv1即可,如果你可以在这么短时间完美完成lv1并解决lv2和3,那你真是举世奇才
Lv1
规划并开发核心框架,使得基岩版玩家可以正常进入java服务器游玩,且各项行为控制基本正常
在完成核心内容后,逐步优化基岩玩家的体验
至少做一个能进游戏的demo
Lv2
尝试制作让java玩家进入基岩版服务器的代理
Lv3
使你的互通代理可以精准翻译java服务器的资源包模型至be
可以复用geyser的方案,但我更希望看到不一样的、更便捷的方案
5. Geyser资源包丝滑翻译器
如果你在看完第四题之后深入了解过geyser,你会发现他其实是可以把一定量的java资源包翻译到基岩版资源包的,但如果为java的资源包额外编写基岩资源包的话极为麻烦
现在需要你构建一个支持高版本的(至少1.21.11可以用的)全自动化翻译资源包的程序,它应当包含以下内容:
- 对物品、方块的材质、模型等内容生成一份基岩版资源包
- 生成一份供geyser调用的mapper清单
- 尝试映射生物、家具或特殊模型实体的模型材质至基岩版
- 尝试映射特殊动画至基岩版
最低验收标准:基岩版进服务器后可以看到自定义方块与物品与相关模型正常显示
社区现在有一份人尽皆知的开源转化脚本,但只支持1.21.4以下版本的材质包转化。Mojang在1.21.4后大改了模型格式约定,这份脚本已经失效,但仍然具有参考价值
6. 线程级优化服务端运行
深入了解mc服务端后你应该会知道,mc的卡顿来自于其“单线程”的工作逻辑——当然这不是严格意义上的单线程,是指mc的大部分任务都会放在tick函数中一起处理,这导致一旦人员过多,tps便会骤降
社区也有一定的解决方案——folia端:这个项目将一定区域内的玩家用一个单独的线程来tick,从而真正使mc进入”多线程”模式,但这样做的问题显而易见,folia关闭了极大量的原版特性
我希望找寻一个轻量化的多线程系统,在不破坏平衡的情况下使服务端的卡顿被改善
优化应该在以下方面尝试入手:
- 维度间异步tick:现有的tick系统中,所有维度是加在一起tick的,但很显然这并不是一个必要的事情,尝试使维度间的tick系统分离,使每个维度拥有独立的运行线程
- 不同类型tick分离:尝试异步处理随机刻、计划刻、甚至是区块刻,将主tick内包含的事项减轻从而大幅度增加tps(这可能无法实现,如果不能实现请给出调研过程和放弃理由)
- 生物AI异步处理
- 其他的多线程优化,如果你有其他灵感的话
最低验收标准:完成前两项并展示异步成果(即某维度掉刻了但其他维度不受影响)
7. 压测与抗压评估系统
你做了一份服务端,但并不了解它能扛多少的玩家游玩,这时候就需要一个压测系统了
但现有的压测系统好像并不是很对你胃口,你决定设计一个全新的压测与评估系统:
- 可以具有千人级别的玩家上线请求
- 应当可以测出带宽用量(即不能只使用假人填充服务端,需要有真实的网络请求以测试带宽压力)
- 模拟一定的真实玩家的行为(跑图、挖掘、放置,甚至是建造并使用红石机器)
- 具有统一的测评标准,并且可以估算出不掉tps的最高玩家数量
- 尝试支持所有服务端(包括各类模组端或插件端)
验收标准:完成所有要求,并测评一个你自己研发的服务端
附录:参考资料
服务端与工具链
- PaperMC:插件端生态的核心,Paper / Velocity / Folia 的官方主页
- Paper 文档:开服、插件开发、性能调优与版本迁移的官方文档
- Purpur(配置文档):本题选用的服务端,配置项比 Paper 更细
- SpigotMC:老牌插件端与插件资源站,很多插件只有这一个发布渠道
- Velocity(文档):群组服代理端,实践 6 之后的所有内容都建立在它上面
- Folia(文档):区域化多线程服务端,第 6 题的对照组
- Fabric · Carpet · Carpet Extra:生电端的基石,特性开关与调试工具都在这里
- Hangar:PaperMC 官方的插件分发平台
- Litematica:投影文件的来源,第 3 题那 3 万套数据的格式参考
- Sponge Schematic Specification:跨平台的投影/结构格式约定
插件开发与底层研究
- Bukkit Javadocs · Spigot Javadocs:写插件时最常翻的两份 API 文档
- Paper 插件开发入门:实践 2 的起点
- Paperweight:Paper 的反编译、映射与 patch 工具链,理解“patch”的入口
- BuildTools:Spigot / CraftBukkit 的构建与反编译流程
- Yarn(映射说明):另一套 NMS 命名体系,对照阅读更容易看懂混淆后的类名
- ASM · Mixin:字节码改写与注入,插件端“魔法技术”的地基
- Java 版协议文档:数据包、登录流程与加密,做压测和互通都绕不开
- NBT 格式:几乎一切存档与网络数据的公共格式
- Anvil 存档格式 · 区域文件格式:第 2 题 Lv2 想直接改 mca 文件,就得先读懂它们
- Tick · Random Tick:加分题 2 与第 6 题的机制背景
性能分析、优化与多线程
- spark(文档):实践 4 要用的性能分析器
- Aikar's Flags:JVM 启动参数的事实标准
- Minecraft Server Optimization Guide:服务端配置调优的系统性整理,实践 5 的参考
- async-profiler · bpftrace:采样与内核级追踪,用来回答“瓶颈到底在哪”
生态插件(对应实践题)
- LuckPerms:权限管理
- EssentialsX:基础指令与经济
- PlaceholderAPI:占位符,悬浮字与计分板的胶水
- WorldEdit · FastAsyncWorldEdit:批量建造与地形改造
- AdvancedSlimePaper:给小游戏服提供可快速创建与卸载的独立世界
- BedWars:开源小游戏实现,可以对照它设计自己的玩法与数值
- CraftEngine(中文 Wiki):自定义方块与物品,实践 14
- MythicMobs(文档):自定义生物与技能,实践 15
- Blockbench:模型与动画的建模工具,自定义物品与生物模型的源头
- BetterModel:基岩版模型引擎的开源实现,ModelEngine 的可用替代
- ItemsAdder · Oraxen:另一类“自定义内容全家桶”,可以横向对比设计取舍
跨版本与基岩互通
- ViaVersion(源码):多版本兼容,实践 8
- Geyser(官网)· Floodgate:第 4、5 题要取代的对象
- Geyser Wiki:资源包翻译、
geyser dump排障与 API 的官方说明 - Bedrock Wiki:基岩版资源包、模型与动画格式的第一手资料,第 5 题的另一半答案在这里
- CloudburstMC/Protocol · gophertunnel:两套成熟的基岩协议库,可作为自研协议库的对照
- bedrock-protocol-docs:Mojang 官方放出的基岩协议文档
- PocketMine-MP · Nukkit:从服务端一侧理解基岩版行为的参考实现
- 基岩版专用服务器(BDS)下载:第 4 题的研究底座
- SkinsRestorer:离线模式下的皮肤方案
- authlib-injector · Blessing Skin:加分题 3 的皮肤站与外置登录
行为日志、存档与数据库
- CoreProtect(资源页):第 2 题要 fork 的对象
- SQLite(WAL · FTS5 · 各项限制):第 2 题 Lv3 说的“文件过大读不出来”就发生在这里
- DuckDB · ClickHouse:列式存储与 OLAP,适合“按时间区间横扫历史记录”这种查询
- Parquet · Apache Arrow:把历史数据按天/周落成文件的标准做法
- RocksDB:嵌入式 KV 存储,写入吞吐的另一条路线
- MCA Selector · Amulet:直接读写区域文件的工具,做回档与存档分析时很好用
建筑生成与 Agent 数据集
- MineDojo · MineRL:Minecraft 上的大规模任务与示范数据集
- Voyager · JARVIS-1:LLM 在 MC 里“自己动手造东西”的经典工作
- VPT(Video PreTraining):用视频预训练得到会操作的模型
- TRELLIS · Shap-E:3D 生成模型的现状,第 3 题否定扩散路线时的参照系
- InstructGPT · STaR · ReST^EM · DPO · DeepSeek-R1:SFT + RL 两段式训练与轨迹自举的常用配方
- Isometric Renders:在游戏内批量渲染投影的多视图,第 3 题标注管线的取景工具
压测、并发与网络接入
- MCProtocolLib:用真实协议栈造机器人,第 7 题“不能只用假人”的关键
- mineflayer · node-minecraft-protocol:快速搭出会跑图、会挖放的机器人集群
- k6 · Locust:压测框架,用来组织千人级别的请求与行为脚本
- frp · playit.gg · ZeroTier · Cloudflare Tunnel:学习 1 的内网穿透与公网暴露方案