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を返してください。
心がけたい習慣
ハンドラーはゲームのメインスレッドで動くので、処理を速く保ち、データベースやWebリクエストを待たないでください。プラグインのアンロード時に登録解除する必要はありません。CounterStrikeSharpが代わりにハンドラーを削除します。イベントの一覧と各フィールドは、ゲームイベントのドキュメントで確認できます。
このチュートリアルは役に立ちましたか?
Barlap コミュニティのために。