MegaBlock Survivors 排行榜
MegaBlock Survivors 會將符合資格的比賽記錄到持久化排行榜,儲存於 plugins/MegaBlockSurvivors/leaderboard.yml。作弊的比賽(任何使用過 /mbs cheat 的場次)會被明確排除。
插件在新增成績前會讀取並驗證現有檔案。如果讀取失敗,會拒絕新成績,並顯示最後一次成功載入的記錄。儲存會以原子方式取代檔案;儲存失敗時保留原檔案,不套用新成績。請在伺服器日誌中檢查這些錯誤。
什麼會被記錄
每種模式只有一種結果會產生條目:
| 模式 | 記錄時機 | 不會記錄 |
|---|---|---|
| Challenge | 勝利(WORLD_4 中的最終首領死亡) | 中途死亡、退出或斷線 |
| 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 模式以擊敗最終首領為終點,因此比較通關時間。Endless 沒有終點,因此比較到達的最高波次。
由於 highestWave 來自經過的時間,波次相同的 Endless 紀錄存活時間也相近。其中較長的那一局排在前面。MegaBlock Survivors 每次讀取條目時都會重新排序,因此已經存在 leaderboard.yml 裡的紀錄也遵循這個順序。
世界內的全像投影
在 mbs_spawn 大廳世界中會生成一個 TextDisplay 全像投影(位於世界座標約 4.5, 67, -14.5)。該全像投影採用底部錨定 -- 文字的下緣始終位於錨點的 Y 座標,因此新增區段時顯示內容會向上延伸,而不是向下穿透地板。
全像投影最多會渲染六個區段(Challenge x {Easy, Medium, Hard},接著 Endless x {Easy, Medium, Hard})。沒有條目的區段會靜默略過,因此剛上線的全新伺服器不會顯示六個空分組。如果所有分組都是空的,則改為顯示一行「no highscores yet」。
全像投影會在以下情況自動維護:
- 插件啟用 / 重新載入時。
- 新增紀錄後,會更新現有顯示的文字。如果已追蹤的實體失效,就重新生成;如果從未生成過顯示,這次更新不會建立一個。
mbs_spawn中的錨點區塊重新載入時(Paper 在區塊卸載時會移除非持久顯示實體,因此監聽器會在大廳區塊再次出現時重新生成全像投影)。
如果 mbs_spawn 尚未載入,就略過生成全像投影,並記錄一則資訊訊息。
每場比賽的聊天顯示
符合資格且未標記作弊的比賽被記錄後,玩家會在聊天中看見該分組的前 10 名。退出或 Challenge 失敗不會顯示這份排行榜。玩家自己的列以 > #N 標示。排名為 11~100 時,會在省略號後顯示自己的排名;被排除在保留的前 100 筆之外的紀錄沒有排名列。
作弊獲勝時則會改為顯示「Leaderboard not updated (cheating detected)」的提示。
條目欄位
每筆條目記錄:
| 欄位 | 說明 |
|---|---|
playerName | 比賽結束時的 Bukkit 帳號名稱(Player.getName())。 |
playerUUID | 玩家的 UUID。 |
timeSeconds | 本場比賽的總時長,單位為秒。 |
kills | 本場比賽的擊殺總數。首領計入;幽靈大軍的生物不計(它們的獎勵已關閉,不給予擊殺計數)。 |
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。