====== Предложения команд ====== Brigadier позволяет задавать пользовательские предложения для аргументов. В Minecraft эти предложения отправляются клиенту, когда пользователь вводит команду. ===== Поставщики предложений ===== ''SuggestionProvider'' используется для составления списка предложений, которые будут отправлены клиенту. Поставщик предложений - это функциональный интерфейс, который принимает ''CommandContext'' и ''SuggestionBuilder'' и возвращает некоторые ''Suggestions''. ''SuggestionProvider'' возвращает [[https://docs.oracle.com/en/java/javase/15/docs/api/java.base/java/util/concurrent/CompletableFuture.html|CompletableFuture]], поскольку предложения могут быть доступны не сразу. Предложения могут быть контекстными, поскольку поставщик предложений предоставляет вам доступ к текущему контексту команды. ===== Пример поставщика предложений ===== Например, допустим, вы хотите предложить все атрибуты, которые может иметь объект: class AttributeSuggestionProvider implements SuggestionProvider { @Override public CompletableFuture getSuggestions(CommandContext context, SuggestionsBuilder builder) throws CommandSyntaxException { Identifier entityTypeId = context.getArgument("type", Identifier.class); ... Поскольку у нас есть контекст команды, мы можем проверить контекст на наличие значения любых аргументов перед аргументом, на который нацелен этот поставщик предложений. Далее идет набор шаблонного кода: class AttributeSuggestionProvider implements SuggestionProvider { @Override public CompletableFuture getSuggestions(CommandContext context, SuggestionsBuilder builder) { Identifier entityTypeId = context.getArgument("type", Identifier.class); EntityType entityType = Registry.ENTITY_TYPE.getOrEmpty(entityTypeId).orElse(null); if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) { // Сделать: Неудачу } DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); // Вам понадобится миксин, чтобы получить "карту экземпляров". Давайте предположим, что мы можем просто получить к нему доступ ради руководства. for (EntityAttribute attribute : attributeContainer.instances().keySet()) { Identifier attributeId = Registry.ATTRIBUTE.getId(attribute); if (attributeId != null) { ... Чтобы предложение появилось на клиенте, вы должны добавить его в конструктор. Это можно сделать с помощью одного из методов ''suggest''. Некоторые из них обрабатывают номера, а некоторые поддерживают отображение всплывающей подсказки: for (EntityAttribute attribute : attributeContainer.instances().keySet()) { Identifier attributeId = Registry.ATTRIBUTE.getId(attribute); if (attributeId != null) { builder.suggest(attributeId.toString()); } } Вы также можете объединить результат другого конструктора предложений, используя метод ''add(SuggestionBuilder)''. Наконец, вам нужно создать предложения, которые будут возвращены. Это делается с помощью метода ''buildFuture'': return builder.buildFuture(); Конечный результат: class AttributeSuggestionProvider implements SuggestionProvider { @Override public CompletableFuture getSuggestions(CommandContext context, SuggestionsBuilder builder) { Identifier entityTypeId = context.getArgument("type", Identifier.class); EntityType entityType = Registry.ENTITY_TYPE.getOrEmpty(entityTypeId).orElse(null); if (!DefaultAttributeContainer.hasDefinitionFor(entityType)) { // Сделать: Неудачу } DefaultAttributeContainer attributeContainer = DefaultAttributeRegistry.get(entityType); // Вам понадобится миксин, чтобы получить "карту экземпляров". Давайте предположим, что мы можем просто получить к нему доступ ради руководства. for (EntityAttribute attribute : attributeContainer.instances().keySet()) { Identifier attributeId = Registry.ATTRIBUTE.getId(attribute); 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 ===== ''CommandSource'' содержит несколько служебных методов, которые помогут удалить шаблоны при создании предложений. Многие из служебных методов предполагают возврат завершенных предложений из ''Stream'' или ''Set'' идентификаторов, позиций или совпадающих строк. ===== Другие туториалы по командам ===== [[ru:tutorial:commands#дополнительные_концепции|Нажмите сюда]] чтобы просмотреть другие туториалы по командам.