From b3e218bd7d27b5f9e6c7b5fdda4792ea0d7b978c Mon Sep 17 00:00:00 2001 From: BBaoVanC Date: Tue, 1 Apr 2025 10:48:00 -0500 Subject: [PATCH] Show proxy-wide online players in server ping (#811) * Show proxy-wide online players in server ping * Reflow arguments in VelocityConfiguration constructor --- .../api/proxy/server/ServerPing.java | 4 ++++ .../proxy/config/VelocityConfiguration.java | 15 ++++++++++++-- .../util/ServerListPingHandler.java | 20 ++++++++++++++++++- .../src/main/resources/default-velocity.toml | 5 +++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/api/src/main/java/com/velocitypowered/api/proxy/server/ServerPing.java b/api/src/main/java/com/velocitypowered/api/proxy/server/ServerPing.java index 9a27dc05..4d906b7b 100644 --- a/api/src/main/java/com/velocitypowered/api/proxy/server/ServerPing.java +++ b/api/src/main/java/com/velocitypowered/api/proxy/server/ServerPing.java @@ -516,6 +516,10 @@ public final class ServerPing { */ public static final class SamplePlayer { + public static final SamplePlayer ANONYMOUS = new SamplePlayer( + "Anonymous Player", + new UUID(0L, 0L) + ); private final String name; private final UUID id; diff --git a/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java b/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java index bbd49f55..309004aa 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java @@ -78,6 +78,8 @@ public class VelocityConfiguration implements ProxyConfig { private boolean onlineModeKickExistingPlayers = false; @Expose private PingPassthroughMode pingPassthrough = PingPassthroughMode.DISABLED; + @Expose + private boolean samplePlayersInPing = false; private final Servers servers; private final ForcedHosts forcedHosts; @Expose @@ -105,8 +107,9 @@ public class VelocityConfiguration implements ProxyConfig { boolean preventClientProxyConnections, boolean announceForge, PlayerInfoForwarding playerInfoForwardingMode, byte[] forwardingSecret, boolean onlineModeKickExistingPlayers, PingPassthroughMode pingPassthrough, - boolean enablePlayerAddressLogging, Servers servers, ForcedHosts forcedHosts, - Advanced advanced, Query query, Metrics metrics, boolean forceKeyAuthentication) { + boolean samplePlayersInPing, boolean enablePlayerAddressLogging, Servers servers, + ForcedHosts forcedHosts, Advanced advanced, Query query, Metrics metrics, + boolean forceKeyAuthentication) { this.bind = bind; this.motd = motd; this.showMaxPlayers = showMaxPlayers; @@ -117,6 +120,7 @@ public class VelocityConfiguration implements ProxyConfig { this.forwardingSecret = forwardingSecret; this.onlineModeKickExistingPlayers = onlineModeKickExistingPlayers; this.pingPassthrough = pingPassthrough; + this.samplePlayersInPing = samplePlayersInPing; this.enablePlayerAddressLogging = enablePlayerAddressLogging; this.servers = servers; this.forcedHosts = forcedHosts; @@ -371,6 +375,10 @@ public class VelocityConfiguration implements ProxyConfig { return pingPassthrough; } + public boolean getSamplePlayersInPing() { + return samplePlayersInPing; + } + public boolean isPlayerAddressLoggingEnabled() { return enablePlayerAddressLogging; } @@ -507,6 +515,8 @@ public class VelocityConfiguration implements ProxyConfig { final PingPassthroughMode pingPassthroughMode = config.getEnumOrElse("ping-passthrough", PingPassthroughMode.DISABLED); + final boolean samplePlayersInPing = config.getOrElse("sample-players-in-ping", false); + final String bind = config.getOrElse("bind", "0.0.0.0:25565"); final int maxPlayers = config.getIntOrElse("show-max-players", 500); final boolean onlineMode = config.getOrElse("online-mode", true); @@ -537,6 +547,7 @@ public class VelocityConfiguration implements ProxyConfig { forwardingSecret, kickExisting, pingPassthroughMode, + samplePlayersInPing, enablePlayerAddressLogging, new Servers(serversConfig), new ForcedHosts(forcedHostsConfig), diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/util/ServerListPingHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/util/ServerListPingHandler.java index 97947eb6..d1f2b0db 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/util/ServerListPingHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/util/ServerListPingHandler.java @@ -30,10 +30,12 @@ import com.velocitypowered.proxy.config.VelocityConfiguration; import com.velocitypowered.proxy.server.VelocityRegisteredServer; import java.net.InetSocketAddress; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.Optional; import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; /** * Common utilities for handling server list ping results. @@ -51,11 +53,27 @@ public class ServerListPingHandler { version = ProtocolVersion.MAXIMUM_VERSION; } VelocityConfiguration configuration = server.getConfiguration(); + List samplePlayers; + if (configuration.getSamplePlayersInPing()) { + List unshuffledPlayers = server.getAllPlayers().stream() + .map(p -> { + if (p.getPlayerSettings().isClientListingAllowed()) { + return new ServerPing.SamplePlayer(p.getUsername(), p.getUniqueId()); + } else { + return ServerPing.SamplePlayer.ANONYMOUS; + } + }) + .collect(Collectors.toList()); + Collections.shuffle(unshuffledPlayers); + samplePlayers = unshuffledPlayers.subList(0, Math.min(12, server.getPlayerCount())); + } else { + samplePlayers = ImmutableList.of(); + } return new ServerPing( new ServerPing.Version(version.getProtocol(), "Velocity " + ProtocolVersion.SUPPORTED_VERSION_STRING), new ServerPing.Players(server.getPlayerCount(), configuration.getShowMaxPlayers(), - ImmutableList.of()), + samplePlayers), configuration.getMotd(), configuration.getFavicon().orElse(null), configuration.isAnnounceForge() ? ModInfo.DEFAULT : null diff --git a/proxy/src/main/resources/default-velocity.toml b/proxy/src/main/resources/default-velocity.toml index 5b0a1e27..2bd48723 100644 --- a/proxy/src/main/resources/default-velocity.toml +++ b/proxy/src/main/resources/default-velocity.toml @@ -66,6 +66,11 @@ kick-existing-players = false # configuration is used if no servers could be contacted. ping-passthrough = "DISABLED" +# If enabled (default is false), then a sample of the online players on the proxy will be visible +# when hovering over the player count in the server list. +# This doesn't have any effect when ping passthrough is set to either "description" or "all". +sample-players-in-ping = false + # If not enabled (default is true) player IP addresses will be replaced by in logs enable-player-address-logging = true