Таблица рекордов MegaBlock Survivors
MegaBlock Survivors записывает подходящие забеги в постоянную таблицу рекордов, хранящуюся в plugins/MegaBlockSurvivors/leaderboard.yml. Читерские забеги (любой матч, в котором использовалась /mbs cheat) явно исключаются.
Что попадает в запись
Только один исход в каждом режиме создаёт запись:
| Режим | Записывается при | Не записывается |
|---|---|---|
| Challenge | Победе (финальный босс в WORLD_4 погибает) | Смерть посреди забега или выход |
| Endless | Смерти (в Endless нет пути к победе) | Выход |
Провалившаяся попытка в Challenge не попадает в рейтинг. Читерские забеги пропускаются в обоих режимах.
Категории
Каждая запись несёт теги режима игры и сложности, поэтому таблица рекордов разделена на 6 независимых корзин:
| Режим | Сложность |
|---|---|
| Challenge | Easy |
| Challenge | Medium |
| Challenge | Hard |
| Endless | Easy |
| Endless | Medium |
| Endless | Hard |
Корзины ранжируются независимо, и каждая корзина хранит на диске до 100 записей. Игрокам показывается верхние 10.
Правила ранжирования
| Режим | Основная сортировка | Тай-брейкер |
|---|---|---|
| Challenge | Самое быстрое время прохождения (по возрастанию) | При равенстве выигрывают более новые записи |
| Endless | Наивысшая достигнутая волна (по убыванию) | Время выживания (длиннее — лучше), затем временная метка |
Такое разделение логично, поскольку у режима Challenge есть фиксированная конечная точка (финальный босс), так что «самое быстрое прохождение» — очевидная метрика мастерства. У Endless конца нет, поэтому осмысленный показатель — «наивысшая достигнутая волна».
Голограмма в мире
В мире лобби mbs_spawn (примерно в координатах 4.5, 67, -14.5) появляется одна голограмма TextDisplay. Голограмма привязана нижним краем — нижняя кромка текста всегда находится на якорном Y, так что добавление новых секций наращивает дисплей вверх, а не вниз сквозь пол.
Голограмма отрисовывает до шести секций (Challenge × {Easy, Medium, Hard}, затем Endless × {Easy, Medium, Hard}). Секции с нулевым числом записей молча пропускаются, чтобы свежий сервер не показывал шесть пустых корзин. Если все корзины пусты, вместо этого показывается одна строка «no highscores yet».
Голограмма автоматически респавнится:
- При включении / перезагрузке плагина.
- После каждой новой записи в таблице рекордов.
- Когда якорный чанк в
mbs_spawnперезагружается (Paper удаляет non-persistent display-сущности при выгрузке чанка, поэтому слушатель респавнит голограмму при каждом возвращении чанка лобби).
Если mbs_spawn отсутствует на диске, голограмма молча пропускается, а в лог пишется WARN.
Отображение результата забега в чате
Когда заканчивается не-читерский забег, игрок видит топ-10 своей корзины в виде блока в чате. Строка самого игрока выделена (> #N). Если ранг игрока вне топ-10, показывается строка с многоточием, а за ней — строка с его фактическим рангом.
Читерские победы вместо этого показывают уведомление «Leaderboard not updated (cheating detected)».
Схема записи
Каждая запись содержит:
| Поле | Описание |
|---|---|
playerName | Отображаемое имя Bukkit на момент окончания забега. |
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.