Таблица рекордов 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 (примерно в координатах 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 не загружен, создание голограммы пропускается и в журнал записывается информационное сообщение.
Отображение результата забега в чате
После записи подходящего забега без отметки о читах игрок видит в чате десять лучших результатов своей категории. Выход и неудачная попытка Challenge не вызывают этот вывод. Собственная строка выделяется как > #N. При месте с 11-го по 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 | Время окончания забега в секундах с начала эпохи Unix (Instant.now().getEpochSecond()). Также используется при равенстве результатов. |
Старые записи, сделанные до этого разделения, при чтении автоматически помечаются как Challenge / Medium, чтобы старые таблицы рекордов продолжали отображаться.
Очистка таблицы рекордов
Внутриигровой команды для обнуления таблицы рекордов нет. Чтобы сбросить, остановите сервер и удалите plugins/MegaBlockSurvivors/leaderboard.yml.