From 161700c7e6cc974470b7fdc0a429fd8495839def Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Mon, 27 Nov 2023 20:11:36 +0100 Subject: [PATCH] Now understands forge packets --- .../ambassador/forge/packet/ACKPacket.java | 7 +++- .../forge/packet/ConfigDataPacket.java | 25 +++++++++++-- .../GenericForgeLoginWrapperPacket.java | 4 +-- .../forge/packet/ModDataPacket.java | 9 +++++ .../forge/packet/ModListPacket.java | 7 +--- .../forge/packet/ModListReplyPacket.java | 7 +--- .../forge/packet/RegistryPacket.java | 34 ++++++++++++++++-- .../pipeline/ForgeLoginWrapperCodec.java | 35 +++++++++++++++---- 8 files changed, 101 insertions(+), 27 deletions(-) create mode 100644 src/main/java/org/adde0109/ambassador/forge/packet/ModDataPacket.java 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 70135e3..604d10b 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java @@ -1,5 +1,6 @@ package org.adde0109.ambassador.forge.packet; +import com.velocitypowered.proxy.protocol.ProtocolUtils; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -12,7 +13,11 @@ public class ACKPacket implements IForgeLoginWrapperPacket { + private final String fileName; + private final byte[] fileData; + private final Context context; - public ConfigDataPacket(Context context) { + public ConfigDataPacket(String fileName, byte[] fileData, Context context) { + this.fileName = fileName; + this.fileData = fileData; this.context = context; } + public static ConfigDataPacket read(ByteBuf input, Context context, boolean FML3) { + String registryName = ProtocolUtils.readString(input); + byte[] snapshot = ProtocolUtils.readByteArray(input); + + return new ConfigDataPacket(registryName, snapshot, context); + } + @Override public ByteBuf encode() { - return null; + ByteBuf buf = Unpooled.buffer(); + + ProtocolUtils.writeVarInt(buf, 4); + + ProtocolUtils.writeString(buf, fileName); + ProtocolUtils.writeByteArray(buf, fileData); + + return buf; } @Override 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 45d5878..d750990 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/GenericForgeLoginWrapperPacket.java @@ -1,14 +1,12 @@ package org.adde0109.ambassador.forge.packet; -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 T context; - private GenericForgeLoginWrapperPacket(ByteBuf input, T context) { + GenericForgeLoginWrapperPacket(ByteBuf input, T context) { super(input); this.context = context; } diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/ModDataPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/ModDataPacket.java new file mode 100644 index 0000000..7356aeb --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModDataPacket.java @@ -0,0 +1,9 @@ +package org.adde0109.ambassador.forge.packet; + +import io.netty.buffer.ByteBuf; + +public class ModDataPacket extends GenericForgeLoginWrapperPacket { + ModDataPacket(ByteBuf input, Context context) { + super(input, context); + } +} 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 3343077..008176e 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java @@ -79,12 +79,7 @@ public class ModListPacket implements IForgeLoginWrapperPacket { dataPackRegistries.forEach(k -> ProtocolUtils.writeString(buf, k)); } - ByteBuf output = Unpooled.buffer(); - ProtocolUtils.writeString(output, "fml:handshake"); - ProtocolUtils.writeVarInt(output, buf.readableBytes()); - output.writeBytes(buf); - - return output; + return buf; } @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 c921d13..8257ea5 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModListReplyPacket.java @@ -69,12 +69,7 @@ public class ModListReplyPacket implements IForgeLoginWrapperPacket { + private final String registryName; + private final byte[] snapshot; + private final Context context; - public RegistryPacket(Context context) { + public RegistryPacket(String registryName, byte[] snapshot, Context context) { + this.registryName = registryName; + this.snapshot = snapshot; this.context = context; } + public static RegistryPacket read(ByteBuf input, Context context, boolean FML3) { + String registryName = ProtocolUtils.readString(input); + byte[] snapshot = null; + if (input.readBoolean()) { + snapshot = new byte[input.readableBytes()]; + input.readBytes(snapshot); + } + + return new RegistryPacket(registryName, snapshot, context); + } + @Override public ByteBuf encode() { - return null; + ByteBuf buf = Unpooled.buffer(); + + ProtocolUtils.writeVarInt(buf, 3); + + ProtocolUtils.writeString(buf, registryName); + if (snapshot != null) { + buf.writeBoolean(true); + buf.writeBytes(snapshot); + } else { + buf.writeBoolean(false); + } + + return buf; } @Override 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 c938680..927fc11 100644 --- a/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java +++ b/src/main/java/org/adde0109/ambassador/forge/pipeline/ForgeLoginWrapperCodec.java @@ -5,6 +5,7 @@ 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.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.DecoderException; import io.netty.handler.codec.MessageToMessageCodec; @@ -29,7 +30,7 @@ public class ForgeLoginWrapperCodec extends MessageToMessageCodec msg, List out) throws Exception { - if (msg.getContext() instanceof Context.ClientContext clientContext) { - out.add(new LoginPluginResponse(clientContext.getResponseID(), clientContext.success(), msg.encode())); + ByteBuf wrapped; + if (msg instanceof GenericForgeLoginWrapperPacket) { + wrapped = msg.encode(); } else { - out.add(new LoginPluginMessage(msg.getContext().getResponseID(), "fml:loginwrapper", msg.encode())); - this.loginWrapperIDs.add(msg.getContext().getResponseID()); + wrapped = Unpooled.buffer(); + ByteBuf encoded = msg.encode(); + ProtocolUtils.writeString(wrapped, "fml:handshake"); + ProtocolUtils.writeVarInt(wrapped, encoded.readableBytes()); + wrapped.writeBytes(encoded); + } + + if (msg.getContext() instanceof Context.ClientContext clientContext) { + out.add(new LoginPluginResponse(clientContext.getResponseID(), clientContext.success(), wrapped)); + } else { + out.add(new LoginPluginMessage(msg.getContext().getResponseID(), "fml:loginwrapper", wrapped)); + if (!(msg instanceof ModDataPacket)) { + this.loginWrapperIDs.add(msg.getContext().getResponseID()); + } } } }