Skip to content

Befehlsvorschläge

Minecraft hat ein mächtiges System für Befehlsvorschläge, das an vielen Stellen verwendet wird, wie zum Beispiel beim Befehl /give. Mit diesem System kannst du dem Spieler Werte für Befehlsargumente vorschlagen, aus denen er dann auswählen kann - eine großartige Möglichkeit, um deine Befehle benutzerfreundlicher und ergonomischer zu gestalten.

Vorschlaganbieter

Ein SuggestionProvider wird verwendet, um eine Liste von Vorschlägen zu erstellen, die an den Spieler gesendet werden. Ein Vorschlaganbieter ist eine funktionales Interface, das einen CommandContext und einen SuggestionBuilder entgegennimmt und einige Suggestions zurückgibt. Der SuggestionProvider gibt ein CompletableFuture zurück, da die Vorschläge möglicherweise nicht sofort verfügbar sind.

Verwenden von Vorschlaganbietern

Um einen Vorschlaganbieter zu verwenden, musst du die Methode suggests auf dem Argument Builder aufrufen. Diese Methode nimmt einen SuggestionProvider und gibt den geänderten Argument Builder mit dem angehängten Suggestion Provider zurück.

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

Eingebaute Vorschlaganbieter

Es gibt einige eingebaute Vorschlaganbieter, du verwenden kannst:

VorschlaganbieterBeschreibung
SuggestionProviders.SUMMONABLE_ENTITIESSchläft alle Entitäten vor, die beschworen werden können.
SuggestionProviders.AVAILABLE_SOUNDSSchlägt alle Klänge vor, die abgespielt werden können.
LootCommand.SUGGESTION_PROVIDERZeigt alle verfügbaren Loottabellen an.
SuggestionProviders.ALL_BIOMESSchlägt alle Biome vor, die verfügbar sind.

Erstellen eines benutzerdefinierten Vorschlagsanbieters

Wenn ein eingebauter Anbieter deine Anforderungen nicht erfüllt, kannst du einen eigenen Vorschlaganbieter erstellen. Zu diesem Zweck musst du eine Klasse erstellen, die das Interface SuggestionProvider implementiert und die Methode getSuggestions überschreibt.

In diesem Beispiel erstellen wir einen Vorschlaganbieter, der alle Benutzernamen der Spieler auf dem Server vorschlägt.

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

Um diesen Vorschlaganbieter zu verwenden, übergebe einfach eine Instanz davon an die Methode .suggests im Argument Builder.

Natürlich können die Anbieter von Vorschlägen komplexer sein, da sie auch den Befehlskontext lesen können, um Vorschläge zu machen, die auf dem Zustand des Befehls basieren - zum Beispiel auf den Argumenten, die bereits angegeben wurden.

Dies könnte in Form von Lesen des Inventars des Spielers und Vorschlagen von Gegenständen oder Entitäten, die sich in der Nähe des Spielers befinden, geschehen.