From 57282b69ab9bc5074a441e658c7f73617ffa2b31 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Mon, 27 Nov 2023 00:03:26 +0100 Subject: [PATCH] Reworked packet decoding/encoding --- .../ambassador/forge/ForgeHandshake.java | 3 +- .../VelocityForgeBackendConnectionPhase.java | 8 +- .../VelocityForgeClientConnectionPhase.java | 12 --- .../ambassador/forge/packet/ACKPacket.java | 8 +- ...gDataPacket.java => ConfigDataPacket.java} | 6 +- .../ambassador/forge/packet/Context.java | 4 +- .../GenericForgeLoginWrapperPacket.java | 7 +- .../forge/packet/ModListPacket.java | 10 +-- .../forge/packet/ModListReplyPacket.java | 8 +- .../forge/packet/RegistryPacket.java | 21 +++++ .../pipeline/ForgeLoginWrapperCodec.java | 82 +++++++++++++++++++ .../pipeline/ForgeLoginWrapperDecoder.java | 45 ---------- .../velocity/VelocityEventHandler.java | 6 +- .../backend/ForgeLoginSessionHandler.java | 2 +- .../VelocityForgeBackendHandshakeHandler.java | 14 +++- .../client/FML2CRPMResetCompleteDecoder.java | 5 +- 16 files changed, 143 insertions(+), 98 deletions(-) rename src/main/java/org/adde0109/ambassador/forge/packet/{configDataPacket.java => ConfigDataPacket.java} (64%) create mode 100644 src/main/java/org/adde0109/ambassador/forge/packet/RegistryPacket.java create mode 100644 src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java delete mode 100644 src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperDecoder.java diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java index e0adfa2..5a6f6e0 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java @@ -3,13 +3,14 @@ package org.adde0109.ambassador.forge; import org.adde0109.ambassador.forge.packet.ModListPacket; import org.adde0109.ambassador.forge.packet.ModListReplyPacket; +import java.util.List; + public class ForgeHandshake { private ModListPacket modListPacket; private ModListReplyPacket modListReplyPacket; public ForgeHandshake() { - } public ModListPacket getModListPacket() { diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java index 4e5421e..34ad2bc 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java @@ -6,13 +6,11 @@ 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.ProtocolUtils; -import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.packet.AvailableCommands; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.PluginMessage; -import io.netty.buffer.ByteBuf; import org.adde0109.ambassador.forge.pipeline.CommandDecoderErrorCatcher; -import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperDecoder; +import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperCodec; public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhase { NOT_STARTED() { @@ -82,10 +80,6 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas //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. - - ForgeLoginWrapperDecoder decoder = (ForgeLoginWrapperDecoder) player.getConnection() - .getChannel().pipeline().get(ForgeConstants.FORGE_HANDSHAKE_DECODER); - decoder.registerLoginWrapperID(message.getId()); } public void onLoginSuccess(VelocityServerConnection serverCon, ConnectedPlayer player) { diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index 77e8055..9d946b4 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -14,12 +14,10 @@ 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; import org.adde0109.ambassador.forge.packet.Context; import org.adde0109.ambassador.forge.packet.IForgeLoginWrapperPacket; import org.adde0109.ambassador.forge.packet.ModListReplyPacket; -import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperDecoder; import org.adde0109.ambassador.velocity.client.FML2CRPMResetCompleteDecoder; import org.adde0109.ambassador.velocity.client.OutboundSuccessHolder; import org.adde0109.ambassador.velocity.client.ClientPacketQueue; @@ -170,16 +168,6 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase return true; } - public void sendVanillaModlist(ConnectedPlayer player) { - player.getConnection().write(new LoginPluginMessage(0, "fml:loginwrapper", - Unpooled.wrappedBuffer(player.getConnection().getType() == ForgeConstants.ForgeFML3 ? - ForgeHandshakeUtils.emptyModlistFML3 : ForgeHandshakeUtils.emptyModlistFML2))); - - ForgeLoginWrapperDecoder decoder = (ForgeLoginWrapperDecoder) player.getConnection() - .getChannel().pipeline().get(ForgeConstants.FORGE_HANDSHAKE_DECODER); - decoder.registerLoginWrapperID(0); - } - public void complete(ConnectedPlayer player) { complete(player, isResettable(player)); } diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java index f331c18..70135e3 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java @@ -7,12 +7,8 @@ public class ACKPacket implements IForgeLoginWrapperPacket { +public class ConfigDataPacket implements IForgeLoginWrapperPacket { private final Context context; - public configDataPacket(int msgID) { - this.context = Context.createContext(msgID); + public ConfigDataPacket(Context context) { + this.context = context; } @Override diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/Context.java b/src/main/java/org/adde0109/ambassador/forge/packet/Context.java index dac09ca..97ceb0b 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/Context.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/Context.java @@ -8,11 +8,11 @@ public class Context { this.responseID = responseID; } - static Context createContext(int responseID) { + public static Context createContext(int responseID) { return new Context(responseID); } - static ClientContext createContext(int responseID, boolean clientSuccess) { + public static ClientContext createContext(int responseID, boolean clientSuccess) { return new ClientContext(responseID,clientSuccess); } 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 1b854ba..e18a768 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java @@ -13,12 +13,9 @@ public class GenericForgeLoginWrapperPacket extends DeferredB this.context = context; } - static public GenericForgeLoginWrapperPacket create(ByteBuf input, int id) { - return new GenericForgeLoginWrapperPacket<>(input, Context.createContext(id)); - } - static public GenericForgeLoginWrapperPacket create(ByteBuf input, int id, boolean success) { - return new GenericForgeLoginWrapperPacket<>(input, Context.createContext(id, success)); + static public GenericForgeLoginWrapperPacket create(ByteBuf input, Context context) { + return new GenericForgeLoginWrapperPacket<>(input, 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 1526061..37da596 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java @@ -19,15 +19,15 @@ public class ModListPacket implements IForgeLoginWrapperPacket { private final Context context; private ModListPacket(List mods, Map channels, List registries, int id, List dataPackRegistries) { + String> channels, List registries, Context context, List dataPackRegistries) { this.mods = mods; this.channels = channels; this.registries = registries; - this.context = Context.createContext(id); + this.context = context; this.dataPackRegistries = dataPackRegistries; } - public static ModListPacket read(ByteBuf input, int msgID, boolean FML3) { + public static ModListPacket read(ByteBuf input, Context context) { List mods = new ArrayList<>(); int len = ProtocolUtils.readVarInt(input); @@ -46,13 +46,13 @@ public class ModListPacket implements IForgeLoginWrapperPacket { registries.add(ProtocolUtils.readString(input, 32767)); List dataPackRegistries = new ArrayList<>(); - if (FML3) { + if (input.isReadable()) { len = ProtocolUtils.readVarInt(input); for (int x = 0; x < len; x++) dataPackRegistries.add(ProtocolUtils.readString(input, 0x100)); } - return new ModListPacket(mods, channels, registries, msgID, dataPackRegistries); + return new ModListPacket(mods, channels, registries, context, dataPackRegistries); } @Override diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java index 82f3a49..c921d13 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java @@ -20,14 +20,14 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket mods, Map channels, Map registries, int id, boolean success) { + String> channels, Map registries, Context.ClientContext context) { this.mods = mods; this.channels = channels; this.registries = registries; - this.context = Context.createContext(id, success); + this.context = context; } - public static ModListReplyPacket read(ByteBuf input, int msgID) { + public static ModListReplyPacket read(ByteBuf input, Context.ClientContext context) { List mods = new ArrayList<>(); int len = ProtocolUtils.readVarInt(input); @@ -45,7 +45,7 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket { + + private final Context context; + public RegistryPacket(Context context) { + this.context = context; + } + + @Override + public ByteBuf encode() { + return null; + } + + @Override + public Context getContext() { + return context; + } +} diff --git a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java new file mode 100644 index 0000000..d95208e --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java @@ -0,0 +1,82 @@ +package org.adde0109.ambassador.forge.pipeline; + +import com.velocitypowered.proxy.protocol.ProtocolUtils; +import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; +import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; +import com.velocitypowered.proxy.protocol.util.DeferredByteBufHolder; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.DecoderException; +import io.netty.handler.codec.MessageToMessageCodec; +import org.adde0109.ambassador.forge.packet.*; + +import java.util.ArrayList; +import java.util.List; + +public class ForgeLoginWrapperCodec extends MessageToMessageCodec> { + + private final List loginWrapperIDs = new ArrayList<>(); + + @Override + protected void decode(ChannelHandlerContext ctx, DeferredByteBufHolder in, List out) throws Exception { + ByteBuf buf = in.content(); + + Context context; + if (in instanceof LoginPluginMessage msg && msg.getChannel().equals("fml:loginwrapper")) { + context = Context.createContext(msg.getId()); + } else if (in instanceof LoginPluginResponse msg && loginWrapperIDs.remove(msg.getId()) != null) { + context = Context.createContext(msg.getId(), msg.isSuccess()); + } else { + return; + } + + int originalReaderIndex = buf.readerIndex(); + try { + String channel = ProtocolUtils.readString(buf); + if (!channel.equals("fml:handshake")) { + throw new DecoderException(); + } else { + int length = ProtocolUtils.readVarInt(buf); + int packetID = ProtocolUtils.readVarInt(buf); + if (context instanceof Context.ClientContext clientContext) { + switch (packetID) { + case 2: + out.add(ModListReplyPacket.read(buf, clientContext)); + break; + case 99: + out.add(new ACKPacket(clientContext)); + default: + throw new DecoderException(); + } + } else { + switch (packetID) { + case 1: + out.add(ModListPacket.read(buf, context)); + break; + case 3: + out.add(new RegistryPacket(context)); + break; + case 4: + out.add(new ConfigDataPacket(context)); + break; + default: + throw new DecoderException(); + } + } + } + } catch (DecoderException e) { + buf.readerIndex(originalReaderIndex); + out.add(GenericForgeLoginWrapperPacket.create(buf.retain(), context)); + } + } + + @Override + protected void encode(ChannelHandlerContext ctx, IForgeLoginWrapperPacket msg, List out) throws Exception { + if (msg.getContext() instanceof Context.ClientContext clientContext) { + out.add(new LoginPluginResponse(clientContext.getResponseID(), clientContext.success(), msg.encode())); + } else { + out.add(new LoginPluginMessage(msg.getContext().getResponseID(), "fml:loginwrapper", msg.encode())); + this.loginWrapperIDs.add(msg.getContext().getResponseID()); + } + } +} diff --git a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperDecoder.java b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperDecoder.java deleted file mode 100644 index 7aed019..0000000 --- a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperDecoder.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.adde0109.ambassador.forge.pipeline; - -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.handler.codec.MessageToMessageDecoder; -import org.adde0109.ambassador.forge.packet.GenericForgeLoginWrapperPacket; -import org.adde0109.ambassador.forge.packet.ModListReplyPacket; - -import java.util.ArrayList; -import java.util.List; - -public class ForgeLoginWrapperDecoder extends MessageToMessageDecoder { - - private final List loginWrapperIDs = new ArrayList<>(); - - @Override - protected void decode(ChannelHandlerContext ctx, LoginPluginResponse msg, List out) throws Exception { - ByteBuf buf = msg.content(); - if (!loginWrapperIDs.remove((Integer) msg.getId())) { - out.add(msg.retain()); - return; - } - int originalReaderIndex = msg.content().readerIndex(); - String channel = ProtocolUtils.readString(buf); - if (!channel.equals("fml:handshake")) { - buf.readerIndex(originalReaderIndex); - out.add(GenericForgeLoginWrapperPacket.create(buf.retain(), msg.getId(), true)); - return; - } - int length = ProtocolUtils.readVarInt(buf); - int packetID = ProtocolUtils.readVarInt(buf); - if (packetID == 2) { - out.add(ModListReplyPacket.read(msg.content(), msg.getId())); - } else { - buf.readerIndex(originalReaderIndex); - out.add(GenericForgeLoginWrapperPacket.create(buf.retain(), msg.getId(), true)); - } - } - - public void registerLoginWrapperID(int loginWrapperID) { - this.loginWrapperIDs.add(loginWrapperID); - } -} diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java index c4b3bc9..ffbc1b1 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java @@ -3,7 +3,6 @@ package org.adde0109.ambassador.velocity; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.PostOrder; import com.velocitypowered.api.event.Subscribe; -import com.velocitypowered.api.event.connection.LoginEvent; import com.velocitypowered.api.event.connection.PostLoginEvent; import com.velocitypowered.api.event.player.*; import com.velocitypowered.api.proxy.server.RegisteredServer; @@ -12,12 +11,11 @@ import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.network.Connections; import com.velocitypowered.proxy.protocol.StateRegistry; -import net.kyori.adventure.text.Component; import org.adde0109.ambassador.Ambassador; import org.adde0109.ambassador.forge.ForgeConstants; import org.adde0109.ambassador.forge.ForgeFMLConnectionType; import org.adde0109.ambassador.forge.VelocityForgeClientConnectionPhase; -import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperDecoder; +import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperCodec; import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperHandler; public class VelocityEventHandler { @@ -39,7 +37,7 @@ public class VelocityEventHandler { player.getConnection().getChannel().pipeline().addBefore( Connections.HANDLER, - ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperDecoder()); + ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec()); 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 ed4ee72..932c2fb 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/ForgeLoginSessionHandler.java @@ -51,7 +51,7 @@ public class ForgeLoginSessionHandler implements MinecraftSessionHandler { if (!(serverConnection.getConnection().getType() instanceof ForgeFMLConnectionType)) { if (player.getConnectedServer() == null || player.getConnectedServer().getConnection().getType() instanceof ForgeFMLConnectionType) { - //Initial Vanilla + //Initial Vanilla - test if the client can be reset //Forge -> vanilla player.getPhase().resetConnectionPhase(player); player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(false); 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 cddf37e..35ee88a 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java @@ -4,10 +4,14 @@ import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.backend.LoginSessionHandler; 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 io.netty.channel.*; +import org.adde0109.ambassador.forge.ForgeConstants; import org.adde0109.ambassador.forge.ForgeFMLConnectionType; +import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperCodec; +import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperHandler; import org.jetbrains.annotations.NotNull; public class VelocityForgeBackendHandshakeHandler extends ChannelInboundHandlerAdapter { @@ -25,9 +29,17 @@ public class VelocityForgeBackendHandshakeHandler extends ChannelInboundHandlerA ctx.pipeline().remove(this); - if (serverConnection.getPlayer().getConnection().getType() instanceof ForgeFMLConnectionType) { + ConnectedPlayer player = serverConnection.getPlayer(); + if (player.getConnection().getType() instanceof ForgeFMLConnectionType) { ForgeLoginSessionHandler forgeLoginSessionHandler = new ForgeLoginSessionHandler((LoginSessionHandler) connection.getActiveSessionHandler(), serverConnection,server); connection.setActiveSessionHandler(StateRegistry.LOGIN, forgeLoginSessionHandler); + + player.getConnection().getChannel().pipeline().addBefore( + Connections.HANDLER, + ForgeConstants.FORGE_HANDSHAKE_DECODER, new ForgeLoginWrapperCodec()); + player.getConnection().getChannel().pipeline().addAfter( + ForgeConstants.FORGE_HANDSHAKE_DECODER, + ForgeConstants.FORGE_HANDSHAKE_HANDLER, new ForgeLoginWrapperHandler(player)); } ctx.pipeline().fireChannelActive(); diff --git a/src/main/java/org/adde0109/ambassador/velocity/client/FML2CRPMResetCompleteDecoder.java b/src/main/java/org/adde0109/ambassador/velocity/client/FML2CRPMResetCompleteDecoder.java index fc38aa3..56d3b50 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/client/FML2CRPMResetCompleteDecoder.java +++ b/src/main/java/org/adde0109/ambassador/velocity/client/FML2CRPMResetCompleteDecoder.java @@ -5,6 +5,7 @@ import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; +import org.adde0109.ambassador.forge.packet.Context; import org.adde0109.ambassador.forge.packet.GenericForgeLoginWrapperPacket; import org.adde0109.ambassador.forge.packet.IForgeLoginWrapperPacket; @@ -26,8 +27,8 @@ public class FML2CRPMResetCompleteDecoder extends ChannelInboundHandlerAdapter { boolean success = buf.readBoolean(); if (id == 98) { try { - IForgeLoginWrapperPacket packet = GenericForgeLoginWrapperPacket.create(Unpooled.EMPTY_BUFFER, id, success); - ctx.fireChannelRead(packet); + ctx.fireChannelRead(GenericForgeLoginWrapperPacket.create( + Unpooled.EMPTY_BUFFER, Context.createContext(id, success))); } finally { buf.release(); }