From 1a78c2ea24640a83d507fcaaee5b15c79c2a8937 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Tue, 22 Nov 2022 22:03:03 +0100 Subject: [PATCH] Improving stability --- .../org/adde0109/ambassador/Ambassador.java | 2 +- .../forge/FML2CRPMClientConnectionPhase.java | 19 +++++++-------- .../forge/FML2CRPMOutboundCatcher.java | 5 +++- ...java => FML2CRPMResetCompleteDecoder.java} | 23 ++++++++++--------- .../velocity/VelocityEventHandler.java | 6 ++--- .../VelocityForgeClientConnectionPhase.java | 1 + .../VelocityForgeBackendConnectionPhase.java | 5 ++-- 7 files changed, 34 insertions(+), 27 deletions(-) rename src/main/java/org/adde0109/ambassador/forge/{FML2CRPMResetCompleteListener.java => FML2CRPMResetCompleteDecoder.java} (57%) diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index 68f478e..ce6e2b4 100644 --- a/src/main/java/org/adde0109/ambassador/Ambassador.java +++ b/src/main/java/org/adde0109/ambassador/Ambassador.java @@ -25,7 +25,7 @@ import org.slf4j.Logger; import java.nio.file.Path; -@Plugin(id = "ambassador", name = "Ambassador", version = "1.1.4-alpha", authors = {"adde0109"}) +@Plugin(id = "ambassador", name = "Ambassador", version = "1.1.5-alpha", authors = {"adde0109"}) public class Ambassador { public ProxyServer server; diff --git a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMClientConnectionPhase.java index 9ba3083..feebe78 100644 --- a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMClientConnectionPhase.java @@ -24,8 +24,6 @@ import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; public class FML2CRPMClientConnectionPhase extends VelocityForgeClientConnectionPhase { - private static String OUTBOUND_CATCHER_NAME = "ambassador-catcher"; - private static String RESET_LISTENER = "ambassador-reset-listener"; //TODO: Use modData inside ConnectedPlayer instead public byte[] modListData; @@ -48,22 +46,26 @@ public class FML2CRPMClientConnectionPhase extends VelocityForgeClientConnection MinecraftConnection connection = player.getConnection(); connection.setSessionHandler(new VelocityForgeHandshakeSessionHandler(connection.getSessionHandler(),player)); - + serverConnection.getConnection().getChannel().config().setAutoRead(false); ScheduledFuture scheduledFuture = connection.eventLoop().schedule(()-> { - connection.getChannel().pipeline().remove(OUTBOUND_CATCHER_NAME); + connection.getChannel().pipeline().remove(ForgeConstants.OUTBOUND_CATCHER_NAME); + future.complete(false); - },5, TimeUnit.SECONDS); - connection.getChannel().pipeline().addBefore(Connections.MINECRAFT_DECODER,RESET_LISTENER,new FML2CRPMResetCompleteListener(() -> { + },300, TimeUnit.SECONDS); + connection.getChannel().pipeline().addBefore(Connections.MINECRAFT_DECODER,ForgeConstants.RESET_LISTENER,new FML2CRPMResetCompleteDecoder()); + getPayloadManager().listenFor(98).thenAccept(ignore -> { if (scheduledFuture.cancel(false)) { + connection.getChannel().pipeline().remove(ForgeConstants.RESET_LISTENER); connection.setState(StateRegistry.LOGIN); this.clientPhase = ClientPhase.HANDSHAKE; + serverConnection.getConnection().getChannel().config().setAutoRead(true); future.complete(true); } - })); + }); connection.write(new PluginMessage("fml:handshake",Unpooled.wrappedBuffer(ForgeHandshakeUtils.generatePluginResetPacket()))); this.clientPhase = null; - connection.getChannel().pipeline().addBefore(Connections.HANDLER,OUTBOUND_CATCHER_NAME,new FML2CRPMOutboundCatcher()); + connection.getChannel().pipeline().addBefore(Connections.HANDLER,ForgeConstants.OUTBOUND_CATCHER_NAME,new FML2CRPMOutboundCatcher()); return future; } public void complete(VelocityServer server, ConnectedPlayer player, MinecraftConnection connection) { @@ -82,7 +84,6 @@ public class FML2CRPMClientConnectionPhase extends VelocityForgeClientConnection connection.setState(StateRegistry.PLAY); connection.setSessionHandler(((VelocityForgeHandshakeSessionHandler) connection.getSessionHandler()).getOriginal()); - connection.getChannel().pipeline().remove(OUTBOUND_CATCHER_NAME); backupServer = null; } diff --git a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMOutboundCatcher.java b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMOutboundCatcher.java index af49533..1113a59 100644 --- a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMOutboundCatcher.java +++ b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMOutboundCatcher.java @@ -35,8 +35,11 @@ public class FML2CRPMOutboundCatcher extends ChannelOutboundHandlerAdapter { @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { - if (msg instanceof LoginPluginMessage || msg instanceof ServerLoginSuccess) { + if (msg instanceof LoginPluginMessage) { ctx.write(msg, promise); + } else if (msg instanceof ServerLoginSuccess) { + ctx.write(msg,promise); + ctx.pipeline().remove(this); } else { catchedPackets.put(promise,msg); } diff --git a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMResetCompleteListener.java b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMResetCompleteDecoder.java similarity index 57% rename from src/main/java/org/adde0109/ambassador/forge/FML2CRPMResetCompleteListener.java rename to src/main/java/org/adde0109/ambassador/forge/FML2CRPMResetCompleteDecoder.java index 44033ae..10e3874 100644 --- a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMResetCompleteListener.java +++ b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMResetCompleteDecoder.java @@ -1,18 +1,13 @@ package org.adde0109.ambassador.forge; +import com.velocitypowered.proxy.protocol.MinecraftPacket; import com.velocitypowered.proxy.protocol.ProtocolUtils; +import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.util.ReferenceCountUtil; -public class FML2CRPMResetCompleteListener extends ChannelInboundHandlerAdapter { - - final Runnable whenComplete; - - public FML2CRPMResetCompleteListener(Runnable whenComplete) { - this.whenComplete = whenComplete; - } +public class FML2CRPMResetCompleteDecoder extends ChannelInboundHandlerAdapter { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { @@ -25,10 +20,16 @@ public class FML2CRPMResetCompleteListener extends ChannelInboundHandlerAdapter int originalReaderIndex = buf.readerIndex(); int packetId = ProtocolUtils.readVarInt(buf); if (packetId == 0x02 && buf.readableBytes() > 1) { - ReferenceCountUtil.release(msg); - ctx.pipeline().remove(this); - whenComplete.run(); + try { + MinecraftPacket packet = new LoginPluginResponse(); + packet.decode(buf, ProtocolUtils.Direction.SERVERBOUND,null); + ctx.fireChannelRead(packet); + } finally { + buf.release(); + } return; + } else { + buf.readerIndex(originalReaderIndex); } } ctx.fireChannelRead(msg); diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java index acc43df..aaf4bf2 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java @@ -83,9 +83,9 @@ public class VelocityEventHandler { if (phase instanceof FML2ClientConnectionPhase specialPhase) { specialPhase.handleJoinGame(); } - //if (((ConnectedPlayer) event.getPlayer()).getConnectedServer() != null && ((ConnectedPlayer) event.getPlayer()).getConnectedServer().getConnection() != null) { - // ((ConnectedPlayer) event.getPlayer()).getConnectedServer().getConnection().write(new ClientSettings("en_GB", (byte) 10, 0, true, (short) 0xFF,1,false,true)); - //} + if (((ConnectedPlayer) event.getPlayer()).getConnectedServer() != null && ((ConnectedPlayer) event.getPlayer()).getConnectedServer().getConnection() != null) { + ((ConnectedPlayer) event.getPlayer()).getConnectedServer().getConnection().write(new ClientSettings("en_GB", (byte) 10, 0, true, (short) 0xFF,1,false,true)); + } continuation.resume(); } diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeClientConnectionPhase.java index 23e9bdf..1862bb4 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityForgeClientConnectionPhase.java @@ -55,6 +55,7 @@ public abstract class VelocityForgeClientConnectionPhase implements ClientConnec final public void forwardPayload(VelocityServerConnection serverConnection, LoginPluginMessage payload) { handleForward(serverConnection,payload); if (payloadManager == null) { + payload.release(); return; } payloadManager.sendPayload("fml:loginwrapper",payload.content()).thenAccept((responseData) -> { diff --git a/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendConnectionPhase.java index 3b62a23..b860d70 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendConnectionPhase.java @@ -5,6 +5,7 @@ import com.velocitypowered.proxy.connection.backend.BackendConnectionPhase; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; +import io.netty.buffer.ByteBuf; import io.netty.util.ReferenceCountUtil; import org.adde0109.ambassador.velocity.VelocityForgeClientConnectionPhase; @@ -27,12 +28,12 @@ public class VelocityForgeBackendConnectionPhase implements BackendConnectionPha public boolean handle(VelocityServerConnection server, ConnectedPlayer player, LoginPluginMessage message) throws Exception { VelocityForgeClientConnectionPhase clientPhase = ((VelocityForgeClientConnectionPhase) player.getPhase()); if (clientPhase.clientPhase == VelocityForgeClientConnectionPhase.ClientPhase.VANILLA) { - server.getConnection().getChannel().config().setAutoRead(false); message.retain(); clientPhase.reset(server,player).thenAccept((success) -> { if (success) { clientPhase.forwardPayload(server,message); - server.getConnection().getChannel().config().setAutoRead(true); + } else { + message.release(); } }); } else {