-
Notifications
You must be signed in to change notification settings - Fork 0
CommandBase
The Axwabo.CommandSystem.CommandBase class is the core of creating commands.
See also:
You can specify common properties using attributes, with resolvers or by overriding them.
Register your command in the Remote Admin, Server Console or the Client Console (what's the difference?) using the Axwabo.CommandSystem.Attributes.CommandTargetAttribute
Note
Setting the description is done with the Axwabo.CommandSystem.Attributes.CommandDescriptionAttribute and not System.ComponentModel.DescriptionAttribute
There is an attribute to set each of the following properties: Name Description Aliases Usage MinArguments
Alternatively, the Axwabo.CommandSystem.Attributes.CommandPropertiesAttribute allows you to set Name Description Aliases MinArguments in one attribute.
Important
A command must specify its name in one of the ways described above (otherwise, an exception is thrown) and override the Execute method.
The latter method takes in an ArraySegment<string> and a CommandSender - and returns a CommandResult
Example:
using System;
using Axwabo.CommandSystem.Attributes;
using Axwabo.CommandSystem.Commands;
[CommandProperties(CommandHandlerType.RemoteAdmin, "myCommand", "My description", "myAlias")]
public sealed class MyCommand : CommandBase
{
protected override CommandResult Execute(ArraySegment<string> arguments, CommandSender sender)
{
return "Hello, World!"; // implicitly converted to a CommandResult
}
}Same command with overrides:
using System;
using Axwabo.CommandSystem.Attributes;
using Axwabo.CommandSystem.Commands;
[RemoteAdminCommand] // handler types must be specified using attributes (if applicable)
[CommandTarget(CommandHandlerType.RemoteAdmin)] // same as above
public sealed class MyCommand : CommandBase
{
public override string Name => "myCommand";
public override string Description => "My description";
public override string[] Aliases { get; } = ["myAlias"];
protected override CommandResult Execute(ArraySegment<string> arguments, CommandSender sender)
{
return CommandResult.Succeeded("Hello, World!");
}
}A CommandResult struct stores the response string and a bool indicating whether the command executed successfully.
You can create a CommandResult in one of the following ways:
- Calling the string-only constructor
- Calling the constructor with signature
(bool, string)to specify whether the command was successful - Invoking the static method
CommandResult.Succeeded(string) - Invoking the static method
CommandResult.Failed(string)
Tip
Multiple implicit casts make it easier to create a CommandResult
-
string(based on the string-only constructor) -
bool(response will benull) -
(string, bool)(bool, string) -
Enumconversion happens using result translation > - Up to 4 objects can be passed in using a tuple, for example:(Enum, object, object)
Caution
When using the implicit string cast, null will be converted as a null string, leading to an exception. Use CommandResult.Null in nullable result (CommandResult?) contexts.
Invoking the constructor that only takes in a string will treat the response as failing if it begins with an ! (exclamation point).
The first exclamation point is trimmed from the start.
If you want the ! symbol to be the first character of your message, create the CommandResult in a different way.
Most commands should be restricted to certain groups of staff.
A command itself may implement the IPermissionChecker interface to override checking behavior.
When this interface is implemented, attribute-based permission checkers are not resolved.
See the permissions article for details.
- Ensure that the sender is a player if the command is player-only
- Permissions are checked
- A pre-execution filter may intercept the execution here
- Minimum argument count is checked
- The overriding command's
Executemethod is invoked
Add the PlayerOnlyCommandAttribute to the class to specify that the command can only be executed by players.
Implement the IPlayerOnlyCommand to specify a custom message when the sender is not a player.
If the OnNotPlayer method returns CommandResult.Null, the execution sequence continues at step 4.
Warning
Only return CommandResult.Null if there won't be an attempt to get the player from the sender.
Proceeding with execution when the sender isn't a player might lead to an exception.
Implement the IPreExecutionFilter interface in the command class to add certain custom conditions before the command is executed.
If the OnBeforeExecuted method returns CommandResult.Null, the execution sequence continues at step 4.
Caution
Returning null will be implicitly converted as a null string, leading to an exception. Use CommandResult.Null to allow execution to continue.
A command registered in this handler can be executed through the Text-Based Remote Admin.
The base-game handler is RemoteAdminCommandHandler
The attribute is RemoteAdminCommand which uses CommandHandlerType.RemoteAdmin
These commands can only executed by someone who has access to the dedicated server's console.
Also known as the GameConsoleCommandHandler and not to be confused with the ClientCommandHandler
The attribute is ServerCommand which uses CommandHandlerType.ServerConsole
Client commands are invoked by opening the game console (~ or `) on the client, then typing the command with a . prefix.
The attribute is ClientCommand which uses CommandHandlerType.Client