From 669a856ec4507f2d5799de523f73d1a9ee867836 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Thu, 23 Nov 2023 18:07:00 +0100 Subject: [PATCH] Packet Context Class --- .../VelocityForgeBackendConnectionPhase.java | 2 ++ .../VelocityForgeClientConnectionPhase.java | 5 +-- .../ambassador/forge/packet/Context.java | 35 +++++++++++++++++++ .../GenericForgeLoginWrapperPacket.java | 31 ++++++++-------- .../packet/IForgeLoginWrapperPacket.java | 10 +++--- .../forge/packet/ModListReplyPacket.java | 28 +++++---------- .../pipeline/ForgeLoginWrapperDecoder.java | 6 ++-- .../client/FML2CRPMResetCompleteDecoder.java | 2 +- .../VelocityHandshakeSessionHandler.java | 8 ++--- 9 files changed, 77 insertions(+), 50 deletions(-) create mode 100644 src/main/java/org/adde0109/ambassador/forge/packet/Context.java diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java index a1f3e5d..4e5421e 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java @@ -68,6 +68,8 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas //Reset client if not ready to receive new handshake VelocityForgeClientConnectionPhase clientPhase = (VelocityForgeClientConnectionPhase) player.getPhase(); if (clientPhase != VelocityForgeClientConnectionPhase.NOT_STARTED) { + //Initial Forge + //Forge -> Forge clientPhase.resetConnectionPhase(player); if (clientPhase == VelocityForgeClientConnectionPhase.COMPLETE) { diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index 63e801c..77e8055 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -16,6 +16,7 @@ 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; @@ -96,7 +97,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase @Override public boolean handle(ConnectedPlayer player, IForgeLoginWrapperPacket msg, VelocityServerConnection server) { - if (msg.getId() == 98) { + if (msg.getContext().getResponseID() == 98) { player.getConnection().getChannel().pipeline().remove(ForgeConstants.RESET_LISTENER); player.setPhase(NOT_STARTED); @@ -104,7 +105,7 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase if (!(server.getConnection().getType() instanceof ForgeFMLConnectionType)) { // -> vanilla - complete(player, msg.getSuccess()); + complete(player, ((Context.ClientContext) msg.getContext()).success()); player.getConnectionInFlight().getConnection().getChannel().config().setAutoRead(true); } diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/Context.java b/src/main/java/org/adde0109/ambassador/forge/packet/Context.java new file mode 100644 index 0000000..dac09ca --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/packet/Context.java @@ -0,0 +1,35 @@ +package org.adde0109.ambassador.forge.packet; + +public class Context { + + private final int responseID; + + private Context(int responseID) { + this.responseID = responseID; + } + + static Context createContext(int responseID) { + return new Context(responseID); + } + + static ClientContext createContext(int responseID, boolean clientSuccess) { + return new ClientContext(responseID,clientSuccess); + } + + public int getResponseID() { + return responseID; + } + + public static class ClientContext extends Context { + + private final boolean clientSuccess; + ClientContext(int responseID, boolean clientSuccess) { + super(responseID); + this.clientSuccess = clientSuccess; + } + + public boolean success() { + return 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 61b5319..1b854ba 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java @@ -4,28 +4,31 @@ import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import com.velocitypowered.proxy.protocol.util.DeferredByteBufHolder; import io.netty.buffer.ByteBuf; -public class GenericForgeLoginWrapperPacket extends DeferredByteBufHolder implements IForgeLoginWrapperPacket { - private final int id; - private final boolean success; +public class GenericForgeLoginWrapperPacket extends DeferredByteBufHolder implements IForgeLoginWrapperPacket { - public GenericForgeLoginWrapperPacket(ByteBuf input, int id, boolean success) { + private final T context; + + private GenericForgeLoginWrapperPacket(ByteBuf input, T context) { super(input); - this.id = id; - this.success = success; + 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)); } @Override - public LoginPluginResponse encode() { - return new LoginPluginResponse(id, true, content()); + public ByteBuf encode() { + return content(); } @Override - public int getId() { - return id; + public T getContext() { + return context; } - @Override - public boolean getSuccess() { - return success; - } } diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/IForgeLoginWrapperPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/IForgeLoginWrapperPacket.java index 4326477..d1bfd7d 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/IForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/IForgeLoginWrapperPacket.java @@ -1,10 +1,8 @@ package org.adde0109.ambassador.forge.packet; -import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; +import io.netty.buffer.ByteBuf; -public interface IForgeLoginWrapperPacket { - public LoginPluginResponse encode(); - public int getId(); - - public boolean getSuccess(); +public interface IForgeLoginWrapperPacket { + ByteBuf encode(); + T getContext(); } 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 7f94105..82f3a49 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java @@ -12,27 +12,22 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class ModListReplyPacket implements IForgeLoginWrapperPacket { +public class ModListReplyPacket implements IForgeLoginWrapperPacket { private List mods; private Map channels; private Map registries; - private final int id; - - private final boolean success; - + private final Context.ClientContext context; private ModListReplyPacket(List mods, Map channels, Map registries, int id, boolean success) { this.mods = mods; this.channels = channels; this.registries = registries; - this.id = id; - this.success = success; + this.context = Context.createContext(id, success); } - public static ModListReplyPacket read(LoginPluginResponse msg) { - ByteBuf input = msg.content(); + public static ModListReplyPacket read(ByteBuf input, int msgID) { List mods = new ArrayList<>(); int len = ProtocolUtils.readVarInt(input); @@ -50,11 +45,11 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket { for (int x = 0; x < len; x++) registries.put(ProtocolUtils.readString(input, 32767), ProtocolUtils.readString(input, 0x100)); - return new ModListReplyPacket(mods, channels, registries, msg.getId(), true); + return new ModListReplyPacket(mods, channels, registries, msgID, true); } @Override - public LoginPluginResponse encode() { + public ByteBuf encode() { ByteBuf buf = Unpooled.buffer(); ProtocolUtils.writeVarInt(buf, 2); @@ -79,17 +74,12 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket { ProtocolUtils.writeVarInt(output, buf.readableBytes()); output.writeBytes(buf); - return new LoginPluginResponse(id, true, output); + return output; } @Override - public int getId() { - return id; - } - - @Override - public boolean getSuccess() { - return success; + public Context.ClientContext getContext() { + return context; } public List getMods() { diff --git a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperDecoder.java b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperDecoder.java index e382b10..7aed019 100644 --- a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperDecoder.java +++ b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperDecoder.java @@ -26,16 +26,16 @@ public class ForgeLoginWrapperDecoder extends MessageToMessageDecoder 1) { + if (connection.getState() == StateRegistry.LOGIN && markerSplit.length > 1 && markerSplit[1].startsWith("FML")) { switch (markerSplit[1]) { case "FML2": connection.setType(ForgeConstants.ForgeFML2); - connection.getChannel().pipeline().addAfter(Connections.MINECRAFT_ENCODER,ForgeConstants.SERVER_SUCCESS_LISTENER, new OutboundSuccessHolder()); - connection.getChannel().pipeline().addAfter(Connections.MINECRAFT_ENCODER,ForgeConstants.PLUGIN_PACKET_QUEUE, new ClientPacketQueue(StateRegistry.LOGIN)); break; case "FML3": connection.setType(ForgeConstants.ForgeFML3); - connection.getChannel().pipeline().addAfter(Connections.MINECRAFT_ENCODER,ForgeConstants.SERVER_SUCCESS_LISTENER, new OutboundSuccessHolder()); - connection.getChannel().pipeline().addAfter(Connections.MINECRAFT_ENCODER,ForgeConstants.PLUGIN_PACKET_QUEUE, new ClientPacketQueue(StateRegistry.LOGIN)); break; } + connection.getChannel().pipeline().addAfter(Connections.MINECRAFT_ENCODER,ForgeConstants.SERVER_SUCCESS_LISTENER, new OutboundSuccessHolder()); + connection.getChannel().pipeline().addAfter(Connections.MINECRAFT_ENCODER,ForgeConstants.PLUGIN_PACKET_QUEUE, new ClientPacketQueue(StateRegistry.LOGIN)); } } return true;