🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
This page is written for:
1.21
This page is written for:
1.21
Майнкрафт имеет мощную систему предложений по командам, которая используется много где, например в команде /give
. Эта система позволяет вам предложение значения к аргументам ваших команд для пользователей, которые они могут выбрать - это отличная возможность сделать вашу команду больше удобнее и эргономичной.
SuggestionProvider
- используется для создания списка предложений, который будет отправлен на клиент. Поставщик предложений - это функциональный интерфейс, который использует CommandContext
и SuggestionBuilder
, а также возвращает Suggestions
. SuggestionProvider
возвращает CompletableFuture
, потому что предложения могут быть доступны не сразу.
Чтобы использовать поставщика предложений, необходимо вызвать метод suggests
в конструкторе аргументов. Этот метод берёт SuggestionProvider
и возвращает модифицированный аргумент конструктора с прикрепленным поставщиком предложений.
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("command_with_suggestions").then(
CommandManager.argument("entity", RegistryEntryReferenceArgumentType.registryEntry(registryAccess, RegistryKeys.ENTITY_TYPE))
.suggests(SuggestionProviders.SUMMONABLE_ENTITIES)
.executes(FabricDocsReferenceCommands::executeCommandWithSuggestions)
));
});
private static int executeCommandWithSuggestions(CommandContext<ServerCommandSource> context) throws CommandSyntaxException {
var entityType = RegistryEntryReferenceArgumentType.getSummonableEntityType(context, "entity");
context.getSource().sendFeedback(() -> Text.literal("Called /command_with_suggestions with entity = %s".formatted(entityType.value().getUntranslatedName())), false);
return 1;
}
Несколько встроенных поставщиков предложений которые вы можете использовать:
Поставщик предложений | Описание |
---|---|
SuggestionProviders.SUMMONABLE_ENTITIES | Предлагает всех вызываемых сущностей. |
SuggestionProviders.AVAILABLE_SOUNDS | Предлагает все производимые звуки. |
LootCommand.SUGGESTION_PROVIDER | Предлагает все возможные таблицы добычи. |
SuggestionProviders.ALL_BIOMES | Предлагает всевозможные биомы. |
Если встроенные провайдеры не удовлетворяют вашим потребностям, вы можете создать свой поставщик предложений. Для этого, вам нужно создать класс который имплементирует интерфейс SuggestionProvider
и перезаписать метод getSuggestions
.
Например, мы сделаем поставщик предложений предлагающий все имена игроков на сервере.
public class PlayerSuggestionProvider implements SuggestionProvider<ServerCommandSource> {
@Override
public CompletableFuture<Suggestions> getSuggestions(CommandContext<ServerCommandSource> context, SuggestionsBuilder builder) throws CommandSyntaxException {
ServerCommandSource source = context.getSource();
// Thankfully, the ServerCommandSource has a method to get a list of player names.
Collection<String> playerNames = source.getPlayerNames();
// 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();
}
}
Для использования этого поставщика предложений, просто передадите его экземпляр в метод .suggests
в конструктор аргументов.
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
dispatcher.register(CommandManager.literal("command_with_custom_suggestions").then(
CommandManager.argument("player_name", StringArgumentType.string())
.suggests(new PlayerSuggestionProvider())
.executes(FabricDocsReferenceCommands::executeCommandWithCustomSuggestions)
));
});
private static int executeCommandWithCustomSuggestions(CommandContext<ServerCommandSource> context) {
String name = StringArgumentType.getString(context, "player_name");
context.getSource().sendFeedback(() -> Text.literal("Called /command_with_custom_suggestions with value = %s".formatted(name)), false);
return 1;
}
Очевидно, что поставщики предложений могут быть более сложными, поскольку они также могут считывать контекст команды, чтобы предоставлять предложения на основе состояния команды, например аргументов, которые уже были предоставлены.
Это может быть в виде чтения инвентаря игрока и предлагать предметы, или сущностей вокруг игрока.