Консольные команды

Как добавить новую консольную команду

Сначала давайте посмотрим, что требуется для простой команды. Команды регистрируются с помощью функции AddConsoleCommand. Им требуется имя, описание, функция обратного вызова и флаги команды.

Функция обратного вызова вызывается каждый раз при использовании команды. Нажмите здесь, чтобы увидеть её прототип. Пример:

public void OnPluginStart()
{
    var flags = ConVarFlag.LinkedConcommand | ConVarFlag.Release | ConVarFlag.ClientCanExecute;
    AddConsoleCommand("sm_myslap", "slap me baby!", flags, Command_MySlap);
}

public ResultType Command_MySlap(int caller, CommandCallingContext context, string[] arguments)
{
    return ResultType.Continue;
}

Теперь мы успешно реализовали команду -- хотя она пока ничего не делает. На самом деле, она скажет "Unknown command", если вы её используете! Это потому, что вы не возвращаете ResultType.Handled в вашем коллбэке. Поскольку вы этого не сделали, сервер считает, что вы не хотите, чтобы движок Source2 знал о регистрации команды, и обрабатывает это соответствующим образом. Причина, по которой сервер ожидает, что ваша функция вернёт ResultType.Handled, заключается в теге Result, который вы указали в прототипе функции. Тег Result указывает, что Command_MySlap должна вернуть одно из четырёх значений. См. перечисление Result в API, чтобы узнать больше об этих типах возврата и когда их использовать.

public ResultType Command_MySlap(int caller, CommandCallingContext context, string[] arguments)
{
    return ResultType.Handled;
}

Теперь команда не будет сообщать об ошибке, но она всё равно ничего не будет делать. Это потому, что возврат "ResultType.Handled" в коллбэке команды предотвратит обработку команды движком. Движок даже не узнает, что команда была выполнена. Это то, что вам нужно сделать, если вы регистрируете совершенно новую команду через SourceMod.

Добавление консольной команды

Вы можете привязать команды в OnPluginStart (или где угодно).

c#
c++
python
go
js
lua
using Plugify;
using static s2sdk.s2sdk;

public unsafe class Sample : Plugin
{
    public void OnPluginStart()
    {
        var flags = ConVarFlag.LinkedConcommand | ConVarFlag.Release | ConVarFlag.ClientCanExecute;
        AddConsoleCommand("custom_command", "A command is registered during OnPluginStart", flags,
        (caller, context, arguments) =>
        {
            if (caller == -1) return;
            PrintToServer("Custom command called.\n");
        }, HookMode.Post);
    }
}

Доступ к параметрам команды

Массив arguments предоставляет доступ к параметрам вызываемой команды. Первым параметром всегда будет вызываемая команда. Значения в кавычках возвращаются без кавычек, например:

public void OnCommand(int caller, CommandCallingContext context, string[] arguments)
{
    Console.Write($@"
        Command Caller: {caller}
        Command Context: {context}
        Arg Count: {arguments.Length}
        Arg String: {arguments}
        First Argument: {arguments[0]}
        Second Argument: {command[1]}");
}
> custom_command "Test Quoted" 5 13

# Output
Command Caller: 1
Command Context: 0
Arg Count: 4
Arg String: "Test Quoted" 5 13
First Argument: custom_command
Second Argument: Test Quoted