Горячая перезагрузка и замеры времени
Измените мод и увидите результат без перезапуска мира. Администраторы сервера также видят, какие моды сколько времени тратят. Эта страница для владельцев серверов и для авторов модов.
Предварительная версия
Горячая перезагрузка и /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».
Что делает перезагрузка
Для каждого перезагружаемого мода:
- Пакет читается заново (файл
.bhmodили распакованная папка, а такжеmods.toml). Если новая версия не может даже запуститься, старая продолжает работать, а команда пишет причину. - Старая версия получает
on-disable. Всё, что она зарегистрировала, удаляется: обработчики событий, команды, таймеры, сервисы, каналы. Её хранилище сохраняется. - Новая версия стартует как при запуске сервера: сохранённые данные на месте, выполняется
on-enable, затем (только этому моду) приходитworld-loaded. - Счётчик сбоев и замеры времени начинаются с нуля.
Мир, игроки и все остальные моды продолжают работать.
Полезно знать:
- Если новая версия падает в
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 отвечает на вопрос «этот мод замедляет мой сервер?»:
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-загрузчик отчитываются одинаково.