Перейти к основному содержимому

Таблица рекордов MegaBlock Survivors

MegaBlock Survivors записывает подходящие забеги в постоянную таблицу рекордов, хранящуюся в plugins/MegaBlockSurvivors/leaderboard.yml. Читерские забеги (любой матч, в котором использовалась /mbs cheat) явно исключаются.

Перед добавлением результата плагин читает и проверяет существующий файл. При ошибке чтения новый результат отклоняется, а игрокам показываются последние успешно загруженные записи. Сохранение атомарно заменяет файл; при ошибке прежний файл сохраняется, а новый результат не применяется. Проверяйте такие ошибки в журнале сервера.

Что попадает в запись​

Только один исход в каждом режиме создаёт запись:

РежимЗаписывается приНе записывается
ChallengeПобеде (финальный босс в WORLD_4 погибает)Смерть посреди забега, выход или отключение
EndlessСмерти (в Endless нет пути к победе)Выход или отключение

Забег Challenge, закончившийся смертью, не попадает в рейтинг. Забеги с отметкой /mbs cheat пропускаются в обоих режимах. Однако /mbs skipworld сейчас не требует разрешения и не ставит эту отметку. Фильтр не подтверждает, что каждый результат получен при обычном прохождении миров.

Категории​

Каждая запись содержит режим игры и сложность, поэтому таблица рекордов разделена на 6 независимых категорий:

РежимСложность
ChallengeEasy
ChallengeMedium
ChallengeHard
EndlessEasy
EndlessMedium
EndlessHard

Категории сортируются независимо. Каждая хранит на диске до 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()) на момент окончания забега.
playerUUIDUUID игрока.
timeSecondsОбщая длительность забега в секундах.
killsОбщее число убийств за забег. Боссы засчитываются; мобы армии призраков — нет (у них отключены награды, и они не дают зачёта убийства).
levelФинальный уровень игрока.
highestWaveУровень волны на момент окончания забега — max(1, secondsSurvived / 36). Основной показатель для Endless.
gameModeCHALLENGE или ENDLESS.
difficultyEASY, MEDIUM или HARD.
timestampВремя окончания забега в секундах с начала эпохи Unix (Instant.now().getEpochSecond()). Также используется при равенстве результатов.

Старые записи, сделанные до этого разделения, при чтении автоматически помечаются как Challenge / Medium, чтобы старые таблицы рекордов продолжали отображаться.

Очистка таблицы рекордов​

Внутриигровой команды для обнуления таблицы рекордов нет. Чтобы сбросить, остановите сервер и удалите plugins/MegaBlockSurvivors/leaderboard.yml.