Brigadier позволяет задавать пользовательские предложения для аргументов. В Minecraft эти предложения отправляются клиенту, когда пользователь вводит команду.
SuggestionProvider
используется для составления списка предложений, которые будут отправлены клиенту. Поставщик предложений - это функциональный интерфейс, который принимает CommandContext
и SuggestionBuilder
и возвращает некоторые Suggestions
. SuggestionProvider
возвращает CompletableFuture, поскольку предложения могут быть доступны не сразу.
Предложения могут быть контекстными, поскольку поставщик предложений предоставляет вам доступ к текущему контексту команды.
Например, допустим, вы хотите предложить все атрибуты, которые может иметь объект:
class AttributeSuggestionProvider implements SuggestionProvider<ServerCommandSource> { @Override public CompletableFuture<Suggestions> getSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder builder) throws CommandSyntaxException { Identifier entityTypeId = context.getArgument("type", Identifier.class); ...
Поскольку у нас есть контекст команды, мы можем проверить контекст на наличие значения любых аргументов перед аргументом, на который нацелен этот поставщик предложений.
Далее идет набор шаблонного кода:
class AttributeSuggestionProvider implements SuggestionProvider<ServerCommandSource> { @Override public CompletableFuture<Suggestions> getSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder builder) { Identifier entityTypeId = context.getArgument("type", Identifier.class); if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) { // Сделать: Неудачу } DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); // Вам понадобится миксин, чтобы получить "карту экземпляров". Давайте предположим, что мы можем просто получить к нему доступ ради руководства. for (EntityAttribute attribute : attributeContainer.instances().keySet()) { if (attributeId != null) { ...
Чтобы предложение появилось на клиенте, вы должны добавить его в конструктор. Это можно сделать с помощью одного из методов suggest
. Некоторые из них обрабатывают номера, а некоторые поддерживают отображение всплывающей подсказки:
for (EntityAttribute attribute : attributeContainer.instances().keySet()) { if (attributeId != null) { builder.suggest(attributeId.toString()); } }
Вы также можете объединить результат другого конструктора предложений, используя метод add(SuggestionBuilder)
.
Наконец, вам нужно создать предложения, которые будут возвращены. Это делается с помощью метода buildFuture
:
return builder.buildFuture();
Конечный результат:
class AttributeSuggestionProvider implements SuggestionProvider<ServerCommandSource> { @Override public CompletableFuture<Suggestions> getSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder builder) { Identifier entityTypeId = context.getArgument("type", Identifier.class); if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) { // Сделать: Неудачу } DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); // Вам понадобится миксин, чтобы получить "карту экземпляров". Давайте предположим, что мы можем просто получить к нему доступ ради руководства. for (EntityAttribute attribute : attributeContainer.instances().keySet()) { if (attributeId != null) { builder.suggest(attributeId.toString()); } } return builder.buildFuture(); } }
Теперь, когда у вас есть поставщик предложений, пришло время воспользоваться им. Обратите внимание, что поставщики предложений не могут быть применены к литералам.
При регистрации аргумента вы можете установить поставщика предложений, используя метод suggests(SuggestionProvider)
. Это применяется к RequiredArgumentBuilder
, как показано ниже:
argument(argumentName, word()) .suggests(CompletionProviders.suggestedStrings()) .then(/*Остальная часть команды*/));
Minecraft включает в себя несколько встроенных поставщиков предложений, которые включают:
Тип | Метод |
---|---|
Summonable entities(Вызываемые сущности) | SuggestionProviders.SUMMONABLE_ENTITIES |
Available sounds(Доступные звуки) | SuggestionProviders.AVAILABLE_SOUNDS |
Loot Tables(Таблицы добычи) | LootCommand.SUGGESTION_PROVIDER |
Biomes(Биомы) | SuggestionProviders.ALL_BIOMES |
CommandSource
содержит несколько служебных методов, которые помогут удалить шаблоны при создании предложений.
Многие из служебных методов предполагают возврат завершенных предложений из Stream
или Set
идентификаторов, позиций или совпадающих строк.
Нажмите сюда чтобы просмотреть другие туториалы по командам.