From 1b59fbae1a632d7d5417bf3b44d27f2c55bb9145 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Fri, 12 May 2023 19:25:25 +0200 Subject: [PATCH] Added Server Redirect support --- build.gradle.kts | 2 +- .../VelocityForgeClientConnectionPhase.java | 16 ++++++++++++++-- .../backend/ForgeLoginSessionHandler.java | 6 +++--- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 8d49cc1..15657ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "org.adde0109" -version = "1.4.0-beta-rc1" +version = "1.4.0-beta-rc2" repositories { mavenCentral() diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index f909f4b..66bb7e8 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -8,9 +8,11 @@ import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.client.ClientConnectionPhase; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.network.Connections; +import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.PluginMessage; +import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import net.kyori.adventure.text.Component; import org.adde0109.ambassador.Ambassador; @@ -21,6 +23,7 @@ import org.adde0109.ambassador.velocity.client.FML2CRPMResetCompleteDecoder; import org.adde0109.ambassador.velocity.client.OutboundSuccessHolder; import org.adde0109.ambassador.velocity.client.ClientPacketQueue; +import java.nio.charset.StandardCharsets; import java.util.concurrent.TimeUnit; public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase { @@ -118,8 +121,17 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase public void resetConnectionPhase(ConnectedPlayer player) { Ambassador.getTemporaryForced().put(player.getUsername(), player.getConnectionInFlight().getServer(), Ambassador.getInstance().config.getServerSwitchCancellationTime(), TimeUnit.SECONDS); - //Disconnect - Reset Timeout - player.disconnect(Ambassador.getInstance().config.getDisconnectResetMessage()); + //Disconnect - Reset + if(player.getKnownChannels().contains("srvredirect:red") && player.getVirtualHost().isPresent()) { + ByteBuf buf = Unpooled.buffer(); + ProtocolUtils.writeVarInt(buf, 0); + buf.writeBytes((player.getVirtualHost().get().getHostName() + ":" + + player.getVirtualHost().get().getPort()).getBytes(StandardCharsets.UTF_8)); + player.getConnection().write(new PluginMessage("srvredirect:red", buf)); + player.getConnection().close(); + } else { + player.disconnect(Ambassador.getInstance().config.getDisconnectResetMessage()); + } } @Override diff --git a/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java b/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java index 5fdd2b1..529e1c3 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java @@ -51,9 +51,9 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler { if (player.getConnectedServer() == null) { //Initial Vanilla //Send empty mod list in order to get client mod list - ((VelocityForgeClientConnectionPhase) player.getPhase()).sendVanillaModlist(player); - player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false); - //((VelocityForgeClientConnectionPhase) player.getPhase()).complete(player); + //((VelocityForgeClientConnectionPhase) player.getPhase()).sendVanillaModlist(player); + //player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false); + ((VelocityForgeClientConnectionPhase) player.getPhase()).complete(player); } else if (player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) { //Forge -> vanilla player.getPhase().resetConnectionPhase(player);