Форварды Pawn в Python#
@plugin.on_forward("имя") принимает форварды любого источника:
- Pawn-плагинов —
CreateMultiForward+ExecuteForward; - ядра AMXX —
client_putinserver,plugin_cfgи другие; - Python-плагинов — объявленные через
plugin.forward.
from amxpy import Player, Plugin, amxx, server
plugin = Plugin("Jail bridge")
@plugin.on_forward("jb_day_start")
def day_start(day: int, title: str, warden: Player | None) -> int:
server.print(f"!gДень {day}: !t{title}")
return 0 # ответ форварда
@plugin.on_forward("jb_give_money")
def give_money(player: Player, amount: amxx.Ref) -> None:
amount.value *= 2 # параметр по ссылке вернётся в Pawn
Аргументы и ответ#
Аргументы разбираются по аннотациям:
| Аннотация | Pawn |
|---|---|
int, bool |
ячейка |
float |
Float: |
str |
строка |
Player / Player \| None |
индекс игрока; None — 0 или вышедший игрок |
amxx.Ref / amxx.FloatRef |
параметр по ссылке: .value вернётся в Pawn |
| без аннотации | число |
Возвращённое число — ответ форварда (PLUGIN_HANDLED = 1). Если подписчиков несколько,
Pawn получит наибольший ответ.
Со следующей карты#
Форварды Pawn и ядра доходят до Python через плагин-приёмник
addons/amxmodx/plugins/amxpy_forwards.amxx: amxpy генерирует его сам, с public на каждое
имя подписки, и подключает через configs/plugins-amxpy.ini.
Новая подписка работает со следующей карты
AMXX загружает плагины при смене карты. Добавили @plugin.on_forward("x") и поставили
плагин на сервер — форвард x начнёт приходить после смены карты. Форварды других
Python-плагинов приходят сразу.
В тестах#
def test_day_start(server: FakeServer) -> None:
server.load("plugins/jail_bridge.py")
server.change_map() # приёмник загружается с картой
assert server.pawn_forward("jb_day_start", 3, "Свободный день", 0) == 0
server.pawn_forward ведёт себя как ExecuteForward в Pawn-плагине; amxx.Ref и
amxx.FloatRef после вызова содержат то, что записал Python.