Table of Contents

Предложения команд

Brigadier позволяет задавать пользовательские предложения для аргументов. В Minecraft эти предложения отправляются клиенту, когда пользователь вводит команду.

Поставщики предложений

SuggestionProvider используется для составления списка предложений, которые будут отправлены клиенту. Поставщик предложений - это функциональный интерфейс, который принимает CommandContext и SuggestionBuilder и возвращает некоторые Suggestions. SuggestionProvider возвращает CompletableFuture, поскольку предложения могут быть доступны не сразу.

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

Пример поставщика предложений

Например, допустим, вы хотите предложить все атрибуты, которые может иметь объект:

  1. class AttributeSuggestionProvider implements SuggestionProvider<ServerCommandSource> {
  2. @Override
  3. public CompletableFuture<Suggestions> getSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder builder) throws CommandSyntaxException {
  4. Identifier entityTypeId = context.getArgument("type", Identifier.class);
  5. ...

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

Далее идет набор шаблонного кода:

  1. class AttributeSuggestionProvider implements SuggestionProvider<ServerCommandSource> {
  2. @Override
  3. public CompletableFuture<Suggestions> getSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder builder) {
  4. Identifier entityTypeId = context.getArgument("type", Identifier.class);
  5. EntityType<?> entityType = Registry.ENTITY_TYPE.getOrEmpty(entityTypeId).orElse(null);
  6.  
  7. if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) {
  8. // Сделать: Неудачу
  9. }
  10.  
  11. DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType);
  12. // Вам понадобится миксин, чтобы получить "карту экземпляров". Давайте предположим, что мы можем просто получить к нему доступ ради руководства.
  13. for (EntityAttribute attribute : attributeContainer.instances().keySet()) {
  14. Identifier attributeId = Registry.ATTRIBUTE.getId(attribute);
  15. if (attributeId != null) {
  16. ...

Чтобы предложение появилось на клиенте, вы должны добавить его в конструктор. Это можно сделать с помощью одного из методов suggest. Некоторые из них обрабатывают номера, а некоторые поддерживают отображение всплывающей подсказки:

  1. for (EntityAttribute attribute : attributeContainer.instances().keySet()) {
  2. Identifier attributeId = Registry.ATTRIBUTE.getId(attribute);
  3. if (attributeId != null) {
  4. builder.suggest(attributeId.toString());
  5. }
  6. }

Вы также можете объединить результат другого конструктора предложений, используя метод add(SuggestionBuilder).

Наконец, вам нужно создать предложения, которые будут возвращены. Это делается с помощью метода buildFuture:

  1. return builder.buildFuture();

Конечный результат:

  1. class AttributeSuggestionProvider implements SuggestionProvider<ServerCommandSource> {
  2. @Override
  3. public CompletableFuture<Suggestions> getSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder builder) {
  4. Identifier entityTypeId = context.getArgument("type", Identifier.class);
  5. EntityType<?> entityType = Registry.ENTITY_TYPE.getOrEmpty(entityTypeId).orElse(null);
  6.  
  7. if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) {
  8. // Сделать: Неудачу
  9. }
  10.  
  11. DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType);
  12. // Вам понадобится миксин, чтобы получить "карту экземпляров". Давайте предположим, что мы можем просто получить к нему доступ ради руководства.
  13. for (EntityAttribute attribute : attributeContainer.instances().keySet()) {
  14. Identifier attributeId = Registry.ATTRIBUTE.getId(attribute);
  15. if (attributeId != null) {
  16. builder.suggest(attributeId.toString());
  17. }
  18. }
  19.  
  20. return builder.buildFuture();
  21. }
  22. }

Использование поставщика предложений

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

При регистрации аргумента вы можете установить поставщика предложений, используя метод suggests(SuggestionProvider). Это применяется к RequiredArgumentBuilder, как показано ниже:

  1. argument(argumentName, word())
  2. .suggests(CompletionProviders.suggestedStrings())
  3. .then(/*Остальная часть команды*/));

Встроенные поставщики предложений

Minecraft включает в себя несколько встроенных поставщиков предложений, которые включают:

Тип Метод
Summonable entities(Вызываемые сущности) SuggestionProviders.SUMMONABLE_ENTITIES
Available sounds(Доступные звуки) SuggestionProviders.AVAILABLE_SOUNDS
Loot Tables(Таблицы добычи) LootCommand.SUGGESTION_PROVIDER
Biomes(Биомы) SuggestionProviders.ALL_BIOMES

Утилиты в CommandSource

CommandSource содержит несколько служебных методов, которые помогут удалить шаблоны при создании предложений. Многие из служебных методов предполагают возврат завершенных предложений из Stream или Set идентификаторов, позиций или совпадающих строк.

Другие туториалы по командам

Нажмите сюда чтобы просмотреть другие туториалы по командам.