Сначала давайте посмотрим, что требуется для простой команды. Команды регистрируются с помощью функции 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, чтобы узнать больше об этих типах возврата и когда их использовать.
Теперь команда не будет сообщать об ошибке, но она всё равно ничего не будет делать. Это потому, что возврат "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);
}
}
#include <plg/plugin.hpp>
#include "s2sdk.hpp"
using namespace s2sdk;
class Sample : public plg::Plugin {
public:
void OnPluginStart() override {
ConVarFlag flags = ConVarFlag::LinkedConcommand | ConVarFlag::Release | ConVarFlag::ClientCanExecute;
AddConsoleCommand("custom_command", "A command is registered during OnPluginStart", flags,
[](int caller, CommandCallingContext context, const plg::vector<plg::string>& arguments) -> void {
if (caller == -1) return;
PrintToServer("Custom command called.\n");
}, HookMode::Post);
}
}
from plugify.plugin import Plugin
from plugify.pps import s2sdk as s2
class Sample(Plugin):
def plugin_start(self):
flags = s2.ConVarFlag.LinkedConcommand | s2.ConVarFlag.Release | s2.ConVarFlag.ClientCanExecute
s2.AddConsoleCommand("custom_command", "A command is registered during OnPluginStart", flags,
lambda caller, context, arguments: (
s2.ResultType.Handled if caller == -1 else s2.PrintToServer("Custom command called.\n") or s2.ResultType.Handled
), s2.HookMode.Post)
import { Plugin } from 'plugify';
import * as s2 from ':s2sdk';
export class Sample extends Plugin {
pluginStart() {
const flags = s2.ConVarFlag.LinkedConcommand | s2.ConVarFlag.Release | s2.ConVarFlag.ClientCanExecute;
s2.AddConsoleCommand("custom_command", "A command is registered during OnPluginStart", flags,
(caller, context, arguments) => {
if (caller !== -1) {
s2.PrintToServer("Custom command called.\n");
}
return s2.ResultType.Handled;
}, s2.HookMode.Post);
}
}
local plugify = require 'plugify'
local Plugin = plugify.Plugin
local s2 = require 's2sdk'
local Sample = {}
setmetatable(Sample, { __index = Plugin })
function Sample:plugin_start()
local flags = bit.bor(s2:ConVarFlag.LinkedConcommand, s2:ConVarFlag.Release, s2:ConVarFlag.ClientCanExecute)
s2:AddConsoleCommand("custom_command", "A command is registered during OnPluginStart", flags,
function(caller, context, arguments)
if caller != -1 then s2:PrintToServer("Custom command called.\n") end
return s2.ResultType.Handled
end, s2:HookMode.Post)
end
local M = {}
M.Sample = Sample
return M
Массив arguments предоставляет доступ к параметрам вызываемой команды. Первым параметром всегда будет вызываемая команда. Значения в кавычках возвращаются без кавычек, например: