Создание команды
Прежде всего, необходимо создать новый конструктор CommandSpec. Он предоставляет методы для изменения вспомогательной информации о командах, их набора аргументов и логики. Эти методы могут быть объединены в цепочки.
Чтобы собрать команду, вы должны вызвать метод CommandSpec.Builder#build().
После этого вы должны выполнить регистрацию команды.
Пример: Создание простой команды
import org.spongepowered.api.Sponge;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.command.spec.CommandSpec;
CommandSpec myCommandSpec = CommandSpec.builder()
.description(Text.of("Hello World Command"))
.permission("myplugin.command.helloworld")
.executor(new HelloWorldCommand())
.build();
Sponge.getCommandManager().register(plugin, myCommandSpec, "helloworld", "hello", "test");
Информация о методах CommandSpec
Метод |
Описание |
---|---|
|
Определяет логику команды (см. ниже: Writing a Command Executor) Вы должны определить исполнитель команды, если у нее нет дочерних команд. |
|
Определяет список аргументов данной команды (подробнее: Парсинг аргументов). |
|
Устанавливает разрешение, без которого игрок не сможет использовать данную команду. |
|
Небольшое, однострочное описание вашей команды, которое будет отображено в системе помощи. |
|
Добавляет расширенное описание для отображения в более длинных списках помощи. Будет добавлено к краткому описанию. |
|
Добавляет дочернюю команду к вашей команде с её альтернативными названиями (Смотрите Дочерние команды). |
|
Устанавливает дочерние команды к вашей команде с их альтернативными названиями (Смотрите Дочерние команды). |
|
Определяет, каким образом будет происходить парсинг аргументов. По умолчанию парсер разделяет введенные данные пробелами. При этом данные, заключенные в кавычки, рассматриваются как один аргумент. Например, в команде |
|
Выполняет сборку команды. После этого вам нужно зарегистрировать команду. |
Пишем исполнитель команд
Единственным обязательным компонентом для построения простой команды является класс исполнителя команд, который содержит логику команды.
Класс должен реализовать интерфейс CommandExecutor, определяющий метод CommandExecutor#execute(CommandSource, CommandContext). Этот метод вызывается при исполнении команды и содержит два аргумента:
Источник вызова команды (например, консоль, блок команды или игрок)
Объект CommandContext, содержащий аргументы команды (см.: Парсинг аргументов)
Пример: Простой исполнитель команд
import org.spongepowered.api.command.CommandException;
import org.spongepowered.api.command.CommandResult;
import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.command.args.CommandContext;
import org.spongepowered.api.command.spec.CommandExecutor;
public class HelloWorldCommand implements CommandExecutor {
@Override
public CommandResult execute(CommandSource src, CommandContext args) throws CommandException {
src.sendMessage(Text.of("Hello World!"));
return CommandResult.success();
}
}
Совет
Вы можете использовать анонимные классы для определения исполнителя команды в ходе построения команды (см. примеры здесь: Парсинг аргументов).
Команды, доступные только игрокам
Иногда необходимо, чтобы только игроки могли исполнить команду (например, команду /suicide
).
Для этого проверьте тип CommandSource с помощью instanceof
:
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.command.source.CommandBlockSource;
import org.spongepowered.api.command.source.ConsoleSource;
if(src instanceof Player) {
Player player = (Player) src;
player.sendMessage(Text.of("Hello " + player.getName() + "!"));
}
else if(src instanceof ConsoleSource) {
src.sendMessage(Text.of("Hello GLaDOS!"));
// The Cake Is a Lie
}
else if(src instanceof CommandBlockSource) {
src.sendMessage(Text.of("Hello Companion Cube!"));
// <3
}
Примечание
Мы рекомендуем вам добавить необязательный аргумент [player]
, чтобы сделать команду доступной для выполнения в консоли (напр., /suicide [player]
).
Самое простое решение - добавить элемент playerOrSource
в список аргументов команды (см.: Парсинг аргументов).
Результаты команды
Метод CommandExecutor#execute()
должен возвращать CommandResult. В большинстве случаев достаточно вернуть CommandResult#success(), если команда выполнена успешно, или CommandResult#empty() в противном случае. В случае, если необходимо передать больше информации, можно использовать CommandResult#builder(). Данный конструктор предоставляет несколько различных методов, принимающих целое число и устанавливающих его в качестве значения одноименного аргумента. Атрибуты, не установленные в конструкторе, окажутся пустыми.
Командные блоки могут использовать эти значения для модификации статистики на доске счета, которая затем может использоваться для сложных конструкций, состоящих из нескольких командных блоков. Учебник по доступу к данным можно найти здесь <https://minecraft.gamepedia.com/Tutorials/Command_stats> `_.
Пример: Построение CommandResult
CommandResult result = CommandResult.builder()
.affectedEntities(42)
.successCount(1)
.build();
В примере выше с помощью конструктора создается CommandResult
, показывающий, что команда затронула 42 сущности и была успешно выполнена.
Обработка ошибок
The execute()
method may also throw a CommandException, signaling that an error occured while trying to
execute the command. If such an Exception is thrown, its message will be displayed to the command source, formatted as
an error. Also, the commands usage message will be displayed. An ArgumentParseException, a subtype of
CommandException
is automatically thrown if the commands arguments could not be parsed.