组队最多 3 人
mc-server

MC腐竹养成记

伟大的万能腐竹就是这样的嘛!

网络优化后端分布式游戏开发产品

序章:运维之魂觉醒

我重生了,重生在我的世界与迷你世界一战之时
“像素方块的硬核才是王道😤 你的卡通画风根本没技巧🙄”
“萌趣的世界才受大众喜爱😊 你的硬核玩法早就被时代落败💀”
眼前,闹吃和古振兴正在互相吼着。你定了定神正准备说些什么,天空上一声惊雷响彻云端:“既然无法决出高下,便看看谁做的游戏开出的服务器人玩的最多吧!”

闹吃闻言转身看向你,你猛然回头,所有的记忆都涌入脑海:上一世,你因开服技艺不精,mc玩家在你那bug不断,卡到爆炸的服务器上失望至极,逐渐流失...

“可是这一世,我仍然只是个普通的mc玩家啊......”

就在你准备直接放弃之时,突然,一个飞行的土豆在你身后突然口吐人言:“恭喜您觉醒运维之魂,我是服务器机魂化身,这次将由我指导你开出完美的服务器”

”这次,我一定要打败古振兴,做出世界上最强的服务器!”

写在题目前面:

现在的大学生无不玩过mc,有许多人曾梦想过开一个大型mc服务器却还迟迟未行动过
本题旨在从0培养一名玩家成为一位合格的服务器技术,助力你在大学期间建立一座你的方块帝国。

由于涉及到冷门且深入的游戏技术,我将把这道二面题从零基础开始讲起,这道题可能也是极创二面题里唯一一个含大量简单内容的题目
但我相信,如果你搞明白了所有前置知识并尝试过挑战题,你所付出的工作量与所体现的能力并不会比选其他题目差(其实挑战题非常难)

在运维方面,很多东西是ai无法给出答案的。我们鼓励使用AI解题,但请务必搞清楚AI在干什么,原理是什么,要对你的玩家负责。正如我写这一篇题目没有使用任何AI代笔,我希望在大AI时代你也可以认认真真读完我的题目,而不是使用AI一键读题和生成答案(当然要用AI开发的地方一定要用AI,不要当原始人哦)

祝你们在开服体验中玩得愉快,学到东西

本题任务

本题将指导你开出一个多玩法、高性能、完全属于你原创的mc服务器,题目由多个小型题目组成,涵盖Java开发、逆向开发、mc研究、实体服务器运维、产品设计与游戏策划,推荐有一定的java基础的mc玩家做这道题

子题目将由 基础知识、小试牛刀、挑战题目 三大 模块组成,难度递增且紧密相关,建议逐个题目线性完成。前2个模块可以不做,如果有开服基础,请直接开始尝试挑战题目

点我直接跳转挑战题目

基础知识

服务器硬件选取

你应该知道的,任何游戏的服务器都得有一个硬件平台供服务器软件运行,mc服务器常见的有 实体机、VPS、内网穿透、面板服

服务器软件选取与学习

mc社区发展至今,各种各样的服务端撑起了mc庞大的服务器社群。除原版端外,他们大致分为插件端、模组端与混合端。作为立志开大服务器的你,应当选择以paper及其子分支为代表的插件端

在经过详尽调研后,我们选择1.21.11 purpur插件端作为我们的开始,作为优化较为齐全的paper分支,这对我们开大型服务器来说恰恰好

小试牛刀

我的世界,启动!

服务端优化

很显然,现在服里的玩家很少,你的服务端并不会产生卡顿,可是如果你的服里有50人,有100人怎么办?尝试给你的服务端调优,这在后面的挑战题里会有用

服务端升级

velocity管理子服好像非常好用,发现了吗,你可以在一个服务器里集成不同的玩法服务端!现在让我们按照velocity群组服框架开始实现一个不同功能的服务器吧

特性修复

如果你了解过生电,你一定会迫不及待地在你的服务器尝试制造一个生电机器——但很快就会发现好像诸如TNT复制一类的机器并不会奏效
那么,思考一下为什么吧!

新的物品,新的方块,新的功能,新的生物

一般来说,如果你开的不是纯净生存,你一般会想添加各种你所能想到的自定义物品。你可能会想到使用数据包来实现——但这实在是过时了,现在我来教你一些全新的东西

挑战题目

终于走到这里了...玩闹到此结束了,你已经学会了服务端的基本知识,现在开始挑战吧!

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回去,这会导致方块在被设置回去时发生更新从而出现各种问题
现在,要求你着手解决这个问题,使得回档可以就像复原某个时刻的存档一样

