From 7bb75de67e40fa31c540ecaf314d7fcdb2d67342 Mon Sep 17 00:00:00 2001 From: Sara Freimer Date: Tue, 28 Jan 2025 15:35:13 -0600 Subject: [PATCH] Reimplement ClientCommandSourceStack#suggestRegistryElements for advancements, and override ClientCommandSourceStack#enabledFeatures to provide the enabled features instead of throwing a NPE --- .../client/ClientCommandSourceStack.java | 52 +++++++++++++------ 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/src/main/java/net/neoforged/neoforge/client/ClientCommandSourceStack.java b/src/main/java/net/neoforged/neoforge/client/ClientCommandSourceStack.java index 471b085f821..f02c8094b66 100644 --- a/src/main/java/net/neoforged/neoforge/client/ClientCommandSourceStack.java +++ b/src/main/java/net/neoforged/neoforge/client/ClientCommandSourceStack.java @@ -15,6 +15,7 @@ import java.util.stream.Collectors; import net.minecraft.advancements.AdvancementHolder; import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.commands.CommandSource; import net.minecraft.commands.CommandSourceStack; import net.minecraft.commands.SharedSuggestionProvider; @@ -27,6 +28,7 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.level.Level; import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; @@ -42,12 +44,21 @@ public ClientCommandSourceStack(CommandSource source, Vec3 position, Vec2 rotati super(source, position, rotation, null, permission, plainTextName, displayName, null, executing); } + /** + * {@return the current connection, used to shorten method calls and hide the nullability warnings} + */ + private ClientPacketListener connection() { + return Minecraft.getInstance().getConnection(); + } + /** * Sends a success message without attempting to get the server side list of admins */ @Override public void sendSuccess(Supplier message, boolean sendToAdmins) { - Minecraft.getInstance().gui.getChat().addMessage(message.get()); + if (this.source.acceptsSuccess() && !isSilent()) { + this.source.sendSystemMessage(message.get()); + } } /** @@ -55,7 +66,7 @@ public void sendSuccess(Supplier message, boolean sendToAdmins) { */ @Override public Collection getAllTeams() { - return Minecraft.getInstance().level.getScoreboard().getTeamNames(); + return getScoreboard().getTeamNames(); } /** @@ -63,20 +74,23 @@ public Collection getAllTeams() { */ @Override public Collection getOnlinePlayerNames() { - return Minecraft.getInstance().getConnection().getOnlinePlayers().stream().map((player) -> player.getProfile().getName()).collect(Collectors.toList()); + return connection().getOnlinePlayers().stream().map(player -> player.getProfile().getName()).collect(Collectors.toList()); } @Override public CompletableFuture suggestRegistryElements( - ResourceKey> p_212330_, - SharedSuggestionProvider.ElementSuggestionType p_212331_, - SuggestionsBuilder p_212332_, - CommandContext p_212333_) { - // TODO 1.21.2: Not sure what to do here. Letting super get called will cause an NPE on this.server. - if (p_212330_ == Registries.RECIPE || p_212330_ == Registries.ADVANCEMENT) { + ResourceKey> registry, + SharedSuggestionProvider.ElementSuggestionType suggestionType, + SuggestionsBuilder suggestionsBuilder, + CommandContext context) { + if (registry == Registries.RECIPE) { + // TODO 1.21.2: Not sure what to do here as the client doesn't receive recipe names. Letting super get called will cause an NPE on this.server. return Suggestions.empty(); + } else if (registry == Registries.ADVANCEMENT) { + //Only suggest from advancements that are visible to the player + return SharedSuggestionProvider.suggestResource(connection().getAdvancements().getTree().nodes().stream().map(node -> node.holder().id()), suggestionsBuilder); } - return super.suggestRegistryElements(p_212330_, p_212331_, p_212332_, p_212333_); + return super.suggestRegistryElements(registry, suggestionType, suggestionsBuilder, context); } /** @@ -84,7 +98,7 @@ public CompletableFuture suggestRegistryElements( */ @Override public Set> levels() { - return Minecraft.getInstance().getConnection().levels(); + return connection().levels(); } /** @@ -92,7 +106,15 @@ public Set> levels() { */ @Override public RegistryAccess registryAccess() { - return Minecraft.getInstance().getConnection().registryAccess(); + return connection().registryAccess(); + } + + /** + * {@return the {@link FeatureFlagSet } from the client side} + */ + @Override + public FeatureFlagSet enabledFeatures() { + return connection().enabledFeatures(); } /** @@ -100,7 +122,7 @@ public RegistryAccess registryAccess() { */ @Override public Scoreboard getScoreboard() { - return Minecraft.getInstance().level.getScoreboard(); + return connection().scoreboard(); } /** @@ -109,7 +131,7 @@ public Scoreboard getScoreboard() { @Override @Nullable public AdvancementHolder getAdvancement(ResourceLocation id) { - return Minecraft.getInstance().getConnection().getAdvancements().get(id); + return connection().getAdvancements().get(id); } /** @@ -117,7 +139,7 @@ public AdvancementHolder getAdvancement(ResourceLocation id) { */ @Override public Level getUnsidedLevel() { - return Minecraft.getInstance().level; + return connection().getLevel(); } /**