MegaBlock Survivors リーダーボード
MegaBlock Survivors は、条件を満たしたランを plugins/MegaBlockSurvivors/leaderboard.yml に保存される永続的なリーダーボードに記録します。チート利用のラン (/mbs cheat が使用された試合) は明示的に除外されます。
プラグインは結果を追加する前に既存のファイルを読み込み、検証します。読み込みに失敗した場合、新しい結果は受け付けず、最後に正常に読み込めた記録を表示します。保存はファイルをアトミックに置き換えます。保存に失敗した場合は以前のファイルを保持し、新しい結果を反映しません。これらのエラーはサーバーログで確認してください。
記録される条件
各モードでエントリが作成されるのは、1 つの結果だけです:
| モード | 記録されるタイミング | 記録されないケース |
|---|---|---|
| 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 に揃うため、新しいセクションが追加されると表示は下方向に床を突き抜けるのではなく上方向に伸びていきます。
ホログラムは最大 6 セクション (Challenge x {Easy, Medium, Hard}、続いて Endless x {Easy, Medium, Hard}) を描画します。エントリが 0 件のセクションは静かにスキップされる ため、新しいサーバーで空のバケットが 6 つ並ぶことはありません。すべてのバケットが空の場合は、単一の「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 | ランの総撃破数。ボスは含まれますが、ゴーストアーミーのモブは含まれません (報酬が無効化されており、撃破数にも計上されません)。 |
level | プレイヤーの最終レベル。 |
highestWave | ラン終了時のウェーブレベル -- max(1, secondsSurvived / 36)。Endless の主ステータス。 |
gameMode | CHALLENGE または ENDLESS。 |
difficulty | EASY、MEDIUM、または HARD。 |
timestamp | ラン終了時のエポック秒 (Instant.now().getEpochSecond())。タイブレーカーのキーとしても使用されます。 |
この分割が導入される前のレガシーエントリは、読み込み時に自動的に Challenge / Medium のタグが付与され、古いリーダーボードも引き続き描画されます。
リーダーボードの消去
リーダーボードを消去するゲーム内コマンドはありません。リセットするには、サーバーを停止し plugins/MegaBlockSurvivors/leaderboard.yml を削除してください。