diff --git a/Velocity b/Velocity deleted file mode 160000 index 5fe3663..0000000 --- a/Velocity +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5fe3663d5102c98df1128b06f002e0c5b212f61f diff --git a/build.gradle b/build.gradle index 4cd568e..a2b0796 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'org.adde0109' -version '0.5.0' +version '0.4.0' repositories { maven { diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index 0db0d8d..35d54cd 100644 --- a/src/main/java/org/adde0109/ambassador/Ambassador.java +++ b/src/main/java/org/adde0109/ambassador/Ambassador.java @@ -23,7 +23,7 @@ import org.slf4j.Logger; import java.nio.file.Path; import java.util.*; -@Plugin(id = "ambassador", name = "Ambassador", version = "0.5.0", authors = {"adde0109"}) +@Plugin(id = "ambassador", name = "Ambassador", version = "0.4.0", authors = {"adde0109"}) public class Ambassador { public ProxyServer server; @@ -82,7 +82,7 @@ public class Ambassador { //Forge client ForgeConnection forgeConnection = forgeHandshakeHandler.getForgeConnection(event.getPlayer()).get(); if (forgeConnection.isForced()) { - event.setInitialServer(forgeConnection.getSyncResult().get().getSyncedServer()); + event.setInitialServer(forgeConnection.getSyncedServer().get()); } forgeConnection.setForced(config.getForced(forgeConnection.getConnection().getProtocolVersion().getProtocol())); } diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeConnection.java b/src/main/java/org/adde0109/ambassador/forge/ForgeConnection.java index e38ff06..6f2836d 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeConnection.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeConnection.java @@ -18,11 +18,13 @@ public class ForgeConnection { private final Logger logger; private final LoginPhaseConnection connection; + private Optional recivedClientModlist = Optional.empty(); + private static byte[] recivedClientACK; private boolean ignoreSyncExepction = false; + private Optional transmittedHandshake = Optional.empty(); private boolean forced = false; - - private SyncResult syncResult; + private Optional syncedTo = Optional.empty(); public ForgeConnection(LoginPhaseConnection connection, Logger logger) { @@ -45,35 +47,34 @@ public class ForgeConnection { - public void startSync(ForgeServerConnection forgeServerConnection, Continuation continuation) { + public CompletableFuture sync(ForgeServerConnection forgeServerConnection) { + CompletableFuture future = new CompletableFuture<>(); forgeServerConnection.getHandshake().whenComplete((msg,ex) -> { if (ex != null) { - continuation.resume(); + future.complete(false); logger.warn("Sync Exception: " + ex); } else { - CompletableFuture clientModListFuture = new CompletableFuture<>(); //This gets also sent to vanilla sendModlist(msg.modListPacket).thenAccept((response) -> { if (!ignoreSyncExepction && response == null) { logger.warn("Sync Exception: Client responded with an empty body."); } - clientModListFuture.complete(response); + recivedClientModlist = Optional.ofNullable(response); }); - syncResult = new SyncResult(msg,clientModListFuture, forgeServerConnection.getServer()); //This gets also sent to vanilla sendOther(msg.otherPackets).thenAccept((response) -> { if (!ignoreSyncExepction && response == null) { logger.warn("Sync Exception: Client responded with an empty body."); } //TODO: Generate the ACK packet ourself. - if (response != null && SyncResult.recivedClientACK == null) { - SyncResult.recivedClientACK = response; - } - syncResult.complete(syncResult); + ForgeConnection.recivedClientACK = (response == null) ? ForgeConnection.recivedClientACK : response; + transmittedHandshake = Optional.of(msg); + syncedTo = Optional.of(forgeServerConnection.getServer()); }); - continuation.resume(); + future.complete(true); } }); + return future; } private CompletableFuture sendModlist(byte[] modListPacket) { @@ -94,11 +95,6 @@ public class ForgeConnection { } public void handleServerHandshakePacket(ServerLoginPluginMessageEvent event, Continuation continuation) { - if (getSyncResult().isEmpty()) { - continuation.resumeWithException(new Exception("Client isn't synced. This should have been caught" + - " during serverPreConnect")); - return; - } ByteArrayDataInput data = event.contentsAsDataStream(); if (data.skipBytes(14) != 14) { //Channel Identifier continuation.resumeWithException(new EOFException()); @@ -108,27 +104,41 @@ public class ForgeConnection { int packetID = ForgeHandshakeUtils.readVarInt(data); if (packetID == 1) { - getSyncResult().get().getRecivedClientModlist().whenComplete((msg,ex) -> { - event.setResult(ServerLoginPluginMessageEvent.ResponseResult.reply(msg)); - continuation.resume(); - }); - } else { - if (SyncResult.recivedClientACK != null) { - event.setResult(ServerLoginPluginMessageEvent.ResponseResult.reply(SyncResult.recivedClientACK)); + if (getRecivedClientModlist().isPresent()) { + event.setResult(ServerLoginPluginMessageEvent.ResponseResult.reply(getRecivedClientModlist().get())); } else { - continuation.resumeWithException(new Exception("No ACK response packet available.")); + continuation.resumeWithException(new Exception("Client isn't synced. This should have been caught" + + " during serverPreConnect")); + return; + } + } else { + if (getRecivedClientACK() != null) { + event.setResult(ServerLoginPluginMessageEvent.ResponseResult.reply(getRecivedClientACK())); + } else { + continuation.resumeWithException(new Exception("No response available.")); return; } - continuation.resume(); } + continuation.resume(); } public LoginPhaseConnection getConnection() { return connection; } - public Optional getSyncResult() { - return Optional.ofNullable(syncResult); + public Optional getTransmittedHandshake() { + return transmittedHandshake; + } + + public Optional getRecivedClientModlist() { + return recivedClientModlist; + } + + public static byte[] getRecivedClientACK() { + return recivedClientACK; + } + public Optional getSyncedServer() { + return syncedTo; } public void setForced(boolean forced) { this.forced = forced; @@ -136,28 +146,4 @@ public class ForgeConnection { public boolean isForced() { return forced; } - public static class SyncResult extends CompletableFuture { - private final ForgeHandshakeUtils.CachedServerHandshake transmittedHandshake; - private final CompletableFuture recivedClientModlist; - private static byte[] recivedClientACK; - private final RegisteredServer syncedTo; - - SyncResult(ForgeHandshakeUtils.CachedServerHandshake transmittedHandshake, CompletableFuture recivedClientModlist, RegisteredServer syncedTo) { - this.transmittedHandshake = transmittedHandshake; - this.recivedClientModlist = recivedClientModlist; - this.syncedTo = syncedTo; - } - - public ForgeHandshakeUtils.CachedServerHandshake getTransmittedHandshake() { - return transmittedHandshake; - } - - public CompletableFuture getRecivedClientModlist() { - return recivedClientModlist; - } - - public RegisteredServer getSyncedServer() { - return syncedTo; - } - } } diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java index 4d32154..6e2b94e 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java @@ -52,7 +52,9 @@ public class ForgeHandshakeHandler { }); if (ambassador.forgeServerSwitchHandler.reSyncMap.containsKey(event.getUsername())) { - forgeConnection.startSync(ambassador.forgeServerSwitchHandler.reSyncMap.remove(event.getUsername()),continuation); + forgeConnection.sync(ambassador.forgeServerSwitchHandler.reSyncMap.remove(event.getUsername())).thenAccept((done) -> { + continuation.resume(); + }); forgeConnection.setForced(true); } else if (defaultServer != null) { //If a connection does not already exist, create one. @@ -60,7 +62,9 @@ public class ForgeHandshakeHandler { forgeServerConnectionMap.put(defaultServer, new ForgeServerConnection(defaultServer)); } //Forge Handshake - forgeConnection.startSync(forgeServerConnectionMap.get(defaultServer),continuation); + forgeConnection.sync(forgeServerConnectionMap.get(defaultServer)).thenAccept((done) -> { + continuation.resume(); + }); forgeConnection.setForced(ambassador.config.getForced(forgeConnection.getConnection().getProtocolVersion().getProtocol())); } else { continuation.resume(); diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeServerSwitchHandler.java b/src/main/java/org/adde0109/ambassador/forge/ForgeServerSwitchHandler.java index 37eb5ff..b64780f 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeServerSwitchHandler.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeServerSwitchHandler.java @@ -34,9 +34,8 @@ public class ForgeServerSwitchHandler { return; } Optional forgeServerConnectionOptional = ambassador.forgeHandshakeHandler.getForgeServerConnection(event.getOriginalServer()); - Optional forgeConnectionOptional = ambassador.forgeHandshakeHandler.getForgeConnection(event.getPlayer()); - if (forgeConnectionOptional.isPresent()) { - ForgeConnection forgeConnection = forgeConnectionOptional.get(); + Optional forgeConnection = ambassador.forgeHandshakeHandler.getForgeConnection(event.getPlayer()); + if (forgeConnection.isPresent()) { ForgeServerConnection forgeServerConnection = forgeServerConnectionOptional.orElseGet(() -> new ForgeServerConnection(event.getOriginalServer())); forgeServerConnection.getHandshake().whenComplete((msg, ex) -> { if (ex != null) { @@ -57,7 +56,7 @@ public class ForgeServerSwitchHandler { event.getPlayer().setGameProfileProperties(properties); if (ambassador.config.reSyncOptionForge() != AmbassadorConfig.reSyncOption.NEVER) { - if (forgeConnection.getSyncResult().isEmpty() || !msg.equals(forgeConnection.getSyncResult().get().getTransmittedHandshake())) { + if (forgeConnection.get().getTransmittedHandshake().isEmpty() || !msg.equals(forgeConnection.get().getTransmittedHandshake().get())) { event.setResult(ServerPreConnectEvent.ServerResult.denied()); reSync(event.getPlayer(),forgeServerConnection); }