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

Привет и /hp#

Четыре приёма в одном файле: async-приветствие, чат-команда, админ-команда с аргументами и отмена урона по своим под управлением cvar'а.

examples/plugins/hello.py
"""Приветствие, /hp, лечение админом и запрет урона по своим."""

from amxpy import Access, Config, Player, Plugin, cvar, events, sleep

plugin = Plugin("Hello", version="1.0.0", author="amxpy")


class Settings(Config, prefix="hello_"):
    delay: float = cvar(3.0, "Задержка приветствия, сек", min=0)
    friendly_fire: bool = cvar(False, "Разрешить урон по своим")


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.on(events.TakeDamage)
def no_team_damage(e: events.TakeDamage) -> None:
    if not cfg.friendly_fire and e.attacker is not None and e.attacker.is_teammate(e.victim):
        e.cancel()


@plugin.command("/hp", help="Показать здоровье")
def hp(player: Player) -> None:
    player.print(f"HP: {player.health}, броня: {player.armor}")


@plugin.command("amx_heal", access=Access.SLAY, help="Вылечить игрока")
def heal(admin: Player, target: Player, amount: int = 100) -> None:
    target.health = min(target.health + amount, 255)
    admin.console(f"{target.name}: +{amount} HP")

Как это работает#

  • greet — async-обработчик PutInServer. Игрок сохраняется в переменную до await: объект события после него недействителен. Если игрок выйдет за время ожидания, задача отменится сама.
  • no_team_damage — pre-обработчик TakeDamage: e.cancel() отменяет урон, если атакующий из той же команды, а hello_friendly_fire выключен.
  • hp — чат-команда /hp; сообщение с командой в чате не показывается.
  • heal — консольная команда с флагом доступа e (Access.SLAY). Аргументы target и amount amxpy разбирает сам: amx_heal Bob 50.

Что проверяют тесты#

  • приветствие приходит через 3 секунды и отменяется, если игрок вышел;
  • /hp скрывает сообщение и отвечает здоровьем и бронёй;
  • урон по своим блокируется, по чужим и по себе — нет; cvar hello_friendly_fire это меняет;
  • amx_heal без доступа отвечает «У вас нет доступа к этой команде.»