验收标准:使用coi回档一个炸膛的世吞,使其能够完好如初

Lv3

coi在长时间累加数据至数据库时,可能会导致数据库文件过大超出系统读取限制从而无法读取文件,使得数据被废弃;且过大的数据库文件会导致数据库查询时间非常长,玩家每次查询coi需要等二十分钟以上才可以得到结果

请你重新设计coi底层数据库逻辑,使得它可以按日/周/月等时间跨度或按大小自动将写入的数据库文件分开存放,并可以做到快捷读取
举例子:按周将数据存入不同的sqlite数据库,并可以快速读取所有的sqlite以提供快速的查询

Lv4

使用coi回档玩家背包时,常常会因为回档指定时间区间内只有玩家背包的变化,没有玩家变化前的原数据,导致背包被回档得乱七八糟

解决这个令人头疼的问题

3. 细致的建筑/红石机器 生成AI模型

你应该看到过关于GPT6做mc建筑的视频——让一个LLM模型去做建筑还是有点难为他了,现在我们希望你训练一个可以按照预期精细化建模的AI模型

我们现在拥有3万套收集好的投影文件,他们刚被收集还未被标注,请你从清洗与标注数据开始,逐步得到一个令人满意的建筑生成模型

Lv1

我们已经把建筑数据进行了初步清洗和格式统一,现在要求你将数据进行标注,使其具备以下特征:

  • 详细描述需要树化,例如一个城市投影,需要按基础地形/道路|区划/建筑/ 细分然后标注
  • 同时需要标注一份梗概描述,的是保证未来的模型输出具备可控性(梗概->详细描述由另一个专用模型完成以简化用户侧)
  • 具备一个快速标注的方案,使这3w套数据可以迅速落实标注

Lv2

使用标注好的数据训练一个建筑生成模型。我们已经通过一定的实验否定了扩散模型的可能,建议你训练时采用sft和rl两步策略,其中sft的监督数据集需要逆向轨迹合成算法来预搜索解,这需要一些高效并行方法,或者手工构造一些然后由rl自行探索

在不使用复杂的模型稀疏化技术时3D空间扩散的硬件开销对大型训练来说几乎无法接受,相比之下自回归生成性能更好,在轨迹预搜索的质量优良时尤其

祝你好运

Lv3

尝试让你的模型理解红石结构与相关逻辑,并尝试训练一个可以造机器的模型

4. 新一代基岩&Java互通方案

长期以往,geyser作为连接基岩和java玩家的桥梁,被数不胜数的服务器当作基石插件使用。可你一旦使用过就知道其bug众多,且问题大多很严重

我们在AI盛行时代前就对其进行深度分析和方案解构,认为其主要原因是糟糕的底层基石与协议翻译并不准确导致的。实际上,社区正需要一个完美的互通产品,取代geyser使基岩玩家可以无缝体验java版本的内容

我们基于对BDS(基岩版专用服务器)的长期研究,已经开发并开源了一套基岩版的协议库(https://github.com/SculkCatalystMC/Protocol),请你基于协议库,开发一套互通插件方案

Lv1

规划并开发核心框架,使得基岩版玩家可以正常进入java服务器游玩,且各项行为控制基本正常
在完成核心内容后,逐步优化基岩玩家的体验
至少做一个能进游戏的demo

Lv2

尝试制作让java玩家进入基岩版服务器的代理

Lv3

使你的互通代理可以精准翻译java服务器的资源包模型至be

5. Geyser资源包丝滑翻译器

如果你在看完第四题之后深入了解过geyser,你会发现他其实是可以把一定量的java资源包翻译到基岩版资源包的,但如果为java的资源包额外编写基岩资源包的话极为麻烦

现在需要你构建一个支持高版本的(至少1.21.11可以用的)全自动化翻译资源包的程序,它应当包含以下内容:

  • 对物品、方块的材质、模型等内容生成一份基岩版资源包
  • 生成一份供geyser调用的mapper清单
  • 尝试映射生物、家具或特殊模型实体的模型材质至基岩版
  • 尝试映射特殊动画至基岩版

最低验收标准:基岩版进服务器后可以看到自定义方块与物品与相关模型正常显示

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:跨平台的投影/结构格式约定

插件开发与底层研究

性能分析、优化与多线程

生态插件(对应实践题)

跨版本与基岩互通

行为日志、存档与数据库

建筑生成与 Agent 数据集

压测、并发与网络接入

出题人:Zhongzi8972