Первый плагин#
За пять минут: проект, плагин, тест и установка на сервер без его перезапуска.
1. Проект#
amxpy init создаёт папку проекта:
my-plugins/
├─ plugins/hello.py пример плагина
├─ tests/test_hello.py тест к нему
├─ .vscode/ подсказки, проверка кода, задачи и сниппеты
└─ pyproject.toml где плагины и куда их ставить
Параметры --docker, --game и --port записываются в [tool.amxpy.server] — оттуда их берёт
amxpy deploy. Без Docker укажите только --game с локальным путём к cstrike. Подробнее —
Проект и деплой.
2. Плагин#
Плагин — обычный модуль Python с одним объектом Plugin. Откройте plugins/hello.py:
from amxpy import Config, Player, Plugin, cvar, events, sleep
plugin = Plugin("Hello", version="0.1.0")
class Settings(Config, prefix="hello_"):
delay: float = cvar(3.0, "Задержка приветствия, сек", min=0)
cfg = plugin.include(Settings())
@plugin.on(events.PutInServer)
async def greet(e: events.PutInServer) -> None:
player = e.player # событие живёт до первого await — игрока берём заранее
await sleep(cfg.delay)
player.print(f"!gПривет, !t{player.name}!y! Набери !g/hp")
@plugin.command("/hp", help="Показать здоровье")
def hp(player: Player) -> None:
player.print(f"HP: {player.health}, броня: {player.armor}")
Что здесь происходит:
Settings— группа cvar'ов: на сервере появитсяhello_delay, а вaddons/amxpy/configs/hello.cfg— строка с описанием. Подробнее — Настройки и cvar'ы.@plugin.on(events.PutInServer)— обработчик входа игрока. Он async:await sleep(...)ждёт, не задерживая кадр сервера, а если игрок выйдет раньше, задача отменится сама. Подробнее — События и Async и задачи.@plugin.command("/hp")— команда в чате. Первый параметр — игрок, который её написал; остальные аргументы amxpy разобрал бы по аннотациям. Подробнее — Команды.!g,!t,!y— цвета чата: зелёный, цвет команды, обычный.
3. Тест#
def test_greets_after_delay(server: FakeServer) -> None:
server.load(PLUGIN)
bob = server.join("Bob")
server.run(3.5) # виртуальные 3,5 секунды
assert "Привет, Bob" in bob.last_chat
Фикстура server — это сервер в памяти с тем же рантаймом amxpy: игроки, урон, раунды и время
в нём ненастоящие, а плагин — настоящий. Подробнее — Тестирование.
4. На сервер#
deploy проверяет и собирает плагин, кладёт пакет на сервер, дописывает его в plugins.ini и
загружает его по RCON — или перезагружает, если он уже работает. Игроки остаются на сервере.
Если новая версия не запустится, сервер вернёт прежнюю.
В VS Code — одной кнопкой
Над Plugin(...) есть кнопка «Установить на сервер», а Ctrl+Shift+B собирает проект
с переходом к ошибкам. Подробнее — VS Code.