Skip to content

Горячая перезагрузка и замеры времени ​

Измените мод и увидите результат без перезапуска мира. Администраторы сервера также видят, какие моды сколько времени тратят. Эта страница для владельцев серверов и для авторов модов.

Предварительная версия

Горячая перезагрузка и /mods timings есть в сборках для разработки Blockheads Server и PC-версии.

Команды администратора ​

На сервере команду /mods могут использовать администраторы (в игровом чате) и консоль:

КомандаЧто делает
/modsпоказывает моды и их состояние
/mods reloadперезагружает каждый мод, чьи файлы изменились, запускает новые и останавливает моды, чьих файлов больше нет
/mods reload <id>перезагружает этот мод, изменился он или нет
/mods timings [id]показывает, сколько длился каждый вид вызовов за последние 60 секунд
/mods timings reset [id]сбрасывает эти числа

/mods встроена: ни один мод не может занять это имя, а игроки, не являющиеся администраторами, получают «You do not have permission».

Что делает перезагрузка ​

Для каждого перезагружаемого мода:

  1. Пакет читается заново (файл .bhmod или распакованная папка, а также mods.toml). Если новая версия не может даже запуститься, старая продолжает работать, а команда пишет причину.
  2. Старая версия получает on-disable. Всё, что она зарегистрировала, удаляется: обработчики событий, команды, таймеры, сервисы, каналы. Её хранилище сохраняется.
  3. Новая версия стартует как при запуске сервера: сохранённые данные на месте, выполняется on-enable, затем (только этому моду) приходит world-loaded.
  4. Счётчик сбоев и замеры времени начинаются с нуля.

Мир, игроки и все остальные моды продолжают работать.

Полезно знать:

  • Если новая версия падает в on-enable (например, опечатка), мод остаётся выключенным, а команда показывает ошибку. Исправьте файл и снова выполните /mods reload <id>.
  • Игроки, которые уже в сети, перезагруженному моду заново не объявляются. Если мод следит за игроками, прочитайте игроков в сети в on-enable.
  • Сервис, полученный другим модом через bh.services.get до перезагрузки, после неё устаревает. Вызов завершится ошибкой stale service handle … call services.get again. Получите сервис заново или вызывайте по имени через bh.services.call, который всегда находит новую версию.
  • Контент (косметика, предметы, блоки) и нативный код не перезагружаются. Нужен перезапуск сервера (на клиенте — новая игровая сессия).
  • Java-моды получают новый загрузчик классов. Потоки, которые Java-мод запустил сам, нужно остановить в on-disable.
  • Уже подключённые клиенты сохраняют клиентскую часть, которая у них есть. Игрокам, которые зайдут позже, предложат новую.

Перезагрузка во время разработки ​

На сервере задайте BLOCKHEADS_MODS_WATCH=1. Сервер примерно два раза в секунду проверяет папку модов и перезагружает изменившееся, как только файлы перестают меняться. В логе появится watch: my-mod: reloaded (0.1.0 -> 0.1.1) или причина сбоя. Укажите в BLOCKHEADS_MODS_DIR папку, в которой лежит ваша распакованная папка мода (подойдёт папка с mod.toml внутри), и редактируйте.

В PC-версии включите режим разработчика и добавьте папку мода в лаунчере. Лаунчер перезагружает её при изменении файлов, а F5 в игре делает это вручную. Перезапускаются только изменившиеся моды; вы остаётесь в мире.

Замеры времени ​

/mods timings отвечает на вопрос «этот мод замедляет мой сервер?»:

text
Mod timings over the last 60 s (times in ms, inclusive of nested calls):
landclaim [enabled]: 412 calls, 18.40 ms total, 3 budget hits, strikes 0 now / 0 since reset
  event: 380 calls, total 15.10, avg 0.04, max 2.10, over soft 0, timeouts 0, errors 0
  command: 4 calls, total 1.90, avg 0.48, max 0.90, over soft 0, timeouts 0, errors 0
  task: 28 calls, total 1.40, avg 0.05, max 6.20, over soft 3, timeouts 0, errors 0
  • Виды: event (игровые и свои события), command, task (таймеры), service (вызовы в мод от других модов или от другой стороны), channel (сообщения), lifecycle (on-enable и on-disable).
  • avg и max считаются на один вызов. Время вызова включает время модов, которые он вызвал.
  • over soft считает вызовы дольше 5 мс (предупреждение в логе), timeouts — вызовы, остановленные на 25 мс, errors — вызовы, закончившиеся ошибкой.
  • strikes — сбои, которые приближают отключение мода (3 за 60 с). reset очищает отчёт, но не прощает сбои.

В PC-версии откройте панель модов клавишей F9 и нажмите T, чтобы увидеть те же числа (R или кнопка «Reset» сбрасывает их, повторное T возвращает журнал).

Для авторов: числа берутся из bhmod-core (docs/hot-reload.md), поэтому сервер, PC-версия и Android-загрузчик отчитываются одинаково.

Неофициальный проект сообщества. Не связан с Majic Jungle Software или Noodlecake. Файлы игры не включены.