minecraft-src/net/minecraft/server/commands/DebugConfigCommand.java
2025-09-18 12:27:44 +00:00

121 lines
4.7 KiB
Java

package net.minecraft.server.commands;
import com.mojang.authlib.GameProfile;
import com.mojang.brigadier.CommandDispatcher;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import net.minecraft.commands.CommandBuildContext;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.commands.SharedSuggestionProvider;
import net.minecraft.commands.arguments.EntityArgument;
import net.minecraft.commands.arguments.ResourceOrIdArgument;
import net.minecraft.commands.arguments.UuidArgument;
import net.minecraft.core.Holder;
import net.minecraft.network.Connection;
import net.minecraft.network.chat.Component;
import net.minecraft.network.protocol.common.ClientboundShowDialogPacket;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.dialog.Dialog;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerConfigurationPacketListenerImpl;
import org.jetbrains.annotations.Nullable;
public class DebugConfigCommand {
public static void register(CommandDispatcher<CommandSourceStack> dispatcher, CommandBuildContext context) {
dispatcher.register(
Commands.literal("debugconfig")
.requires(Commands.hasPermission(3))
.then(
Commands.literal("config")
.then(
Commands.argument("target", EntityArgument.player())
.executes(commandContext -> config(commandContext.getSource(), EntityArgument.getPlayer(commandContext, "target")))
)
)
.then(
Commands.literal("unconfig")
.then(
Commands.argument("target", UuidArgument.uuid())
.suggests(
(commandContext, suggestionsBuilder) -> SharedSuggestionProvider.suggest(getUuidsInConfig(commandContext.getSource().getServer()), suggestionsBuilder)
)
.executes(commandContext -> unconfig(commandContext.getSource(), UuidArgument.getUuid(commandContext, "target")))
)
)
.then(
Commands.literal("dialog")
.then(
Commands.argument("target", UuidArgument.uuid())
.suggests(
(commandContext, suggestionsBuilder) -> SharedSuggestionProvider.suggest(getUuidsInConfig(commandContext.getSource().getServer()), suggestionsBuilder)
)
.then(
Commands.argument("dialog", ResourceOrIdArgument.dialog(context))
.executes(
commandContext -> showDialog(
(CommandSourceStack)commandContext.getSource(),
UuidArgument.getUuid(commandContext, "target"),
ResourceOrIdArgument.getDialog(commandContext, "dialog")
)
)
)
)
)
);
}
private static Iterable<String> getUuidsInConfig(MinecraftServer server) {
Set<String> set = new HashSet();
for (Connection connection : server.getConnection().getConnections()) {
if (connection.getPacketListener() instanceof ServerConfigurationPacketListenerImpl serverConfigurationPacketListenerImpl) {
set.add(serverConfigurationPacketListenerImpl.getOwner().getId().toString());
}
}
return set;
}
private static int config(CommandSourceStack source, ServerPlayer target) {
GameProfile gameProfile = target.getGameProfile();
target.connection.switchToConfig();
source.sendSuccess(() -> Component.literal("Switched player " + gameProfile.getName() + "(" + gameProfile.getId() + ") to config mode"), false);
return 1;
}
@Nullable
private static ServerConfigurationPacketListenerImpl findConfigPlayer(MinecraftServer server, UUID target) {
for (Connection connection : server.getConnection().getConnections()) {
if (connection.getPacketListener() instanceof ServerConfigurationPacketListenerImpl serverConfigurationPacketListenerImpl
&& serverConfigurationPacketListenerImpl.getOwner().getId().equals(target)) {
return serverConfigurationPacketListenerImpl;
}
}
return null;
}
private static int unconfig(CommandSourceStack source, UUID target) {
ServerConfigurationPacketListenerImpl serverConfigurationPacketListenerImpl = findConfigPlayer(source.getServer(), target);
if (serverConfigurationPacketListenerImpl != null) {
serverConfigurationPacketListenerImpl.returnToWorld();
return 1;
} else {
source.sendFailure(Component.literal("Can't find player to unconfig"));
return 0;
}
}
private static int showDialog(CommandSourceStack source, UUID target, Holder<Dialog> dialog) {
ServerConfigurationPacketListenerImpl serverConfigurationPacketListenerImpl = findConfigPlayer(source.getServer(), target);
if (serverConfigurationPacketListenerImpl != null) {
serverConfigurationPacketListenerImpl.send(new ClientboundShowDialogPacket(dialog));
return 1;
} else {
source.sendFailure(Component.literal("Can't find player to talk to"));
return 0;
}
}
}