Сначала давайте посмотрим, что требуется для простой команды. Команды регистрируются с помощью функции 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::IPluginEntry {
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: (
None if caller == -1 else s2.PrintToServer("Custom command called.\n")
), s2.HookMode.Post)
package main
import (
"fmt"
"s2sdk"
"github.com/untrustedmodders/go-plugify"
)
func init() {
plugify.OnPluginStart(func() {
flags := s2sdk.ConVarFlag.LinkedConcommand | s2sdk.ConVarFlag.Release | s2sdk.ConVarFlag.ClientCanExecute
s2sdk.AddConsoleCommand("custom_command", "A command is registered during OnPluginStart", flags,
func(caller int, context s2sdk.CommandCallingContext, arguments []string) {
if caller == -1 {
return
}
s2sdk.PrintToServer("Custom command called.\n")
}, s2sdk.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) return;
s2.PrintToServer("Custom command called.\n");
}, 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 return end
s2:PrintToServer("Custom command called.\n")
end, s2:HookMode.Post)
end
local M = {}
M.Sample = Sample
return M
Массив 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