Предложения по командам 1.21.11
Узнайте, как предлагать пользователям значения аргументов команд.
WARNING
Эта страница написана для версии 1.21.11.
Документация для старых версий может быть неполной.
Майнкрафт имеет мощную систему предложений по командам, которая используется много где, например в команде /give. Эта система позволяет вам предложение значения к аргументам ваших команд для пользователей, которые они могут выбрать - это отличная возможность сделать вашу команду больше удобнее и эргономичной.
Поставщики предложений
SuggestionProvider - используется для создания списка предложений, который будет отправлен на клиент. Поставщик предложений - это функциональный интерфейс, который использует CommandContext и SuggestionBuilder, а также возвращает Suggestions. SuggestionProvider возвращает CompletableFuture, потому что предложения могут быть доступны не сразу.
Использование поставщиков предложений
Чтобы использовать поставщика предложений, необходимо вызвать метод suggests в конструкторе аргументов. Этот метод берёт SuggestionProvider и возвращает модифицированный аргумент конструктора с прикрепленным поставщиком предложений.
java
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(Commands.literal("command_with_suggestions").then(
Commands.argument("entity", ResourceArgument.resource(registryAccess, Registries.ENTITY_TYPE))
.suggests(SuggestionProviders.cast(SuggestionProviders.SUMMONABLE_ENTITIES))
.executes(ExampleModCommands::executeCommandWithSuggestions)
));
});1
2
3
4
5
6
7
2
3
4
5
6
7
java
private static int executeCommandWithSuggestions(CommandContext<CommandSourceStack> context) throws CommandSyntaxException {
var entityType = ResourceArgument.getSummonableEntityType(context, "entity");
context.getSource().sendSuccess(() -> Component.literal("Called /command_with_suggestions with entity = %s".formatted(entityType.value().toShortString())), false);
return 1;
}1
2
3
4
5
2
3
4
5
Встроенные поставщики предложений
Несколько встроенных поставщиков предложений которые вы можете использовать:
| Поставщик предложений | Описание |
|---|---|
SuggestionProviders.SUMMONABLE_ENTITIES | Предлагает всех вызываемых сущностей. |
SuggestionProviders.AVAILABLE_SOUNDS | Предлагает все производимые звуки. |
LootCommand.SUGGESTION_PROVIDER | Предлагает все возможные таблицы добычи. |
SuggestionProviders.ALL_BIOMES | Предлагает всевозможные биомы. |
Создание собственного поставщика предложений
Если встроенные провайдеры не удовлетворяют вашим потребностям, вы можете создать свой поставщик предложений. Для этого, вам нужно создать класс который имплементирует интерфейс SuggestionProvider и перезаписать метод getSuggestions.
Например, мы сделаем поставщик предложений предлагающий все имена игроков на сервере.
java
public class PlayerSuggestionProvider implements SuggestionProvider<CommandSourceStack> {
@Override
public CompletableFuture<Suggestions> getSuggestions(CommandContext<CommandSourceStack> context, SuggestionsBuilder builder) throws CommandSyntaxException {
CommandSourceStack source = context.getSource();
// Thankfully, the ServerCommandSource has a method to get a list of player names.
Collection<String> playerNames = source.getOnlinePlayerNames();
// Add all player names to the builder.
for (String playerName : playerNames) {
builder.suggest(playerName);
}
// Lock the suggestions after we've modified them.
return builder.buildFuture();
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Для использования этого поставщика предложений, просто передадите его экземпляр в метод .suggests в конструктор аргументов.
java
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(Commands.literal("command_with_custom_suggestions").then(
Commands.argument("player_name", StringArgumentType.string())
.suggests(new PlayerSuggestionProvider())
.executes(ExampleModCommands::executeCommandWithCustomSuggestions)
));
});1
2
3
4
5
6
7
2
3
4
5
6
7
java
private static int executeCommandWithCustomSuggestions(CommandContext<CommandSourceStack> context) {
String name = StringArgumentType.getString(context, "player_name");
context.getSource().sendSuccess(() -> Component.literal("Called /command_with_custom_suggestions with value = %s".formatted(name)), false);
return 1;
}1
2
3
4
5
2
3
4
5
Очевидно, что поставщики предложений могут быть более сложными, поскольку они также могут считывать контекст команды, чтобы предоставлять предложения на основе состояния команды, например аргументов, которые уже были предоставлены.
Это может быть в виде чтения инвентаря игрока и предлагать предметы, или сущностей вокруг игрока.

