diff --git a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/SendCommand.java b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/SendCommand.java index 38f6b943d..81b562bf3 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/SendCommand.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/command/builtin/SendCommand.java @@ -27,8 +27,10 @@ import com.velocitypowered.api.command.BrigadierCommand; import com.velocitypowered.api.command.CommandSource; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.ServerConnection; import com.velocitypowered.api.proxy.server.RegisteredServer; import java.util.Objects; +import java.util.Optional; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.util.TriState; @@ -58,10 +60,22 @@ public class SendCommand { ArgumentCommandNode playerNode = RequiredArgumentBuilder .argument("player", StringArgumentType.word()) .suggests((context, builder) -> { + String argument = context.getArguments().containsKey(PLAYER_ARG) + ? context.getArgument(PLAYER_ARG, String.class) + : ""; for (Player player : server.getAllPlayers()) { - builder.suggest(player.username()); + String playerName = player.username(); + if (playerName.regionMatches(true, 0, argument, 0, argument.length())) { + builder.suggest(playerName); + } + } + if ("all".regionMatches(true, 0, argument, 0, argument.length())) { + builder.suggest("all"); + } + if ("current".regionMatches(true, 0, argument, 0, argument.length()) + && context.getSource() instanceof Player) { + builder.suggest("current"); } - builder.suggest("all"); return builder.buildFuture(); }) .executes(this::usage) @@ -99,7 +113,8 @@ public class SendCommand { return 0; } - if (server.getPlayer(player).isEmpty() && !Objects.equals(player, "all")) { + if (server.getPlayer(player).isEmpty() + && !Objects.equals(player, "all") && !Objects.equals(player, "current")) { context.getSource().sendMessage( CommandMessages.PLAYER_NOT_FOUND.args(Component.text(player)) ); @@ -113,6 +128,23 @@ public class SendCommand { return 1; } + if (Objects.equals(player, "current")) { + if (!(context.getSource() instanceof Player)) { + context.getSource().sendMessage(CommandMessages.PLAYERS_ONLY); + return 0; + } + + Player source = (Player) context.getSource(); + Optional connectedServer = source.connectedServer(); + if (connectedServer.isPresent()) { + for (Player p : connectedServer.get().server().players()) { + p.createConnectionRequest(server.getServer(serverName).get()).fireAndForget(); + } + return 1; + } + return 0; + } + server.getPlayer(player).get().createConnectionRequest( server.getServer(serverName).get() ).fireAndForget();