Minecraft має потужну систему пропозицій команд, що використовується у багатьох місцях, таких як команда /give. Ця система дозволяє пропонувати гравцю значення аргументу, які вони можуть вибрати, що є гарним засобом створення більш зручних та ергономічних команд.
Постачальники пропозицій
Клас SuggestionProvider використовується для створення списку пропозицій, які будуть надіслані гравцю. Постачальник пропозицій - це функція, що приймає об'єкти CommandContext та SuggestionBuilder, та повертає об'єкт Suggestions. SuggestionProvider повертає об'єкт CompletableFuture тому, що пропозиції можуть бути не доступні відразу.
Використання постачальників пропозицій
Для використання постачальника пропозицій треба викликати метод suggests в об'єкта ArgumentBuilder. Цей метод приймає об'єкт SuggestionProvider та повертає свій ArgumentBuilder з доданим постачальником пропозицій.
java
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)
));
});1
2
3
4
5
6
7
2
3
4
5
6
7
java
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;
}1
2
3
4
5
6
2
3
4
5
6
Вбудовані постачальники пропозицій
Minecraft надає декілька вбудованих постачальників пропозицій:
| Постачальник | Опис |
|---|---|
SuggestionProviders.SUMMONABLE_ENTITIES | Пропонує всі істоти, що можуть бути викликані. |
SuggestionProviders.AVAILABLE_SOUNDS | Пропонує всі звуки, що можуть бути зіграні. |
LootCommand.SUGGESTION_PROVIDER | Пропонує всі доступні таблиці здобичі. |
SuggestionProviders.ALL_BIOMES | Пропонує всі доступні біоми. |
Створити власний постачальник пропозицій
Якщо вбудовані постачальники пропозицій не підходять, ви можете створити свій постачальник. Для цього треба створити клас, який реалізує інтерфейс SuggestionProvider і перевизначає метод getSuggestions.
Для цього прикладу ми зробимо постачальник, який пропонує імена гравців на сервері.
java
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();
}
}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 у ArgumentBuilder.
java
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)
));
});1
2
3
4
5
6
7
2
3
4
5
6
7
java
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;
}1
2
3
4
5
6
2
3
4
5
6
Звісно, що постачальники пропозицій можуть бути складнішими, оскільки вони також можуть зчитувати контекст команди та надавати пропозиції на основі її стану - наприклад, аргументи, що вже були надані.
Це може також зчитувати інвентар гравця та пропонувати предмети, або сутностей, які неподалік від гравця.

