CounterStrikeSharpでチャットコマンドとコンソールコマンドを作る
コマンドは、プレイヤーが最初に触れる機能であることが多いものです。CounterStrikeSharpでは、コマンドは属性を付けたメソッドにすぎず、同じコマンドをコンソールからもチャットからも入力できます。このガイドは、簡単なhelloコマンドから始めて、引数付きの保護されたコマンドまで進みます。
コマンドの仕組み
コマンドは、[ConsoleCommand]を付けたメソッドです。フレームワークはプラグインの読み込み時に登録し、アンロード時に削除します。名前がcss_で始まるコマンドは、コンソールではcss_hello、チャットでは!helloまたは/helloの3通りで使えます。スラッシュ付きの方は、メッセージがほかのプレイヤーに表示されません。
最初のコマンド
メソッドは、コマンドを実行したプレイヤーと、引数の取得や返信に使うCommandInfoオブジェクトを受け取ります。サーバーコンソールから入力された場合、プレイヤーは空なので、まずそれを確認します。
using CounterStrikeSharp.API.Core;
using CounterStrikeSharp.API.Core.Attributes.Registration;
using CounterStrikeSharp.API.Modules.Commands;
public class CommandsPlugin : BasePlugin
{
public override string ModuleName => "Commands Example";
public override string ModuleVersion => "1.0.0";
[ConsoleCommand("css_hello", "Says hello to the player")] public void OnHelloCommand(CCSPlayerController? player, CommandInfo commandInfo)
{
if (player == null) return;
commandInfo.ReplyToCommand($"Hello, {player.PlayerName}!"); }
}
プレイヤーがnullになる理由
サーバーコンソールにコマンドを入力した場合、その背後にプレイヤーはいません。確認せずにプレイヤーを使うと、コードがエラーになります。上の例のようにコンソールの場合は早めにメソッドを抜けるか、サーバーでも動くようにコードを書きます。
引数と使い方
CommandHelper属性で、コマンドの使い方を記述します。引数の最小数、短い使い方の説明、実行できる人の条件です。プレイヤーが引数を間違えると、CounterStrikeSharpが使い方を自動で表示します。コマンド名自体が引数0なので、GetArg(1)が最初の引数です。
[ConsoleCommand("css_greet", "Greets another player by name")]
[CommandHelper(minArgs: 1, usage: "<name>", whoCanExecute: CommandUsage.CLIENT_ONLY)]
public void OnGreetCommand(CCSPlayerController? player, CommandInfo commandInfo)
{
var name = commandInfo.GetArg(1);
commandInfo.ReplyToCommand($"Hello, {name}!");
}
ラムダ式で登録するコマンド
属性を使わず、Loadメソッドの中でコマンドを登録することもできます。小さなコマンドや、コマンド名を設定ファイルから読み込みたい場合に便利です。
public override void Load(bool hotReload)
{
AddCommand("css_ping", "Replies with pong", (player, commandInfo) =>
{
commandInfo.ReplyToCommand("pong");
});
}
権限でコマンドを制限する
RequiresPermissionsを付けると、@css/kickなどのフラグを持つプレイヤーだけにコマンドを許可できます。持っていない人は自動的に拒否されます。フラグはadmins.jsonで付与します。詳しくは、管理者になる方法のガイドをご覧ください。
[ConsoleCommand("css_kickme", "Example of a protected command")]
[RequiresPermissions("@css/kick")]
public void OnKickMeCommand(CCSPlayerController? player, CommandInfo commandInfo)
{
commandInfo.ReplyToCommand("You have the @css/kick flag.");
}
色付きのチャットメッセージ
ChatColorsを使うと、PrintToChatで送るメッセージの一部に色を付けられます。例のように文字列の先頭に半角スペースを入れてください。入れないと、最初の色が正しく表示されないことがあります。ChatColorsはCounterStrikeSharp.API.Modules.Utilsにあります。
player.PrintToChat($" {ChatColors.Green}Hello, {player.PlayerName}!");
よくある失敗
反応しないコマンドは、css_の接頭辞がなくチャットから使えないか、プレイヤーがnullで例外が発生しているかのどちらかであることが多いです。また、名前は一意でなければなりません。2つのプラグインが同じコマンドを登録すると動作が不安定になるため、自分のコマンドには特徴のある名前を付けましょう。
このチュートリアルは役に立ちましたか?
Barlap コミュニティのために。