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

Игроки#

Руководство: Игроки и сервер.

Player #

Player(host: Host, index: int, userid: int)

Хэндл игрока: слот + userid подключения.

На одно подключение — один объект: события, команды и нативы отдают его же, поэтому игрока можно класть в словари и сравнивать через is. После выхода игрока любое обращение к нему — StaleHandleError, а не действие над тем, кто занял его слот. Данные плагина по игрокам удобно хранить в PlayerState.

Пример#
player.print(f"!gПривет, !t{player.name}")
player.health += 25
if player.team == Team.CT and player.has_access(Access.KICK): ...

connected #

connected: bool

Игрок всё ещё на сервере. После выхода любое обращение к хэндлу — StaleHandleError.

name #

name: str

Ник игрока.

steam_id #

steam_id: str

SteamID (STEAM_0:1:123); до события Authorized может быть пустым или STEAM_ID_PENDING.

ip #

ip: str

IP-адрес без порта.

bot #

bot: bool

Бот (fake client).

alive #

alive: bool

Жив ли игрок сейчас.

team #

team: Team

Команда: Team.T, Team.CT, Team.SPECTATOR или Team.UNASSIGNED.

flags #

flags: Access

Флаги доступа администратора (users.ini); проверка — has_access.

language #

language: str

Язык игрока (setinfo lang), иначе язык сервера (amx_language).

health #

health = _Prop('health', int)

Здоровье; можно менять: player.health += 25.

armor #

armor = _Prop('armor', int)

Броня (0–255); можно менять.

frags #

frags = _Prop('frags', int)

Фраги на табло; можно менять.

deaths #

deaths = _Prop('deaths', int)

Смерти на табло; можно менять.

money #

money = _Prop('money', int)

Деньги ($0–16000); можно менять.

info #

info(key: str) -> str

Значение setinfo игрока: player.info("_vgui_menus").

print #

print(text: str) -> None

Сообщение в чат игроку.

Теги цвета: !g — зелёный, !t — цвет команды, !y — обычный.

Пример#
player.print(f"!gVIP!y активен ещё !t{days}!y дней")

console #

console(text: str) -> None

Строка в консоль игрока (~).

center #

center(text: str) -> None

Текст по центру экрана; для оформленного текста — amxpy.Hud.

command #

command(command: str) -> None

Выполнить команду в консоли игрока (client_cmd).

Клиент может запретить часть команд (cl_filterstuffcmd).

Пример#
player.command("spk buttons/bell1")

kick #

kick(reason: str = '') -> None

Кикнуть игрока; reason он увидит в сообщении об отключении.

Пример#
player.kick("Запрещённый ник")

tr #

tr(key: str, **params: Any) -> str

Перевод из lang/<язык>.toml плагина на языке игрока.

Порядок поиска: язык игрока → en → любой файл → сам ключ.

Пример#
# lang/ru.toml:  welcome = "Привет, {name}!"
player.print(player.tr("welcome", name=player.name))

has_access #

has_access(flags: Access | int) -> bool

Есть ли у игрока все указанные флаги.

Пример#
if player.has_access(Access.BAN | Access.KICK): ...

is_teammate #

is_teammate(other: Player | None) -> bool

Другой игрок той же команды (T или CT); сам себе игрок не тиммейт.

Пример#
if e.attacker is not None and e.attacker.is_teammate(e.victim):
    e.cancel()

PlayerState #

PlayerState(factory: Callable[[], T] | None = None, *, keep: bool = False)

Данные плагина по игрокам: state[player].

Запись удаляется сама, когда игрок выходит. С factory значение создаётся при первом обращении. С keep=True данные переживают горячую перезагрузку плагина (переносятся через pickle).

Параметры#
  • factory — значение по умолчанию для нового игрока (int, list, класс).
  • keep — сохранять данные при горячей перезагрузке.
Пример#
kills: PlayerState[int] = PlayerState(int, keep=True)

@plugin.on(events.PlayerKilled, post=True)
def count(e: events.PlayerKilled) -> None:
    if e.killer is not None:
        kills[e.killer] += 1

get #

get(player: Player | None) -> T | None
get(player: Player | None, default: D) -> T | D
get(player: Player | None, default: Any = None) -> Any

Значение игрока или default; None вместо игрока тоже допустим.

pop #

pop(player: Player) -> T | None
pop(player: Player, default: D) -> T | D
pop(player: Player, default: Any = None) -> Any

Удалить запись игрока и вернуть её (или default).

items #

items() -> list[tuple[Player, T]]

Пары (игрок, значение) — копия, можно менять состояние в цикле.

values #

values() -> list[T]

Значения всех игроков.

clear #

clear() -> None

Удалить данные всех игроков.

Access #

Флаги доступа администраторов AMXX (буквы a–z из users.ini).

Пример#
@plugin.command("amx_kick2", access=Access.KICK)
def kick(admin: Player, target: Player) -> None: ...

if player.has_access(Access.BAN | Access.KICK): ...

from_letters #

from_letters(letters: str) -> Access

Флаги по буквам users.ini: Access.from_letters("bcd").

Team #

Команда игрока: player.team == Team.CT.

MoneyReason #

За что меняются деньги (RewardType ReGameDLL): e.reason в events.MoneyChange.

Winner #

Итог раунда (WinStatus ReGameDLL): e.winner в events.RoundEnd.

Entity #

Entity(host: Host, index: int)

Хэндл сущности по индексу edict: оружие, гранаты, объекты карты.

classname #

classname: str

Classname сущности (weapon_ak47, func_breakable); пусто — сущности нет.

valid #

valid: bool

Сущность существует.

StaleHandleError #

Игрок вышел (или сущность удалена), а хэндл всё ещё используется.

Защищает от действий над чужим игроком, занявшим тот же слот. Проверить заранее — player.connected.