MegaBlock Survivors 排行榜
MegaBlock Survivors 会把符合条件的对局记录到持久化排行榜中,存储位置为 plugins/MegaBlockSurvivors/leaderboard.yml。作弊对局(任何使用过 /mbs cheat 的对局)会被明确排除。
插件在添加成绩之前会读取并验证现有文件。如果读取失败,会拒绝新成绩,并显示最后一次成功加载的记录。保存会以原子方式替换文件;保存失败时保留原文件,不应用新成绩。请在服务器日志中检查这些错误。
哪些情况会被记录
每种模式只有一种结局会产生条目:
| 模式 | 记录时机 | 不予记录 |
|---|---|---|
| Challenge | 胜利(WORLD_4 中的最终 Boss 死亡) | 中途死亡、退出或断开连接 |
| Endless | 死亡(Endless 没有胜利路径) | 退出或断开连接 |
以死亡告终的 Challenge 对局不会上榜。被 /mbs cheat 标记的对局在两种模式下都会被跳过。不过,当前 /mbs skipworld 不要求权限,也不设置该标记,因此排行榜过滤不能证明所有上榜对局都经过了正常的世界进度。
类别
每条记录都包含游戏模式与难度,因此排行榜分为 6 个相互独立的类别:
| 模式 | 难度 |
|---|---|
| Challenge | Easy |
| Challenge | Medium |
| Challenge | Hard |
| Endless | Easy |
| Endless | Medium |
| Endless | Hard |
各类别独立排名,每类在磁盘上最多保留 100 条记录,向玩家展示前 10 名。
排名规则
| 模式 | 主要排序 | 平局判定 |
|---|---|---|
| Challenge | 通关时间最短(升序) | 新条目在平局时胜出 |
| Endless | 到达波次最高(降序) | 生存时间更长的排名更高,仍相同则较新的记录优先 |
Challenge 模式以击败最终 Boss 为终点,因此比较通关时间。Endless 没有终点,因此比较到达的最高波次。
由于 highestWave 来自经过的时间,波次相同的 Endless 记录存活时间也相近。其中用时较长的对局排在前面。MegaBlock Survivors 每次读取条目时都会重新排序,因此 leaderboard.yml 中已保存的对局也遵循这一顺序。
世界内全息图
会在 mbs_spawn 大厅世界中生成一个单一的 TextDisplay 全息图(世界坐标约 4.5, 67, -14.5)。该全息图采用底部对齐——文本的底边始终位于锚点 Y 上,因此新增段落会让显示内容向上扩展,而不是穿过地板向下延伸。
全息图最多渲染六段内容(Challenge × {Easy, Medium, Hard},随后是 Endless × {Easy, Medium, Hard})。没有任何条目的段落会被静默跳过,这样全新的服务器就不会显示六个空桶。如果全部分桶都为空,则只显示一行「no highscores yet」。
全息图会在以下情形自动维护:
- 插件启用 / 重载时。
- 新增记录后,会更新现有显示的文本。如果已跟踪的实体失效,则重新生成;如果从未生成过显示,这次更新不会创建一个。
mbs_spawn中的锚点区块重新加载时(Paper 会在区块卸载时移除非持久化的 display 实体,因此监听器会在大厅区块每次重新加载时重新生成全息图)。
如果 mbs_spawn 未加载,则跳过生成全息图,并记录一条信息日志。
单场对局的聊天展示
符合条件且未标记作弊的对局被记录后,玩家会在聊天中看到该类别的前 10 名。退出或 Challenge 失败不会显示这份排行榜。玩家自己的行以 > #N 高亮。排名为 11~100 时,会在省略号后显示自己的排名;被排除在保留的前 100 条之外的记录没有排名行。
作弊获胜则会改为显示「Leaderboard not updated (cheating detected)」提示。
条目结构
每条条目会记录:
| 字段 | 描述 |
|---|---|
playerName | 对局结束时的 Bukkit 账户名(Player.getName())。 |
playerUUID | 玩家的 UUID。 |
timeSeconds | 对局总时长(秒)。 |
kills | 本场对局的总击杀数。Boss 计入;幽灵大军的怪物不计入(它们被禁用了奖励,不提供击杀计数)。 |
level | 玩家最终等级。 |
highestWave | 对局结束时的波次等级 —— max(1, secondsSurvived / 36)。Endless 的主要指标。 |
gameMode | CHALLENGE 或 ENDLESS。 |
difficulty | EASY、MEDIUM 或 HARD。 |
timestamp | 对局结束时的 epoch 秒数(Instant.now().getEpochSecond())。同时用作平局判定键。 |
此次切分之前的旧条目在读取时会自动打上 Challenge / Medium 标签,因此旧排行榜仍能正常渲染。
清空排行榜
游戏内没有用于清空排行榜的指令。如需重置,请停止服务器并删除 plugins/MegaBlockSurvivors/leaderboard.yml。