From f79f83a27d04a8d74967fefa486e1ff45392ab13 Mon Sep 17 00:00:00 2001 From: onePlaceholder Date: Sun, 22 Mar 2026 19:39:05 +0100 Subject: [PATCH 1/3] Added "secure_mix" player-info-forwarding-mode, for server mixed version environment --- .../proxy/config/PlayerInfoForwarding.java | 3 ++- .../proxy/config/VelocityConfiguration.java | 5 +++-- .../connection/backend/LoginSessionHandler.java | 12 +++++++++--- .../connection/backend/VelocityServerConnection.java | 3 ++- proxy/src/main/resources/default-velocity.toml | 3 +++ 5 files changed, 19 insertions(+), 7 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/config/PlayerInfoForwarding.java b/proxy/src/main/java/com/velocitypowered/proxy/config/PlayerInfoForwarding.java index 58ee44a78b..dea76a94e2 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/config/PlayerInfoForwarding.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/config/PlayerInfoForwarding.java @@ -24,5 +24,6 @@ public enum PlayerInfoForwarding { NONE, LEGACY, BUNGEEGUARD, - MODERN + MODERN, + SECURE_MIX } 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 8dd8d3279f..20bc84cb1e 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/config/VelocityConfiguration.java @@ -159,7 +159,7 @@ public boolean validate() { switch (playerInfoForwardingMode) { case NONE -> logger.warn("Player info forwarding is disabled! All players will appear to be connecting " + "from the proxy and will have offline-mode UUIDs."); - case MODERN, BUNGEEGUARD -> { + case MODERN, BUNGEEGUARD, SECURE_MIX -> { if (forwardingSecret == null || forwardingSecret.length == 0) { logger.error("You don't have a forwarding secret set. This is required for security."); valid = false; @@ -565,7 +565,8 @@ public static VelocityConfiguration read(Path path) throws IOException { // forwarding mode that requires it. if (forwardingSecret.length == 0 && (forwardingMode == PlayerInfoForwarding.MODERN - || forwardingMode == PlayerInfoForwarding.BUNGEEGUARD)) { + || forwardingMode == PlayerInfoForwarding.BUNGEEGUARD + || forwardingMode == PlayerInfoForwarding.SECURE_MIX)) { throw new RuntimeException("The forwarding-secret file must not be empty."); } diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java index 14884af467..75c40b6374 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java @@ -83,7 +83,9 @@ public boolean handle(EncryptionRequestPacket packet) { public boolean handle(LoginPluginMessagePacket packet) { MinecraftConnection mc = serverConn.ensureConnected(); VelocityConfiguration configuration = server.getConfiguration(); - if (configuration.getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN + if ((configuration.getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN || + (configuration.getPlayerInfoForwardingMode() == PlayerInfoForwarding.SECURE_MIX + && mc.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_13))) && packet.getChannel().equals(PlayerDataForwarding.CHANNEL)) { int requestedForwardingVersion = PlayerDataForwarding.MODERN_DEFAULT; @@ -143,7 +145,12 @@ public boolean handle(SetCompressionPacket packet) { @Override public boolean handle(ServerLoginSuccessPacket packet) { - if (server.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN && !informationForwarded) { + MinecraftConnection smc = serverConn.ensureConnected(); + + if ((server.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN || + (server.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.SECURE_MIX && + !smc.getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_13))) + && !informationForwarded) { resultFuture.complete(ConnectionRequestResults.forDisconnect(MODERN_IP_FORWARDING_FAILURE, serverConn.getServer())); serverConn.disconnect(); return true; @@ -153,7 +160,6 @@ public boolean handle(ServerLoginSuccessPacket packet) { // other problems that could arise before we get a JoinGame packet from the server. // Move into the PLAY phase. - MinecraftConnection smc = serverConn.ensureConnected(); if (smc.getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_20_2)) { smc.setActiveSessionHandler(StateRegistry.PLAY, new TransitionSessionHandler(server, serverConn, resultFuture)); } else { diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java index c40a7aaac6..8c95971202 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java @@ -175,7 +175,8 @@ private void startHandshake() { handshake.setProtocolVersion(protocolVersion); if (forwardingMode == PlayerInfoForwarding.LEGACY) { handshake.setServerAddress(createLegacyForwardingAddress()); - } else if (forwardingMode == PlayerInfoForwarding.BUNGEEGUARD) { + } else if (forwardingMode == PlayerInfoForwarding.BUNGEEGUARD || + (forwardingMode == PlayerInfoForwarding.SECURE_MIX && protocolVersion.lessThan(ProtocolVersion.MINECRAFT_1_13))) { byte[] secret = server.getConfiguration().getForwardingSecret(); handshake.setServerAddress(createBungeeGuardForwardingAddress(secret)); } else if (proxyPlayer.getConnection().getType() == ConnectionTypes.LEGACY_FORGE) { diff --git a/proxy/src/main/resources/default-velocity.toml b/proxy/src/main/resources/default-velocity.toml index 4d71e589b9..291e91cf93 100644 --- a/proxy/src/main/resources/default-velocity.toml +++ b/proxy/src/main/resources/default-velocity.toml @@ -34,6 +34,9 @@ prevent-client-proxy-connections = false # unable to implement network level firewalling (on a shared host). # - "modern": Forward player IPs and UUIDs as part of the login process using # Velocity's native forwarding. Only applicable for Minecraft 1.13 or higher. +# - "secure_mix": Forward player IPs and UUIDs as part of the login process using +# Velocity's native forwarding on Minecraft 1.13 or higher servers or in a +# format supported by the BungeeGuard plugin on others. player-info-forwarding-mode = "NONE" # If you are using modern or BungeeGuard IP forwarding, configure a file that contains a unique secret here. From 19d08bccfab78859ef300eb608314949a0a5371a Mon Sep 17 00:00:00 2001 From: onePlaceholder Date: Sun, 22 Mar 2026 19:51:28 +0100 Subject: [PATCH 2/3] Fix formatting issue. --- .../proxy/connection/backend/LoginSessionHandler.java | 10 +++++----- .../connection/backend/VelocityServerConnection.java | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java index 75c40b6374..9ff29ffdc8 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java @@ -83,8 +83,8 @@ public boolean handle(EncryptionRequestPacket packet) { public boolean handle(LoginPluginMessagePacket packet) { MinecraftConnection mc = serverConn.ensureConnected(); VelocityConfiguration configuration = server.getConfiguration(); - if ((configuration.getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN || - (configuration.getPlayerInfoForwardingMode() == PlayerInfoForwarding.SECURE_MIX + if ((configuration.getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN + || (configuration.getPlayerInfoForwardingMode() == PlayerInfoForwarding.SECURE_MIX && mc.getProtocolVersion().greaterThan(ProtocolVersion.MINECRAFT_1_13))) && packet.getChannel().equals(PlayerDataForwarding.CHANNEL)) { @@ -147,9 +147,9 @@ public boolean handle(SetCompressionPacket packet) { public boolean handle(ServerLoginSuccessPacket packet) { MinecraftConnection smc = serverConn.ensureConnected(); - if ((server.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN || - (server.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.SECURE_MIX && - !smc.getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_13))) + if ((server.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.MODERN + || (server.getConfiguration().getPlayerInfoForwardingMode() == PlayerInfoForwarding.SECURE_MIX + && !smc.getProtocolVersion().lessThan(ProtocolVersion.MINECRAFT_1_13))) && !informationForwarded) { resultFuture.complete(ConnectionRequestResults.forDisconnect(MODERN_IP_FORWARDING_FAILURE, serverConn.getServer())); serverConn.disconnect(); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java index 8c95971202..242879e19e 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/VelocityServerConnection.java @@ -175,8 +175,8 @@ private void startHandshake() { handshake.setProtocolVersion(protocolVersion); if (forwardingMode == PlayerInfoForwarding.LEGACY) { handshake.setServerAddress(createLegacyForwardingAddress()); - } else if (forwardingMode == PlayerInfoForwarding.BUNGEEGUARD || - (forwardingMode == PlayerInfoForwarding.SECURE_MIX && protocolVersion.lessThan(ProtocolVersion.MINECRAFT_1_13))) { + } else if (forwardingMode == PlayerInfoForwarding.BUNGEEGUARD + || (forwardingMode == PlayerInfoForwarding.SECURE_MIX && protocolVersion.lessThan(ProtocolVersion.MINECRAFT_1_13))) { byte[] secret = server.getConfiguration().getForwardingSecret(); handshake.setServerAddress(createBungeeGuardForwardingAddress(secret)); } else if (proxyPlayer.getConnection().getType() == ConnectionTypes.LEGACY_FORGE) { From a7a1d70a9fd34fa92481722f1ccd46e3b56098d5 Mon Sep 17 00:00:00 2001 From: thePlaceholder <68772026+onePlaceholder@users.noreply.github.com> Date: Fri, 17 Apr 2026 07:51:11 +0200 Subject: [PATCH 3/3] Update gradle.yml --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 865c9390de..86b2d43975 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -2,7 +2,7 @@ # For more information see: https://docs.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle name: Java CI with Gradle -on: [push, pull_request] +on: [push, pull_request, workflow_dispatch] jobs: build: