From 82f3e1ba5fc6f9d25d5cab992004027367887a41 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Fri, 24 Nov 2023 17:50:32 +0100 Subject: [PATCH] New forge packets and handshake class --- .../ambassador/forge/ForgeHandshake.java | 30 +++++ .../ambassador/forge/packet/ACKPacket.java | 26 +++++ .../forge/packet/ModListPacket.java | 103 ++++++++++++++++++ .../forge/packet/configDataPacket.java | 22 ++++ 4 files changed, 181 insertions(+) create mode 100644 src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java create mode 100644 src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java create mode 100644 src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java create mode 100644 src/main/java/org/adde0109/ambassador/forge/packet/configDataPacket.java diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java new file mode 100644 index 0000000..e0adfa2 --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java @@ -0,0 +1,30 @@ +package org.adde0109.ambassador.forge; + +import org.adde0109.ambassador.forge.packet.ModListPacket; +import org.adde0109.ambassador.forge.packet.ModListReplyPacket; + +public class ForgeHandshake { + + private ModListPacket modListPacket; + private ModListReplyPacket modListReplyPacket; + + public ForgeHandshake() { + + } + + public ModListPacket getModListPacket() { + return modListPacket; + } + + public void setModListPacket(ModListPacket modListPacket) { + this.modListPacket = modListPacket; + } + + public ModListReplyPacket getModListReplyPacket() { + return modListReplyPacket; + } + + public void setModListReplyPacket(ModListReplyPacket modListReplyPacket) { + this.modListReplyPacket = modListReplyPacket; + } +} diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java new file mode 100644 index 0000000..f331c18 --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ACKPacket.java @@ -0,0 +1,26 @@ +package org.adde0109.ambassador.forge.packet; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +public class ACKPacket implements IForgeLoginWrapperPacket { + + private final Context.ClientContext context; + + ACKPacket(int msgID, boolean success) { + this.context = Context.createContext(msgID, success); + } + + ACKPacket read(ByteBuf input, int msgID, boolean success) { + return new ACKPacket(msgID, success); + } + @Override + public ByteBuf encode() { + return Unpooled.EMPTY_BUFFER; + } + + @Override + public Context.ClientContext getContext() { + return 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 new file mode 100644 index 0000000..1526061 --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/packet/ModListPacket.java @@ -0,0 +1,103 @@ +package org.adde0109.ambassador.forge.packet; + +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import com.velocitypowered.proxy.protocol.ProtocolUtils; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class ModListPacket implements IForgeLoginWrapperPacket { + private List mods; + private Map channels; + private List registries; + private final List dataPackRegistries; + + private final Context context; + private ModListPacket(List mods, Map channels, List registries, int id, List dataPackRegistries) { + this.mods = mods; + this.channels = channels; + this.registries = registries; + this.context = Context.createContext(id); + this.dataPackRegistries = dataPackRegistries; + } + + public static ModListPacket read(ByteBuf input, int msgID, boolean FML3) { + + List mods = new ArrayList<>(); + int len = ProtocolUtils.readVarInt(input); + for (int x = 0; x < len; x++) + mods.add(ProtocolUtils.readString(input, 0x100)); + + Map channels = new HashMap<>(); + len = ProtocolUtils.readVarInt(input); + for (int x = 0; x < len; x++) + channels.put(MinecraftChannelIdentifier.from(ProtocolUtils.readString(input, 32767)), + ProtocolUtils.readString(input, 0x100)); + + List registries = new ArrayList<>(); + len = ProtocolUtils.readVarInt(input); + for (int x = 0; x < len; x++) + registries.add(ProtocolUtils.readString(input, 32767)); + + List dataPackRegistries = new ArrayList<>(); + if (FML3) { + 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); + } + + @Override + public ByteBuf encode() { + ByteBuf buf = Unpooled.buffer(); + + ProtocolUtils.writeVarInt(buf, 1); + + ProtocolUtils.writeVarInt(buf, mods.size()); + mods.forEach(m -> ProtocolUtils.writeString(buf, m)); + + ProtocolUtils.writeVarInt(buf, channels.size()); + channels.forEach((k, v) -> { + ProtocolUtils.writeString(buf,k.getId()); + ProtocolUtils.writeString(buf,v); + }); + + ProtocolUtils.writeVarInt(buf, registries.size()); + registries.forEach(k -> ProtocolUtils.writeString(buf, k)); + + if (dataPackRegistries != null) { + ProtocolUtils.writeVarInt(buf, registries.size()); + registries.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; + } + + @Override + public Context getContext() { + return context; + } + + public List getMods() { + return mods; + } + + public Map getChannels() { + return channels; + } + + +} diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/configDataPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/configDataPacket.java new file mode 100644 index 0000000..3b6f95c --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/forge/packet/configDataPacket.java @@ -0,0 +1,22 @@ +package org.adde0109.ambassador.forge.packet; + +import io.netty.buffer.ByteBuf; + +public class configDataPacket implements IForgeLoginWrapperPacket { + + private final Context context; + + public configDataPacket(int msgID) { + this.context = Context.createContext(msgID); + } + + @Override + public ByteBuf encode() { + return null; + } + + @Override + public Context getContext() { + return context; + } +}