MySQL: Online
Load: Low
Sandbox: Ready

Реакция на игровые события в CounterStrikeSharp

Игровые события — это сообщения, которые игра отправляет, когда что-то происходит: игрок погибает, начинается раунд, закладывается бомба. Из них строится большинство интересных плагинов. В CounterStrikeSharp подписка на событие занимает несколько строк.

1

Что такое событие

У каждого события свой класс с именем, начинающимся с Event, например EventPlayerDeath или EventRoundStart, и данные о произошедшем: кто погиб, кто убил. Плагин получает метод, который вызывается при каждом наступлении события.

2

Подписка через атрибут

Проще всего поставить атрибут GameEventHandler на метод. Метод получает событие и возвращает HookResult. Данные события читаются прямо из объекта события.

using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using Microsoft.Extensions.Logging;

public class EventsPlugin : BasePlugin
{
    public override string ModuleName => "Events Example";
    public override string ModuleVersion => "1.0.0";

    [GameEventHandler]    public HookResult OnPlayerDeath(EventPlayerDeath @event, GameEventInfo info)    {
        Logger.LogInformation("{Name} died", @event.Userid?.PlayerName);
        return HookResult.Continue;
    }
}
3

Подписка из кода

Обработчик можно зарегистрировать и в методе Load через RegisterEventHandler. Результат тот же, а удобнее это тогда, когда подписаться нужно только при определённых условиях, например в зависимости от конфигурации.

public override void Load(bool hotReload)
{
    RegisterEventHandler<EventRoundStart>((@event, info) =>
    {
        Logger.LogInformation("Round started");
        return HookResult.Continue;
    });
}
4

Pre и Post

По умолчанию обработчик срабатывает после того, как игра обработала событие (Post). С HookMode.Pre он срабатывает до этого, что позволяет изменить происходящее, например скрыть сообщение по умолчанию через DontBroadcast. Используйте Post, если вам по-настоящему не нужно вмешиваться.

[GameEventHandler(HookMode.Pre)]
public HookResult OnPlayerDeathPre(EventPlayerDeath @event, GameEventInfo info)
{
    if ([email protected])
    {
        info.DontBroadcast = true;
    }

    return HookResult.Continue;
}
5

Игроки могут быть null

Свойства вроде Userid могут оказаться пустыми, например если игрок вышел ровно в момент события или убийца — сам мир. Всегда проверяйте на null перед использованием, иначе неудачный момент вызовет исключение прямо посреди раунда.

6

Что означает HookResult

Continue позволяет игре идти своим чередом и в большинстве случаев является правильным ответом. Handled сообщает игре, что вы всё обработали сами, а Stop не даёт выполниться остальным обработчикам. Возвращайте Continue, если нет причины поступить иначе.

7

Хорошие привычки

Обработчики выполняются в главном потоке игры, поэтому делайте их быстрыми и никогда не ждите внутри них базу данных или веб-запрос. Отписываться при выгрузке плагина не нужно: CounterStrikeSharp сам снимает обработчики. Список событий и их полей смотрите в документации по игровым событиям.

Было ли это руководство полезным?

Страница сформирована за 0.013 секунд
CounterStrikeSharp Web Compiler V1.0 - Сделано с от RomaniaBarlap для сообщества.