diff --git a/build.gradle b/build.gradle index 992dc6b..64a1348 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'org.adde0109' -version '0.2.0-SNAPSHOT' +version '0.2.1-SNAPSHOT' repositories { maven { diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index 577f640..c0386b9 100644 --- a/src/main/java/org/adde0109/ambassador/Ambassador.java +++ b/src/main/java/org/adde0109/ambassador/Ambassador.java @@ -3,14 +3,17 @@ package org.adde0109.ambassador; import com.google.inject.Inject; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.player.KickedFromServerEvent; import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; import com.velocitypowered.api.event.player.ServerPreConnectEvent; import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.event.proxy.ProxyPingEvent; import com.velocitypowered.api.plugin.Plugin; import com.velocitypowered.api.plugin.annotation.DataDirectory; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.server.RegisteredServer; +import com.velocitypowered.api.proxy.server.ServerPing; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.adde0109.ambassador.forge.ForgeConnection; @@ -23,14 +26,13 @@ import org.slf4j.Logger; import java.nio.file.Path; import java.util.*; -@Plugin(id = "ambassador", name = "Ambassador", version = "0.2.0-SNAPSHOT", authors = {"adde0109"}) +@Plugin(id = "ambassador", name = "Ambassador", version = "0.2.1-SNAPSHOT", authors = {"adde0109"}) public class Ambassador { private final ProxyServer server; private final Logger logger; private final Metrics.Factory metricsFactory; private final Path dataDirectory; - private Optional forgeServer; private AmbassadorConfig config; private ForgeHandshakeHandler forgeHandshakeHandler; @@ -86,8 +88,6 @@ public class Ambassador { } //Register newly discovered forge server if (forgeServerConnectionOptional.isEmpty()) { - forgeServerConnection.setDefaultClientModlist(forgeConnection.get().getRecivedClientModlist()); - forgeServerConnection.setDefaultClientACK(ForgeConnection.getRecivedClientACK()); forgeHandshakeHandler.registerForgeServer(event.getOriginalServer(), forgeServerConnection); } @@ -102,6 +102,10 @@ public class Ambassador { } } + @Subscribe + public void onKickedFromServerEvent(KickedFromServerEvent event, Continuation continuation) { + continuation.resume(); + } @Subscribe public void onPlayerChooseInitialServerEvent(PlayerChooseInitialServerEvent event, Continuation continuation) { @@ -115,5 +119,4 @@ public class Ambassador { } continuation.resume(); } - } diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeConnection.java b/src/main/java/org/adde0109/ambassador/forge/ForgeConnection.java index 748b999..6c88cd0 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeConnection.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeConnection.java @@ -1,8 +1,11 @@ package org.adde0109.ambassador.forge; +import com.google.common.io.ByteArrayDataInput; import com.velocitypowered.api.event.Continuation; +import com.velocitypowered.api.event.player.ServerLoginPluginMessageEvent; import com.velocitypowered.api.proxy.LoginPhaseConnection; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import java.io.EOFException; import java.util.List; import java.util.concurrent.CompletableFuture; @@ -21,16 +24,17 @@ public class ForgeConnection { } - public static CompletableFuture sync(LoginPhaseConnection connection, ForgeServerConnection forgeServerConnection, Continuation continuation) { + public static CompletableFuture sync(LoginPhaseConnection connection, + ForgeServerConnection forgeServerConnection, + Continuation continuation) { CompletableFuture future = new CompletableFuture<>(); ForgeConnection forgeConnection = new ForgeConnection(connection); - forgeServerConnection.getHandshake().whenComplete((msg,ex) -> { + forgeServerConnection.getHandshake().whenComplete((msg, ex) -> { if (ex != null) { future.completeExceptionally(ex); } else { forgeConnection.sendModlist(msg.modListPacket).thenAccept((response) -> { if (response != null) { - forgeServerConnection.setDefaultClientModlist(response); future.complete(forgeConnection); } else { future.complete(null); @@ -38,7 +42,6 @@ public class ForgeConnection { }); forgeConnection.sendOther(msg.otherPackets).thenAccept((response) -> { if (response != null) { - forgeServerConnection.setDefaultClientACK(response); future.complete(forgeConnection); } else { future.complete(null); @@ -54,26 +57,45 @@ public class ForgeConnection { public CompletableFuture sendModlist(byte[] modListPacket) { CompletableFuture future = new CompletableFuture<>(); - connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml","loginwrapper"), modListPacket, + connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml", "loginwrapper"), modListPacket, responseBody -> { - recivedClientModlist = responseBody; - future.complete(recivedClientModlist); + recivedClientModlist = responseBody; + future.complete(recivedClientModlist); }); return future; } CompletableFuture sendOther(List otherPackets) { CompletableFuture future = new CompletableFuture<>(); - for (int i = 0;i {} : responseBody -> { - recivedClientACK = responseBody; - future.complete(responseBody); + for (int i = 0; i < otherPackets.size(); i++) { + connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml", "loginwrapper"), otherPackets.get(i), + (i < (otherPackets.size() - 1)) ? responseBody -> { + } : responseBody -> { + if (responseBody != null) + recivedClientACK = responseBody; + future.complete(responseBody); }); } return future; } + public void handleServerHandshakePacket(ServerLoginPluginMessageEvent event, Continuation continuation) { + ByteArrayDataInput data = event.contentsAsDataStream(); + if (data.skipBytes(14) != 14) { //Channel Identifier + continuation.resumeWithException(new EOFException()); + return; + } + ForgeHandshakeUtils.readVarInt(data); //Length + int packetID = ForgeHandshakeUtils.readVarInt(data); + + if (packetID == 1) { + event.setResult(ServerLoginPluginMessageEvent.ResponseResult.reply(getRecivedClientModlist())); + } else { + event.setResult(ServerLoginPluginMessageEvent.ResponseResult.reply(getRecivedClientACK())); + } + continuation.resume(); +} + public LoginPhaseConnection getConnection() { return connection; } diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java index 8982d4e..4079dc0 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeHandshakeHandler.java @@ -1,5 +1,6 @@ package org.adde0109.ambassador.forge; +import com.google.common.io.ByteArrayDataInput; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.connection.PreLoginEvent; @@ -8,6 +9,7 @@ import com.velocitypowered.api.proxy.LoginPhaseConnection; import com.velocitypowered.api.proxy.Player; import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.server.RegisteredServer; +import java.io.EOFException; import java.net.InetSocketAddress; import java.util.HashMap; import java.util.Map; @@ -85,14 +87,11 @@ public class ForgeHandshakeHandler { @Subscribe public void onServerLoginPluginMessageEvent(ServerLoginPluginMessageEvent event, Continuation continuation) { - //Only respond the servers that we can respond to - if((!forgeServerConnectionMap.containsKey(event.getConnection().getServer()) - || (getForgeConnection(event.getConnection().getPlayer()).isEmpty()))) { + if (incomingForgeConnections.containsKey(event.getConnection().getPlayer().getRemoteAddress())) { + incomingForgeConnections.get(event.getConnection().getPlayer().getRemoteAddress()) + .handleServerHandshakePacket(event,continuation); + } else { continuation.resume(); - return; } - //Grab the connection responsible for this - no pun intended - ForgeServerConnection connection = forgeServerConnectionMap.get(event.getConnection().getServer()); - connection.handle(event,continuation); } } diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeServerConnection.java b/src/main/java/org/adde0109/ambassador/forge/ForgeServerConnection.java index 1d76d1b..20b9cb7 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeServerConnection.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeServerConnection.java @@ -15,8 +15,6 @@ public class ForgeServerConnection { private final Logger logger; private final RegisteredServer handshakeServer; private ForgeHandshakeUtils.CachedServerHandshake handshake; - private byte[] defaultClientModlist; - private byte[] defaultClientACK; public RegisteredServer getServer() { return handshakeServer; @@ -38,32 +36,6 @@ public class ForgeServerConnection { return future; } - public void handle(ServerLoginPluginMessageEvent event, Continuation continuation) { - ByteArrayDataInput data = event.contentsAsDataStream(); - if(data.skipBytes(PACKET_LENGTH_INDEX) != PACKET_LENGTH_INDEX) { //Channel Identifier - continuation.resumeWithException(new EOFException()); - return; - } - ForgeHandshakeUtils.readVarInt(data); //Length - int packetID = ForgeHandshakeUtils.readVarInt(data); - - if(packetID == 1) { - event.setResult(ServerLoginPluginMessageEvent.ResponseResult.reply(defaultClientModlist)); - } - else { - event.setResult(ServerLoginPluginMessageEvent.ResponseResult.reply(defaultClientACK)); - } - continuation.resume(); - } - - public void setDefaultClientModlist(byte[] modlist) { - this.defaultClientModlist = modlist; - } - - public void setDefaultClientACK(byte[] ACK) { - this.defaultClientACK = ACK; - } - public ServerInfo getServerInfo() { return handshakeServer.getServerInfo(); }