====== Предложения команд ======
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#дополнительные_концепции|Нажмите сюда]] чтобы просмотреть другие туториалы по командам.