Skip to content

Пропозиції команд

Minecraft має потужну систему пропозицій команд, що використовується у багатьох місцях, таких як команда /give. Ця система дозволяє пропонувати гравцю значення аргументу, які вони можуть вибрати, що є гарним засобом створення більш зручних та ергономічних команд.

Постачальники пропозицій

Клас SuggestionProvider використовується для створення списку пропозицій, які будуть надіслані гравцю. Постачальник пропозицій - це функція, що приймає об'єкти CommandContext та SuggestionBuilder, та повертає об'єкт Suggestions. SuggestionProvider повертає об'єкт CompletableFuture тому, що пропозиції можуть бути не доступні відразу.

Використання постачальників пропозицій

Для використання постачальника пропозицій треба викликати метод suggests в об'єкта ArgumentBuilder. Цей метод приймає об'єкт SuggestionProvider та повертає свій ArgumentBuilder з доданим постачальником пропозицій.

java
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
	dispatcher.register(CommandManager.literal("entity_name").then(
			CommandManager.argument("entity", EntityArgumentType.entity())
					.suggests(SuggestionProviders.SUMMONABLE_ENTITIES)
					.executes(context -> {
						EntityType<?> entityType = EntityArgumentType.getEntity(context, "entity").getType();
						context.getSource().sendFeedback(
								() -> Text.literal("Called /subtater2 with entity: ")
										.append(
												Text.translatable(entityType.getTranslationKey())
										),
								false);
						return 1;
					})
	));
});

Вбудовані постачальники пропозицій

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();
	}
}

Щоб скористатися цим постачальником, треба просто передати його об'єкт у метод .suggests у ArgumentBuilder.

Звісно, що постачальники пропозицій можуть бути складнішими, оскільки вони також можуть зчитувати контекст команди та надавати пропозиції на основі її стану - наприклад, аргументи, що вже були надані.

Це може також зчитувати інвентар гравця та пропонувати предмети, або істот, які неподалік від гравця.