Как создавать команды чата и консоли в CounterStrikeSharp
Команды обычно первое, с чем сталкиваются игроки. В CounterStrikeSharp команда — это просто метод с атрибутом над ним, и одну и ту же команду можно ввести в консоли или в чате. Руководство начинается с простой команды hello и доходит до защищённых команд с аргументами.
Как работают команды
Команда — это метод с атрибутом [ConsoleCommand]. Фреймворк регистрирует её при загрузке плагина и убирает при выгрузке. Любая команда, имя которой начинается с css_, доступна тремя способами: в консоли как css_hello, а в чате как !hello или /hello. Вариант со слешем скрывает сообщение от остальных игроков.
Ваша первая команда
Метод получает игрока, который выполнил команду, и объект 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 сам покажет ему подсказку. GetArg(1) — первый аргумент, потому что имя команды является аргументом 0.
[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. Помните и о том, что имена должны быть уникальными: если два плагина регистрируют одну команду, поведение непредсказуемо, так что дайте своей команде своё имя.
Было ли это руководство полезным?
Barlap для сообщества.