From 08bdfe9b222c274a8b1f8af5b57584283b85d4e2 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Thu, 13 Apr 2023 20:21:36 +0200 Subject: [PATCH] Fixed pluginloginpacket queue --- build.gradle.kts | 2 +- .../org/adde0109/ambassador/Ambassador.java | 2 +- .../VelocityForgeBackendConnectionPhase.java | 3 ++ .../VelocityForgeClientConnectionPhase.java | 1 + .../backend/ForgeLoginSessionHandler.java | 32 +++++++++++++------ .../client/PluginLoginPacketQueue.java | 22 +++++++++---- 6 files changed, 44 insertions(+), 18 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index b96bff3..73758b5 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } group = "org.adde0109" -version = "1.3.1-beta" +version = "1.3.2-beta-rc8" repositories { mavenCentral() diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index 7399529..542d71c 100644 --- a/src/main/java/org/adde0109/ambassador/Ambassador.java +++ b/src/main/java/org/adde0109/ambassador/Ambassador.java @@ -40,7 +40,7 @@ import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19; import static com.velocitypowered.api.network.ProtocolVersion.MINECRAFT_1_19_3; import static com.velocitypowered.proxy.protocol.packet.brigadier.ArgumentIdentifier.mapSet; -@Plugin(id = "ambassador", name = "Ambassador", version = "1.3.1-beta", authors = {"adde0109"}) +@Plugin(id = "ambassador", name = "Ambassador", version = "1.3.2-beta-rc4", authors = {"adde0109"}) public class Ambassador { public ProxyServer server; diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java index 0c1c7f5..75a4092 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java @@ -60,6 +60,9 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas //Reset client if not ready to receive new handshake VelocityForgeClientConnectionPhase clientPhase = (VelocityForgeClientConnectionPhase) player.getPhase(); clientPhase.resetConnectionPhase(player); + //Forge server + //To avoid unnecessary resets, we wait until we get the handshake even if we know that we should + //reset because that the previous server was Forge. player.getConnection().write(message.retain()); ForgeLoginWrapperDecoder decoder = (ForgeLoginWrapperDecoder) player.getConnection() diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index fc0c219..75c7092 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -89,6 +89,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(true); if (!(server.getConnection().getType() instanceof ForgeFMLConnectionType)) { + //Forge -> Vanilla MinecraftConnection connection = player.getConnection(); ((OutboundSuccessHolder) connection.getChannel().pipeline().get(ForgeConstants.SERVER_SUCCESS_LISTENER)) .sendPacket(); 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 579a734..bc5a3fe 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java @@ -1,5 +1,6 @@ package org.adde0109.ambassador.velocity.backend; +import com.velocitypowered.api.network.ProtocolVersion; import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.MinecraftSessionHandler; @@ -15,6 +16,7 @@ import org.adde0109.ambassador.Ambassador; import org.adde0109.ambassador.forge.ForgeConstants; import org.adde0109.ambassador.forge.ForgeFMLConnectionType; import org.adde0109.ambassador.forge.VelocityForgeBackendConnectionPhase; +import org.adde0109.ambassador.forge.VelocityForgeClientConnectionPhase; import org.adde0109.ambassador.velocity.client.OutboundSuccessHolder; public class ForgeLoginSessionHandler implements MinecraftSessionHandler { @@ -49,15 +51,20 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler { } ConnectedPlayer player = serverConnection.getPlayer(); - if (!(serverConnection.getConnection().getType() instanceof ForgeFMLConnectionType) && player.getConnectedServer() != null && - player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) { + if (player.getConnectedServer() != null && player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) { + //Forge -> vanilla + //Has not already been reset + //Not for Vanilla -> Vanilla player.getPhase().resetConnectionPhase(player); - } else if (player.getConnectedServer() == null) { + } else if (player.getConnection().getState() == StateRegistry.LOGIN) { + //Initial vanilla + //Vanilla -> Forge MinecraftConnection connection = player.getConnection(); ((OutboundSuccessHolder) connection.getChannel().pipeline().get(ForgeConstants.SERVER_SUCCESS_LISTENER)) .sendPacket(); connection.setState(StateRegistry.PLAY); - connection.getChannel().pipeline().remove(ForgeConstants.PLUGIN_PACKET_QUEUE); + if (connection.getChannel().pipeline().toMap().containsKey(ForgeConstants.PLUGIN_PACKET_QUEUE)) + connection.getChannel().pipeline().remove(ForgeConstants.PLUGIN_PACKET_QUEUE); ((VelocityServer) Ambassador.getInstance().server).registerConnection(player); } @@ -80,12 +87,17 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler { @Override public void disconnected() { - if (!serverConnection.getPhase().consideredComplete()) { - serverConnection.getPlayer().handleConnectionException(serverConnection.getServer(), - Disconnect.create(Component.text("Ambassador: Backend server disconnected during handshake could be: " + - "mismatched mods OR bad player-forwarding config"), - serverConnection.getPlayer().getProtocolVersion()),false); - return; + if (!serverConnection.getPhase().consideredComplete() + && serverConnection.getPlayer().getPhase() != VelocityForgeClientConnectionPhase.NOT_STARTED) { + int protocolVersion = serverConnection.getConnection().getProtocolVersion().getProtocol(); + if (protocolVersion <= ProtocolVersion.MINECRAFT_1_16_4.getProtocol()) { + serverConnection.getPlayer().handleConnectionException(serverConnection.getServer(), + Disconnect.create(Component.text("Ambassador: Backend server disconnected during handshake." + + ((protocolVersion <= ProtocolVersion.MINECRAFT_1_16_4.getProtocol()) ? + "Could be mismatched mods." : "")), + serverConnection.getPlayer().getProtocolVersion()),false); + return; + } } original.disconnected(); } diff --git a/src/main/java/org/adde0109/ambassador/velocity/client/PluginLoginPacketQueue.java b/src/main/java/org/adde0109/ambassador/velocity/client/PluginLoginPacketQueue.java index 6c87e3e..36f8af0 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/client/PluginLoginPacketQueue.java +++ b/src/main/java/org/adde0109/ambassador/velocity/client/PluginLoginPacketQueue.java @@ -1,8 +1,14 @@ package org.adde0109.ambassador.velocity.client; +import com.velocitypowered.proxy.connection.MinecraftConnection; +import com.velocitypowered.proxy.protocol.MinecraftPacket; +import com.velocitypowered.proxy.protocol.ProtocolUtils; +import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.netty.MinecraftEncoder; +import com.velocitypowered.proxy.protocol.util.DeferredByteBufHolder; import io.netty.channel.*; import io.netty.handler.codec.EncoderException; +import io.netty.util.ReferenceCountUtil; public class PluginLoginPacketQueue extends ChannelOutboundHandlerAdapter { @@ -16,13 +22,17 @@ public class PluginLoginPacketQueue extends ChannelOutboundHandlerAdapter { @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - MinecraftEncoder encoder = ctx.pipeline().get(MinecraftEncoder.class); - try { - encoder.write(ctx, msg, promise); - } catch (EncoderException e) { - if (e.getCause() instanceof IllegalArgumentException) { - queue.add(msg,promise); + MinecraftConnection connection = ctx.pipeline().get(MinecraftConnection.class); + if (connection.getState() == StateRegistry.LOGIN && msg instanceof MinecraftPacket packet) { + try { + StateRegistry.LOGIN.getProtocolRegistry(ProtocolUtils.Direction.CLIENTBOUND , + connection.getProtocolVersion()).getPacketId(packet); + ctx.write(msg,promise); + } catch (IllegalArgumentException e) { + queue.add(msg, promise); } + } else { + ctx.write(msg,promise); } }