diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java index 661a19e..1c08167 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java @@ -1,5 +1,7 @@ package org.adde0109.ambassador.forge; +import org.adde0109.ambassador.forge.packet.Context; +import org.adde0109.ambassador.forge.packet.GenericForgeLoginWrapperPacket; import org.adde0109.ambassador.forge.packet.ModListReplyPacket; import org.adde0109.ambassador.forge.packet.RegistryPacket; @@ -11,6 +13,7 @@ import java.util.zip.Checksum; public class ForgeHandshake { private ModListReplyPacket modListReplyPacket; private final Map registries = new HashMap<>(); + public GenericForgeLoginWrapperPacket zetaFlagsPacket; public ForgeHandshake() { } diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeUtils.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeUtils.java index e81c9f0..d43e65e 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeUtils.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeUtils.java @@ -122,17 +122,17 @@ public class ForgeHandshakeUtils { static enum ThirdPartyChannel { SILENTGEAR_NETWORK { @Override - public ThirdPartyRegistryUtils.ACKPacket generateResponsePacket(Context.ClientContext context) { + public IForgeLoginWrapperPacket generateResponsePacket(Context.ClientContext context, ForgeHandshake completed) { return new ACKPacket(context, 3); } }, ZETA_MAIN { @Override - public ThirdPartyRegistryUtils.ACKPacket generateResponsePacket(Context.ClientContext context) { - return new ACKPacket(context, 99); + public IForgeLoginWrapperPacket generateResponsePacket(Context.ClientContext context, ForgeHandshake completed) { + return new GenericForgeLoginWrapperPacket(completed.zetaFlagsPacket.getContent(), context); } }; - abstract public ACKPacket generateResponsePacket(Context.ClientContext context); + abstract public IForgeLoginWrapperPacket generateResponsePacket(Context.ClientContext context, ForgeHandshake completed); } static boolean isThirdPartyPacket(GenericForgeLoginWrapperPacket packet) { diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java index 44c3ff8..d473b96 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java @@ -139,7 +139,11 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas server.getConnection().write(new ACKPacket(Context.fromContext(message.getContext(), true))); } else if (message instanceof GenericForgeLoginWrapperPacket packet && ForgeHandshakeUtils.ThirdPartyRegistryUtils.isThirdPartyPacket(packet)) { - server.getConnection().write(ForgeHandshakeUtils.ThirdPartyRegistryUtils.getThirdPartyChannel(packet)); + server.getConnection().write( + ForgeHandshakeUtils.ThirdPartyRegistryUtils.getThirdPartyChannel(packet). + generateResponsePacket( + Context.ClientContext.fromContext(packet.getContext(), true), + clientPhase.forgeHandshake)); } } //Forge server diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java index 7029d98..3f4da0a 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeClientConnectionPhase.java @@ -17,6 +17,7 @@ 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.GenericForgeLoginWrapperPacket; import org.adde0109.ambassador.forge.packet.IForgeLoginWrapperPacket; import org.adde0109.ambassador.forge.packet.ModListReplyPacket; import org.adde0109.ambassador.velocity.client.FML2CRPMResetCompleteDecoder; @@ -129,6 +130,10 @@ public enum VelocityForgeClientConnectionPhase implements ClientConnectionPhase public boolean handle(ConnectedPlayer player, IForgeLoginWrapperPacket msg, VelocityServerConnection server) { + if (msg.getContext().getChannelName().equals("zeta:main")) { + forgeHandshake.zetaFlagsPacket = (GenericForgeLoginWrapperPacket) msg; + } + if (msg instanceof ModListReplyPacket replyPacket) { ModInfo modInfo = new ModInfo("FML2", replyPacket.getMods().stream().map( (v) -> new ModInfo.Mod(v,"1")).toList()); 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 d19914e..a97de5e 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java @@ -8,7 +8,7 @@ public class GenericForgeLoginWrapperPacket implements IForge private final byte[] content; private final T context; - GenericForgeLoginWrapperPacket(byte[] content, T context) { + public GenericForgeLoginWrapperPacket(byte[] content, T context) { this.content = content; this.context = context; }