Перейти к содержанию

Горячая перезагрузка#

amxpy deploy или amxpy reload <плагин> меняют плагин на работающем сервере: игроки остаются, карта не перезапускается.

Что происходит#

  1. Старая версия получает Unload с reason="reload", вызываются @plugin.on_unload.
  2. Сохраняется состояние: PlayerState(keep=True) и значения plugin.keep(...) (см. ниже).
  3. Задачи старой версии отменяются, обработчики, команды и меню снимаются.
  4. Загружается новая версия: Init приходит с e.hot_reload = True.
  5. Если новая версия упала при запуске, возвращается старая — с тем же состоянием.

Что переживает перезагрузку#

vips: PlayerState[Vip] = PlayerState(keep=True)

PlayerState(keep=True) переносится через pickle. Новая версия находит его по адресу «модуль:имя переменной» — переименуете переменную, данные не найдутся.

current_round = plugin.kept("round", 0)       # то, что сохранила старая версия


@plugin.on_unload
def save() -> None:
    plugin.keep("round", current_round)       # должно поддерживать pickle

kept() работает и на уровне модуля, как в примере. В async-колбэке on_unload вызывайте keep() до первого await.

Всё остальное — обычные глобальные переменные модулей — создаётся заново.

Когда нужен рестарт сервера#

Нативы Pawn-плагинов привязываются только при старте сервера. Поэтому:

  • новый натив заработает в Pawn после рестарта;
  • смена сигнатуры натива — перезагрузка будет отклонена с сообщением native … changed its signature в логе, старая версия продолжит работать.

Тело натива и всё остальное можно менять на лету.

Режимы#

amxpy_hotreload
0 перезагрузка выключена
1 по команде amxpy reload и amxpy deploy (по умолчанию)
2 ещё и сама, когда файл пакета на сервере изменился

Проверить в тесте#

def test_kills_survive_reload(server: FakeServer) -> None:
    server.load("plugins/stats.py")
    bob = server.join("Bob")
    ...
    assert server.reload("stats")            # пересобрать и перезагрузить из исходника

Подробнее — Тестирование.