Реакция на игровые события в CounterStrikeSharp
Игровые события — это сообщения, которые игра отправляет, когда что-то происходит: игрок погибает, начинается раунд, закладывается бомба. Из них строится большинство интересных плагинов. В CounterStrikeSharp подписка на событие занимает несколько строк.
Что такое событие
У каждого события свой класс с именем, начинающимся с Event, например EventPlayerDeath или EventRoundStart, и данные о произошедшем: кто погиб, кто убил. Плагин получает метод, который вызывается при каждом наступлении события.
Подписка через атрибут
Проще всего поставить атрибут 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;
}
}
Подписка из кода
Обработчик можно зарегистрировать и в методе Load через RegisterEventHandler. Результат тот же, а удобнее это тогда, когда подписаться нужно только при определённых условиях, например в зависимости от конфигурации.
public override void Load(bool hotReload)
{
RegisterEventHandler<EventRoundStart>((@event, info) =>
{
Logger.LogInformation("Round started");
return HookResult.Continue;
});
}
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;
}
Игроки могут быть null
Свойства вроде Userid могут оказаться пустыми, например если игрок вышел ровно в момент события или убийца — сам мир. Всегда проверяйте на null перед использованием, иначе неудачный момент вызовет исключение прямо посреди раунда.
Что означает HookResult
Continue позволяет игре идти своим чередом и в большинстве случаев является правильным ответом. Handled сообщает игре, что вы всё обработали сами, а Stop не даёт выполниться остальным обработчикам. Возвращайте Continue, если нет причины поступить иначе.
Хорошие привычки
Обработчики выполняются в главном потоке игры, поэтому делайте их быстрыми и никогда не ждите внутри них базу данных или веб-запрос. Отписываться при выгрузке плагина не нужно: CounterStrikeSharp сам снимает обработчики. Список событий и их полей смотрите в документации по игровым событиям.
Было ли это руководство полезным?
Barlap для сообщества.