Создание команды

Прежде всего, необходимо создать новый конструктор 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

Метод

Описание

executor

Определяет логику команды (см. ниже: Writing a Command Executor)

Вы должны определить исполнитель команды, если у нее нет дочерних команд.

arguments

Определяет список аргументов данной команды (подробнее: Парсинг аргументов).

permission

Устанавливает разрешение, без которого игрок не сможет использовать данную команду.

description

Небольшое, однострочное описание вашей команды, которое будет отображено в системе помощи.

extendedDescription

Добавляет расширенное описание для отображения в более длинных списках помощи. Будет добавлено к краткому описанию.

child

Добавляет дочернюю команду к вашей команде с её альтернативными названиями (Смотрите Дочерние команды).

children

Устанавливает дочерние команды к вашей команде с их альтернативными названиями (Смотрите Дочерние команды).

inputTokenizer

Определяет, каким образом будет происходить парсинг аргументов. По умолчанию парсер разделяет введенные данные пробелами. При этом данные, заключенные в кавычки, рассматриваются как один аргумент.

Например, в команде /tpworld Notch "My World" определяется два аргумента: Notch и``My World``.

build

Выполняет сборку команды. После этого вам нужно зарегистрировать команду.

Пишем исполнитель команд

Единственным обязательным компонентом для построения простой команды является класс исполнителя команд, который содержит логику команды.

Класс должен реализовать интерфейс 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, автоматически генерируется, если аргументы команды не поддаются парсингу.