diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java index 3054c33..661a19e 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshake.java @@ -1,16 +1,16 @@ package org.adde0109.ambassador.forge; -import org.adde0109.ambassador.forge.packet.ModListPacket; import org.adde0109.ambassador.forge.packet.ModListReplyPacket; import org.adde0109.ambassador.forge.packet.RegistryPacket; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import java.util.zip.Adler32; import java.util.zip.Checksum; public class ForgeHandshake { private ModListReplyPacket modListReplyPacket; - private final Checksum registryChecksum = new Adler32(); + private final Map registries = new HashMap<>(); public ForgeHandshake() { } @@ -24,10 +24,16 @@ public class ForgeHandshake { } public void addRegistry(RegistryPacket packet) { + Checksum registryChecksum = new Adler32(); registryChecksum.update(packet.getSnapshot()); + registries.put(packet.getRegistryName(), registryChecksum.getValue()); } - public Checksum getRegistryChecksum() { - return registryChecksum; + public Map getRegistries() { + return registries; + } + + public boolean isCompatible(ForgeHandshake handshake) { + return this.registries.equals(handshake.registries); } } diff --git a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java index 9bdee59..4a25bdd 100644 --- a/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/VelocityForgeBackendConnectionPhase.java @@ -14,6 +14,8 @@ 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; @@ -59,7 +61,7 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas } }; - public Checksum registryChecksum; + public ForgeHandshake handshake = new ForgeHandshake(); CountDownLatch remainingRegistries; VelocityForgeBackendConnectionPhase() { @@ -88,7 +90,6 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas player.getConnection().write(message); } else { if (message instanceof ModListPacket modListPacket) { - registryChecksum = new Adler32(); remainingRegistries = new CountDownLatch(modListPacket.getRegistries().size()); CompletableFuture.runAsync(() -> { try { @@ -97,19 +98,20 @@ public enum VelocityForgeBackendConnectionPhase implements BackendConnectionPhas throw new RuntimeException(e); } }).thenAcceptAsync((v) -> { - if (clientPhase.forgeHandshake.getRegistryChecksum().getValue() == registryChecksum.getValue()) { + if (clientPhase.forgeHandshake.isCompatible(handshake)) { server.ensureConnected().write(clientPhase.forgeHandshake.getModListReplyPacket()); } else { - //Player needs to be kicked in order to continue. - server.disconnect(); + server.disconnect(); } }, server.ensureConnected().eventLoop()); } else if (message instanceof RegistryPacket registryPacket) { server.getConnection().write(new ACKPacket(Context.createContext(message.getContext().getResponseID(), true))); - registryChecksum.update(registryPacket.getSnapshot()); + handshake.addRegistry(registryPacket); 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 } } //Forge server diff --git a/src/main/java/org/adde0109/ambassador/forge/packet/RegistryPacket.java b/src/main/java/org/adde0109/ambassador/forge/packet/RegistryPacket.java index 1d9dc22..5aec833 100644 --- a/src/main/java/org/adde0109/ambassador/forge/packet/RegistryPacket.java +++ b/src/main/java/org/adde0109/ambassador/forge/packet/RegistryPacket.java @@ -50,6 +50,10 @@ public class RegistryPacket implements IForgeLoginWrapperPacket { return context; } + public String getRegistryName() { + return registryName; + } + public byte[] getSnapshot() { return snapshot; }