diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeUtils.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeUtils.java index b7a9233..562e773 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeUtils.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeUtils.java @@ -3,6 +3,12 @@ package org.adde0109.ambassador.forge; import com.google.common.io.ByteArrayDataInput; import com.google.common.io.ByteArrayDataOutput; import com.google.common.io.ByteStreams; +import com.velocitypowered.proxy.protocol.ProtocolUtils; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import io.netty.handler.codec.DecoderException; +import org.adde0109.ambassador.forge.packet.Context; +import org.adde0109.ambassador.forge.packet.IForgeLoginWrapperPacket; import java.nio.charset.StandardCharsets; @@ -110,4 +116,39 @@ public class ForgeHandshakeUtils { stream.write(dataAndPacketId); return stream.toByteArray(); } + + public static class SilentGearUtils { + public static boolean isSilentGearPacket(byte[] data) { + ByteBuf buf = Unpooled.wrappedBuffer(data); + String channel = null; + try { + channel = ProtocolUtils.readString(buf); + } catch (DecoderException e) { + } finally { + buf.release(); + } + return channel != null && channel.equals("silentgear:network"); + } + + public static class ACKPacket implements IForgeLoginWrapperPacket { + private final Context.ClientContext context; + + public ACKPacket(Context.ClientContext context) { + this.context = context; + } + @Override + public ByteBuf encode() { + ByteBuf buf = Unpooled.buffer(); + + ProtocolUtils.writeVarInt(buf, 3); + + return buf; + } + + @Override + public Context.ClientContext getContext() { + return context; + } + } + } } diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java index 4a25bdd..b1bc920 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java @@ -7,19 +7,12 @@ import com.velocitypowered.proxy.connection.client.ConnectedPlayer; import com.velocitypowered.proxy.network.Connections; 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.*; import org.adde0109.ambassador.forge.pipeline.CommandDecoderErrorCatcher; -import org.adde0109.ambassador.forge.pipeline.ForgeLoginWrapperCodec; -import org.checkerframework.checker.units.qual.A; -import java.util.HashMap; -import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; -import java.util.zip.Adler32; -import java.util.zip.Checksum; public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhase { NOT_STARTED() { @@ -110,8 +103,10 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas remainingRegistries.countDown(); } else if (message instanceof ConfigDataPacket) { server.getConnection().write(new ACKPacket(Context.createContext(message.getContext().getResponseID(), true))); - } else if (message instanceof GenericForgeLoginWrapperPacket) { - //Save for after completion and send as plugin message + } else if (message instanceof GenericForgeLoginWrapperPacket packet + && ForgeHandshakeUtils.SilentGearUtils.isSilentGearPacket(packet.getContent())) { + server.getConnection().write(new ForgeHandshakeUtils.SilentGearUtils.ACKPacket( + Context.createContext(message.getContext().getResponseID(), true))); } } //Forge server 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 d4cafaf..d19914e 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java @@ -27,6 +27,10 @@ public class GenericForgeLoginWrapperPacket implements IForge return buf; } + public byte[] getContent() { + return content; + } + @Override public T 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 index bc161d4..f800f2a 100644 --- a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java +++ b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java @@ -9,6 +9,7 @@ import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.DecoderException; import io.netty.handler.codec.MessageToMessageCodec; +import org.adde0109.ambassador.forge.ForgeHandshakeUtils; import org.adde0109.ambassador.forge.packet.*; import java.util.ArrayList; @@ -90,9 +91,13 @@ public class ForgeLoginWrapperCodec extends MessageToMessageCodec) { wrapped = msg.encode(); } else { + String channel = "fml:handshake"; + if (msg instanceof ForgeHandshakeUtils.SilentGearUtils.ACKPacket) { + channel = "silentgear:network"; + } wrapped = Unpooled.buffer(); ByteBuf encoded = msg.encode(); - ProtocolUtils.writeString(wrapped, "fml:handshake"); + ProtocolUtils.writeString(wrapped, channel); ProtocolUtils.writeVarInt(wrapped, encoded.readableBytes()); wrapped.writeBytes(encoded); encoded.release();