From c3ae255be6ffbe7c04382911e4efb40ec876ed3b Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Mon, 27 Nov 2023 17:56:56 +0100 Subject: [PATCH] Fixed some things --- .../VelocityForgeBackendConnectionPhase.java | 8 +++--- .../VelocityForgeClientConnectionPhase.java | 4 +-- .../GenericForgeLoginWrapperPacket.java | 2 +- .../forge/packet/ModListPacket.java | 11 ++++---- .../pipeline/ForgeLoginWrapperCodec.java | 7 +++++- .../pipeline/ForgeLoginWrapperHandler.java | 25 ++++++++++++++++--- .../velocity/VelocityEventHandler.java | 3 ++- .../backend/ForgeLoginSessionHandler.java | 13 ---------- .../VelocityForgeBackendHandshakeHandler.java | 9 ++++--- 9 files changed, 47 insertions(+), 35 deletions(-) diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java index 34ad2bc..6786dbe 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java @@ -9,6 +9,8 @@ import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.AvailableCommands; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.PluginMessage; +import org.adde0109.ambassador.forge.packet.Context; +import org.adde0109.ambassador.forge.packet.IForgeLoginWrapperPacket; import org.adde0109.ambassador.forge.pipeline.CommandDecoderErrorCatcher; import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperCodec; @@ -57,8 +59,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas VelocityForgeBackendConnectionPhase() { } - public void handle(VelocityServerConnection server, ConnectedPlayer player, LoginPluginMessage message) { - + public void handle(VelocityServerConnection server, ConnectedPlayer player, IForgeLoginWrapperPacket message) { VelocityForgeBackendConnectionPhase newPhase = getNewPhase(server,message); server.setConnectionPhase(newPhase); @@ -75,7 +76,6 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas return; } } - message.retain(); player.getConnection().write(message); //Forge server //To avoid unnecessary resets, we wait until we get the handshake even if we know that we should @@ -93,7 +93,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas } private VelocityForgeBackendConnectionPhase getNewPhase(VelocityServerConnection serverConnection, - LoginPluginMessage packet) { + IForgeLoginWrapperPacket packet) { VelocityForgeBackendConnectionPhase phaseToTransitionTo = nextPhase(); if (phaseToTransitionTo != this) { phaseToTransitionTo.onTransitionToNewPhase(serverConnection); diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index 9d946b4..cddb665 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -148,7 +148,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase public ModListReplyPacket clientModList; - public boolean handle(ConnectedPlayer player, IForgeLoginWrapperPacket msg, VelocityServerConnection server) { + public boolean handle(ConnectedPlayer player, IForgeLoginWrapperPacket msg, VelocityServerConnection server) { player.setPhase(nextPhase()); if (msg instanceof ModListReplyPacket replyPacket) { @@ -164,7 +164,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase replyPacket.getChannels().put(MinecraftChannelIdentifier.from("ambassador:commands"),"1"); } - player.getConnectionInFlight().getConnection().write(msg.encode()); + player.getConnectionInFlight().getConnection().write(msg); return true; } diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java index e18a768..45d5878 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java @@ -15,7 +15,7 @@ public class GenericForgeLoginWrapperPacket extends DeferredB static public GenericForgeLoginWrapperPacket create(ByteBuf input, Context context) { - return new GenericForgeLoginWrapperPacket<>(input, context); + return new GenericForgeLoginWrapperPacket<>(input.retain(), context); } @Override diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java index 37da596..3343077 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java @@ -27,7 +27,7 @@ public class ModListPacket implements IForgeLoginWrapperPacket { this.dataPackRegistries = dataPackRegistries; } - public static ModListPacket read(ByteBuf input, Context context) { + public static ModListPacket read(ByteBuf input, Context context, boolean FML3) { List mods = new ArrayList<>(); int len = ProtocolUtils.readVarInt(input); @@ -45,8 +45,9 @@ public class ModListPacket implements IForgeLoginWrapperPacket { for (int x = 0; x < len; x++) registries.add(ProtocolUtils.readString(input, 32767)); - List dataPackRegistries = new ArrayList<>(); - if (input.isReadable()) { + List dataPackRegistries = null; + if (FML3) { + dataPackRegistries = new ArrayList<>(); len = ProtocolUtils.readVarInt(input); for (int x = 0; x < len; x++) dataPackRegistries.add(ProtocolUtils.readString(input, 0x100)); @@ -74,8 +75,8 @@ public class ModListPacket implements IForgeLoginWrapperPacket { registries.forEach(k -> ProtocolUtils.writeString(buf, k)); if (dataPackRegistries != null) { - ProtocolUtils.writeVarInt(buf, registries.size()); - registries.forEach(k -> ProtocolUtils.writeString(buf, k)); + ProtocolUtils.writeVarInt(buf, dataPackRegistries.size()); + dataPackRegistries.forEach(k -> ProtocolUtils.writeString(buf, k)); } ByteBuf output = Unpooled.buffer(); diff --git a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java index d95208e..c938680 100644 --- a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java +++ b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java @@ -15,8 +15,13 @@ import java.util.List; public class ForgeLoginWrapperCodec extends MessageToMessageCodec> { + private final boolean FML3; private final List loginWrapperIDs = new ArrayList<>(); + public ForgeLoginWrapperCodec(boolean fml3) { + FML3 = fml3; + } + @Override protected void decode(ChannelHandlerContext ctx, DeferredByteBufHolder in, List out) throws Exception { ByteBuf buf = in.content(); @@ -51,7 +56,7 @@ public class ForgeLoginWrapperCodec extends MessageToMessageCodec { +public class ForgeLoginWrapperHandler extends SimpleChannelInboundHandler> { - private final ConnectedPlayer player; + private final MinecraftConnectionAssociation connection; - public ForgeLoginWrapperHandler(ConnectedPlayer player) { + public ForgeLoginWrapperHandler(MinecraftConnectionAssociation connection) { super(false); - this.player = player; + this.connection = connection; } @Override protected void channelRead0(ChannelHandlerContext ctx, IForgeLoginWrapperPacket msg) throws Exception { + if (connection instanceof ConnectedPlayer player) { VelocityForgeClientConnectionPhase phase = (VelocityForgeClientConnectionPhase) player.getPhase(); phase.handle(player,msg,player.getConnectionInFlight()); + } else if (connection instanceof VelocityServerConnection serverConnection){ + if (!(serverConnection.getConnection().getType() instanceof ForgeFMLConnectionType)) { + serverConnection.getConnection().setType(serverConnection.getPlayer().getConnection().getType()); + serverConnection.setConnectionPhase(serverConnection.getConnection().getType().getInitialBackendPhase()); + } + + VelocityForgeBackendConnectionPhase phase = + (VelocityForgeBackendConnectionPhase) serverConnection.getPhase(); + phase.handle(serverConnection, serverConnection.getPlayer(), msg); + } } } diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java index ffbc1b1..b6d959b 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java @@ -37,7 +37,8 @@ public class VelocityEventHandler { player.getConnection().getChannel().pipeline().addBefore( Connections.HANDLER, - ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec()); + ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec( + player.getConnection().getType() == ForgeConstants.ForgeFML3)); player.getConnection().getChannel().pipeline().addAfter( ForgeConstants.FORGE_HANDSHAKE_DECODER, ForgeConstants.FORGE_HANDSHAKE_HANDLER, new ForgeLoginWrapperHandler(player)); 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 932c2fb..949cc44 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java @@ -25,19 +25,6 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler { this.server = server; } - @Override - public boolean handle(LoginPluginMessage packet) { - if (packet.getChannel().equals("fml:loginwrapper")) { - if (serverConnection.getPhase() == BackendConnectionPhases.UNKNOWN) { - VelocityForgeBackendConnectionPhase.NOT_STARTED.handle(serverConnection,serverConnection.getPlayer(),packet); - } else if (serverConnection.getPhase() instanceof VelocityForgeBackendConnectionPhase phase1) { - phase1.handle(serverConnection,serverConnection.getPlayer(),packet); - } - return true; - } - return original.handle(packet); - } - @Override public boolean handle(ServerLoginSuccess packet) { if ((serverConnection.getPhase() instanceof VelocityForgeBackendConnectionPhase phase)) { diff --git a/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java b/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java index 35ee88a..76a9dca 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java @@ -34,12 +34,13 @@ public class VelocityForgeBackendHandshakeHandler extends ChannelInboundHandlerA ForgeLoginSessionHandler forgeLoginSessionHandler = new ForgeLoginSessionHandler((LoginSessionHandler) connection.getActiveSessionHandler(), serverConnection,server); connection.setActiveSessionHandler(StateRegistry.LOGIN, forgeLoginSessionHandler); - player.getConnection().getChannel().pipeline().addBefore( + serverConnection.getConnection().getChannel().pipeline().addBefore( Connections.HANDLER, - ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec()); - player.getConnection().getChannel().pipeline().addAfter( + ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec( + player.getConnection().getType() == ForgeConstants.ForgeFML3)); + serverConnection.getConnection().getChannel().pipeline().addAfter( ForgeConstants.FORGE_HANDSHAKE_DECODER, - ForgeConstants.FORGE_HANDSHAKE_HANDLER, new ForgeLoginWrapperHandler(player)); + ForgeConstants.FORGE_HANDSHAKE_HANDLER, new ForgeLoginWrapperHandler(serverConnection)); } ctx.pipeline().fireChannelActive();