MySQL: Online
Load: Low
Sandbox: Running

Как создавать команды чата и консоли в CounterStrikeSharp

Команды обычно первое, с чем сталкиваются игроки. В CounterStrikeSharp команда — это просто метод с атрибутом над ним, и одну и ту же команду можно ввести в консоли или в чате. Руководство начинается с простой команды hello и доходит до защищённых команд с аргументами.

1

Как работают команды

Команда — это метод с атрибутом [ConsoleCommand]. Фреймворк регистрирует её при загрузке плагина и убирает при выгрузке. Любая команда, имя которой начинается с css_, доступна тремя способами: в консоли как css_hello, а в чате как !hello или /hello. Вариант со слешем скрывает сообщение от остальных игроков.

2

Ваша первая команда

Метод получает игрока, который выполнил команду, и объект 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}!");    }
}
3

Почему игрок может быть null

Когда вы вводите команду в консоли сервера, за ней не стоит никакого игрока. Если код обращается к игроку без проверки, он падает. Либо выходите из метода для консоли, как выше, либо пишите код так, чтобы он работал и для сервера.

4

Аргументы и порядок использования

Атрибут 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}!");
}
5

Команды через лямбду

Команду можно зарегистрировать и в методе Load, вместо атрибута. Это удобно для небольших команд или когда имя команды берётся из конфигурационного файла.

public override void Load(bool hotReload)
{
    AddCommand("css_ping", "Replies with pong", (player, commandInfo) =>
    {
        commandInfo.ReplyToCommand("pong");
    });
}
6

Ограничьте команду правами

Добавьте 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.");
}
7

Цветные сообщения в чате

ChatColors позволяет раскрашивать части сообщения, отправленного через PrintToChat. Начинайте строку с пробела, как в примере, иначе первый цвет может отобразиться неправильно. ChatColors находится в CounterStrikeSharp.API.Modules.Utils.

player.PrintToChat($" {ChatColors.Green}Hello, {player.PlayerName}!");
8

Типичные ошибки

Команда, которая никогда не отвечает, чаще всего либо лишена префикса css_ и потому недоступна в чате, либо выбрасывает исключение из-за игрока null. Помните и о том, что имена должны быть уникальными: если два плагина регистрируют одну команду, поведение непредсказуемо, так что дайте своей команде своё имя.

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

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