Создание команды
Прежде всего, необходимо создать новый конструктор CommandSpec. Он предоставляет методы для изменения вспомогательной информации о командах, их набора аргументов и логики. Эти методы могут быть объединены в цепочки.
Чтобы собрать команду, вы должны вызвать метод CommandSpec.Builder#build().
После этого вы должны выполнить регистрацию команды.
Пример: Создание простой команды
import org.spongepowered.api.Sponge;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.command.spec.CommandSpec;
PluginContainer plugin = ...;
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 сущности и была успешно выполнена.
Обработка ошибок
Метод execute()
также может сгенерировать исключение CommandException, показывающее, что во время исполнения команды произошла ошибка. В этом случае, во-первых, источник команды получит сообщение об ошибке; во-вторых, он получит сообщение, в котором будет показано, как команду нужно использовать. Исключение ArgumentParseException, являющееся подтипом CommandException
, автоматически генерируется, если аргументы команды не поддаются парсингу.