Verify per registry message
This commit is contained in:
parent
55e0a66122
commit
dd89f5e07c
|
|
@ -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<String, Long> 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<String, Long> getRegistries() {
|
||||
return registries;
|
||||
}
|
||||
|
||||
public boolean isCompatible(ForgeHandshake handshake) {
|
||||
return this.registries.equals(handshake.registries);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -50,6 +50,10 @@ public class RegistryPacket implements IForgeLoginWrapperPacket<Context> {
|
|||
return context;
|
||||
}
|
||||
|
||||
public String getRegistryName() {
|
||||
return registryName;
|
||||
}
|
||||
|
||||
public byte[] getSnapshot() {
|
||||
return snapshot;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user