Plugin и Router#
Plugin — корень плагина, Router — набор объявлений модуля. Всё, что умеет Router,
доступно и у Plugin. Руководство: Плагин и модули.
Plugin
#
Plugin(
name: str,
*,
version: str = "0.0.0",
author: str = "",
description: str = "",
url: str = "",
)
Корень плагина: название, версия, автор и все объявления.
В пакете плагина создаётся ровно один Plugin(...); другие модули
объявляют обработчики в своих Router и подключаются через
include.
Параметры#
name— название вamxpy listи логах.version— версия плагина.author— автор.description— краткое описание.url— страница плагина.
Пример#
plugin = Plugin("VIP", version="1.2.0", author="you")
cfg = plugin.include(Settings(), perks.router)
config_file
#
Файл настроек плагина на сервере: addons/amxpy/configs/<плагин>/<name>.
Если файла нет, он создаётся с текстом default — общий отступ и первая пустая
строка убираются. Существующий файл не перезаписывается никогда: ни при перезагрузке,
ни при amxpy deploy — это файл владельца сервера. Формат любой, читайте его сами
(configparser, tomllib, json), лучше в events.Init или events.MapStart.
Параметры#
name— имя файла в папке плагина, можно с подпапкой:texts/ru.txt.default— содержимое нового файла.
Возвращает#
Путь к файлу (pathlib.Path).
Исключения#
ValueError— путь выходит за папку плагина.
Пример#
keep
#
Сохранить значение на время горячей перезагрузки (должно поддерживать pickle).
Новая версия плагина получит его через kept — в том числе при импорте
модуля. Вызывать можно в любой момент, в том числе в on_unload (в async-колбэке —
до первого await). Данные игроков проще хранить в PlayerState(keep=True).
Пример#
Router
#
Набор объявлений модуля: обработчики, команды, нативы, форварды, задачи.
Большой плагин делится на модули: в каждом свой Router(), а корневой
Plugin подключает их через include. Декораторы только
записывают объявления — регистрирует их рантайм при загрузке плагина.
Пример#
router = Router()
@router.command("/hp")
def hp(player: Player) -> None:
player.print(f"HP: {player.health}")
on
#
on(
event: type[E], *, post: bool | None = None, priority: int = 0, **filters: Any
) -> HandlerDecorator[E]
Обработчик события.
В pre-фазе (по умолчанию) обработчик может менять изменяемые поля,
отменить действие игры через e.cancel() или вернуть значение — ответ
за игру. В post-фазе событие уже случилось: только чтение. Async-обработчик
видит событие до первого await — нужные поля скопируйте заранее.
Параметры#
event— класс события изamxpy.events.post—True— после действия игры,False— до; по умолчанию — первая фаза события (pre, а у событий только с post-фазой, какFreezeEnd, — post).priority— больше — раньше среди обработчиков этого события.**filters—поле=значение— вызывать только при совпадении поля.
Исключения#
TypeError— у события нет такой фазы или полей для фильтра.
Пример#
command
#
command(
*names: str,
access: Access | int = Access.NONE,
help: str = "",
cooldown: float = 0.0,
hide: bool = True,
) -> CommandDecorator
Команда игрока: /name или !name — в чате, иначе — в консоли.
Первый параметр обработчика — игрок, вызвавший команду. Остальные
аргументы разбираются по аннотациям: str, int, float, bool,
Player (по нику, #userid или SteamID), Enum, Literal[...],
X | None; *rest: str забирает остаток строки. Usage и сообщения
об ошибках строятся сами: amx_heal <target> [amount].
Параметры#
*names— имена команды; несколько — синонимы ("/hp", "!hp").access— нужные флаги доступа; без них игрок получит отказ.help— описание для списка команд.cooldown— секунд между вызовами одним игроком.hide— не показывать чат-команду в чате.
Пример#
server_command
#
Команда серверной консоли и rcon (без игрока).
Аргументы разбираются по аннотациям, как у command.
Пример#
native
#
Натив для Pawn-плагинов; сигнатура берётся из аннотаций.
Типы параметров: int, float, bool, str, Player; результат —
они же или None. Натив попадает в сгенерированный <плагин>.inc
вместе с docstring; новый натив или смена сигнатуры доступны Pawn после
рестарта сервера. Натив не может быть async: Pawn ждёт ответ сразу.
Пример#
forward
#
on_forward
#
Подписка на форвард по имени: Python-плагина, Pawn-плагина или самого AMXX.
Форварды Pawn (CreateMultiForward + ExecuteForward) и форварды ядра
(client_putinserver...) доходят через плагин-приёмник amxpy_forwards.amxx,
который AMXX загружает с каждой картой: новая подписка начинает работать со
следующей карты. Аргументы разбираются по аннотациям: int, bool,
float, str, Player; amxx.Ref/amxx.FloatRef — параметр по
ссылке, его .value вернётся в Pawn. Без аннотации — число.
Возвращённое число — ответ форварда (PLUGIN_HANDLED = 1); из нескольких
подписчиков берётся наибольший.
Пример#
every
#
spawn
#
Запустить фоновую задачу плагина.
Задача отменяется при выгрузке или перезагрузке плагина; запущенная из обработчика игрока — ещё и при его выходе.
Пример#
wait_for
#
wait_for(
event: type[E],
*,
check: Callable[[E], bool] | None = None,
timeout: float | None = None,
) -> E