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

Тестирование#

amxpy.testing — сервер в памяти с тем же рантаймом amxpy и виртуальным временем. Фикстура pytest server подключается сама после установки amxpy. Руководство: Тестирование.

FakeServer #

FakeServer(
    *,
    game_dir: str | Path | None = None,
    max_players: int = 32,
    map_name: str = "de_dust2",
    fps: int = 100,
)

Сервер в памяти: тот же рантайм amxpy, но бэкенд — словари, а время — виртуальное.

lines #

lines: list[str]

Консоль и журнал сервера.

forwards #

forwards: list[tuple[str, tuple[Any, ...]]]

Форварды, отправленные Pawn-плагинам: (имя, аргументы).

load #

load(source: str | Path, *, cvars: dict[str, Any] | None = None) -> PluginInstance

Скомпилировать плагин amxpyc и загрузить его (как на сервере после старта карты).

reload #

reload(name: str, source: str | Path | None = None) -> bool

Пересобрать плагин из исходника и перезагрузить его на лету.

frame #

frame() -> None

Один кадр: выполнить отложенные серверные команды и прокачать рантайм.

run #

run(seconds: float = 0.0) -> None

Прокрутить seconds секунд виртуального времени (минимум один кадр).

settle #

settle(timeout: float = 5.0) -> None

Досчитать последствия: задачи asyncio и offload(), не двигая время.

join #

join(
    name: str,
    *,
    steam_id: str | None = None,
    team: Team | int = Team.CT,
    flags: str | int = "",
    ip: str = "127.0.0.1",
    bot: bool = False,
    alive: bool = True,
    health: float = 100,
    armor: float = 0,
    money: int = 800,
    lang: str = "",
    authorize: bool = True,
) -> FakePlayer

Подключить игрока: Connect → PutInServer → (на следующем кадре) Authorized.

spawn #

spawn(player: FakePlayer) -> bool

Возродить игрока; False — плагин отменил.

damage #

damage(
    victim: FakePlayer,
    amount: float,
    *,
    attacker: FakePlayer | None = None,
    damage_type: int = DMG_BULLET,
) -> float

Нанести урон; возвращает нанесённый урон (после плагинов).

change_map #

change_map(map_name: str = 'de_dust2') -> None

Смена карты: MapEnd, AMXX заново грузит плагины (в т.ч. приёмник форвардов), MapStart.

pawn_forward #

pawn_forward(name: str, *args: Any) -> int

Pawn-плагин выполнил форвард name (ExecuteForward): вернуть итог подписчиков amxpy.

int/bool/Player — ячейка, float — Float:, str — строка в памяти AMX, Ref/FloatRef — параметр по ссылке: после вызова в .value то, что записал Python. Форвард доходит, только если плагин-приёмник с ним загружен — с карты после подписки.

choose_team #

choose_team(player: FakePlayer, slot: int) -> bool

Выбрать команду в меню: 1 — T, 2 — CT, 5 — авто, 6 — зрители; False — плагин не пустил.

give_money #

give_money(
    player: FakePlayer,
    amount: int,
    reason: MoneyReason | int = MoneyReason.NONE,
    *,
    track: bool = True,
) -> int

Начислить (или списать) деньги, как игра; возвращает итоговое изменение после плагинов.

buy #

buy(player: FakePlayer, weapon: str, *, price: int = 0) -> bool

Купить оружие (без префикса weapon_); False — плагин запретил.

drop #

drop(player: FakePlayer, item: str) -> bool

Выбросить предмет; False — плагин не дал.

rename #

rename(player: FakePlayer, name: str) -> bool

Сменить ник; False — плагин оставил старый.

throw_grenade #

throw_grenade(player: FakePlayer, weapon: str = 'hegrenade') -> int

Бросить гранату; возвращает индекс сущности гранаты.

plant_bomb #

plant_bomb(player: FakePlayer) -> int

Заложить бомбу; возвращает индекс её сущности.

defuse #

defuse(player: FakePlayer, *, kit: bool = False, success: bool = True) -> bool

Начать разминирование и закончить его (успешно или нет); False — плагин не дал начать.

console #

console(line: str) -> None

Строка в серверной консоли (как rcon).

amxx_native #

amxx_native(name: str) -> Callable[[Callable[..., Any]], Callable[..., Any]]

Подставить натив AMXX для amxx.call(...) плагина.

Функция получает аргументы по порядку: числа, float и строки — как есть, выходные (String, Ref, Array...) — объектом с .value. Исключение в ней — ошибка натива (NativeError у плагина).

@server.amxx_native("get_user_name")
def get_user_name(index, name, size):
    name.value = server.backend.clients[index].name
    return len(name.value)

native #

native(name: str, *args: Any) -> Any

Вызвать натив плагина так, как его вызвал бы Pawn-плагин.

FakePlayer #

FakePlayer(server: FakeServer, index: int, userid: int)

Игрок фейкового сервера со стороны теста.

handle #

handle: Player | None

Хэндл игрока в рантайме (то, что получают плагины).

menu #

menu: str | None

Меню на экране без кодов цвета, или None.

select #

select(key: int) -> bool

Нажать в меню клавишу 1–9 или 0; меню на экране закрывается, как у клиента.

say #

say(text: str) -> bool

Написать в чат; True — сообщение скрыто плагином (команда или cancel).

command #

command(line: str) -> bool

Команда в консоли игрока; True — её обработал плагин.

ConnectionRejected #

Плагин не пустил игрока (Connect.reject()).