From 81d22900fa33392cbcc122eb5059e6d5216b6776 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Tue, 18 Oct 2022 23:25:10 +0200 Subject: [PATCH] Catcher that catches anything sent to the client in reset --- .../forge/FML2CRPMClientConnectionPhase.java | 12 ++++++- .../forge/FML2CRPMOutgoingCatcher.java | 35 +++++++++++++++++++ .../velocity/VelocityLoginPayloadManager.java | 3 -- 3 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/adde0109/ambassador/forge/FML2CRPMOutgoingCatcher.java diff --git a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMClientConnectionPhase.java index 9d27ec9..37bac1c 100644 --- a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMClientConnectionPhase.java @@ -10,6 +10,7 @@ import com.velocitypowered.proxy.config.VelocityConfiguration; import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; +import com.velocitypowered.proxy.network.Connections; import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; @@ -18,16 +19,19 @@ import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccess; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; +import net.kyori.adventure.identity.Identity; +import net.kyori.adventure.text.Component; import org.adde0109.ambassador.velocity.VelocityForgeClientConnectionPhase; import org.adde0109.ambassador.velocity.VelocityForgeHandshakeSessionHandler; import org.adde0109.ambassador.velocity.VelocityLoginPayloadManager; import java.util.ArrayList; +import java.util.NoSuchElementException; import java.util.UUID; import java.util.concurrent.CompletableFuture; public class FML2CRPMClientConnectionPhase implements VelocityForgeClientConnectionPhase { - private boolean isResettable; + private static String OUTBOUND_CATCHER_NAME = "ambassador-catcher"; //TODO: Use modData inside ConnectedPlayer instead public byte[] modListData; @@ -64,6 +68,7 @@ public class FML2CRPMClientConnectionPhase implements VelocityForgeClientConnect MinecraftConnection connection = player.getConnection(); connection.setSessionHandler(new VelocityForgeHandshakeSessionHandler(connection.getSessionHandler(),player)); + if (connection.getState() == StateRegistry.LOGIN) { payloadManager.sendPayload("fml:loginwrapper", Unpooled.wrappedBuffer(ForgeHandshakeUtils.generateResetPacket())); } else { @@ -76,6 +81,7 @@ public class FML2CRPMClientConnectionPhase implements VelocityForgeClientConnect }); this.clientPhase = null; + connection.getChannel().pipeline().addBefore(Connections.HANDLER,OUTBOUND_CATCHER_NAME,new FML2CRPMOutgoingCatcher()); } public void complete(VelocityServer server, ConnectedPlayer player, MinecraftConnection connection) { VelocityConfiguration configuration = (VelocityConfiguration) server.getConfiguration(); @@ -92,6 +98,10 @@ public class FML2CRPMClientConnectionPhase implements VelocityForgeClientConnect connection.setState(StateRegistry.PLAY); connection.setSessionHandler(((VelocityForgeHandshakeSessionHandler) connection.getSessionHandler()).getOriginal()); + try { + connection.getChannel().pipeline().remove(OUTBOUND_CATCHER_NAME); + } catch (NoSuchElementException ignored) { + } } public void handleKick(KickedFromServerEvent event) { diff --git a/src/main/java/org/adde0109/ambassador/forge/FML2CRPMOutgoingCatcher.java b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMOutgoingCatcher.java new file mode 100644 index 0000000..7af2872 --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/FML2CRPMOutgoingCatcher.java @@ -0,0 +1,35 @@ +package org.adde0109.ambassador.forge; + +import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; +import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccess; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOutboundHandlerAdapter; +import io.netty.channel.ChannelPromise; + +import java.util.*; + +public class FML2CRPMOutgoingCatcher extends ChannelOutboundHandlerAdapter { + + private final Map catchedPackets = Collections.synchronizedMap(new LinkedHashMap<>()); + + @Override + public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { + final Set> s = catchedPackets.entrySet(); + Iterator> i = s.iterator(); + while (catchedPackets.entrySet().iterator().hasNext()) { + final Map.Entry entry = i.next(); + ctx.write(entry.getValue(),entry.getKey()); + i.remove(); + } + ctx.flush(); + } + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + if (msg instanceof LoginPluginMessage || msg instanceof ServerLoginSuccess) { + ctx.write(msg, promise); + } else { + catchedPackets.put(promise,msg); + } + } +} diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityLoginPayloadManager.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityLoginPayloadManager.java index 010ce15..54d22eb 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityLoginPayloadManager.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityLoginPayloadManager.java @@ -5,12 +5,9 @@ import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import io.netty.buffer.ByteBuf; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.Future; public class VelocityLoginPayloadManager { private final HashMap> listenerList = new HashMap<>();