From 6276270a2c2c4b3258e63d7eafd59a41f1650dde Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Fri, 24 Jun 2022 02:41:13 +0200 Subject: [PATCH] Better vanilla handling --- .../org/adde0109/ambassador/Ambassador.java | 2 +- .../ambassador/ForgeHandshakeDataHandler.java | 56 ++++++++++++++----- .../adde0109/ambassador/PostSyncEvent.java | 8 +++ .../org/adde0109/ambassador/PreSyncEvent.java | 32 +++++++++++ 4 files changed, 83 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/adde0109/ambassador/PostSyncEvent.java create mode 100644 src/main/java/org/adde0109/ambassador/PreSyncEvent.java diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index fdfeab4..61e9269 100644 --- a/src/main/java/org/adde0109/ambassador/Ambassador.java +++ b/src/main/java/org/adde0109/ambassador/Ambassador.java @@ -35,7 +35,7 @@ public class Ambassador { public void onProxyInitialization(ProxyInitializeEvent event) { config = AmbassadorConfig.readOrCreateConfig(dataDirectory,server,logger); if(config != null) { - forgeHandshakeDataHandler = new ForgeHandshakeDataHandler(config,logger); + forgeHandshakeDataHandler = new ForgeHandshakeDataHandler(config,logger,server); server.getEventManager().register(this, forgeHandshakeDataHandler); } else { diff --git a/src/main/java/org/adde0109/ambassador/ForgeHandshakeDataHandler.java b/src/main/java/org/adde0109/ambassador/ForgeHandshakeDataHandler.java index b4d854b..8397a47 100644 --- a/src/main/java/org/adde0109/ambassador/ForgeHandshakeDataHandler.java +++ b/src/main/java/org/adde0109/ambassador/ForgeHandshakeDataHandler.java @@ -9,6 +9,7 @@ import com.velocitypowered.api.event.player.ServerPostConnectEvent; import com.velocitypowered.api.proxy.InboundConnection; import com.velocitypowered.api.proxy.LoginPhaseConnection; import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.ServerPing; @@ -16,6 +17,7 @@ import com.velocitypowered.api.util.ModInfo; import java.io.EOFException; import java.net.InetSocketAddress; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; import net.kyori.adventure.text.Component; import org.slf4j.Logger; @@ -36,10 +38,12 @@ public class ForgeHandshakeDataHandler { private final AmbassadorConfig config; private final Logger logger; + private final ProxyServer server; - public ForgeHandshakeDataHandler(AmbassadorConfig config,Logger logger) { + public ForgeHandshakeDataHandler(AmbassadorConfig config, Logger logger, ProxyServer server) { this.config = config; this.logger = logger; + this.server = server; } @Subscribe @@ -49,18 +53,29 @@ public class ForgeHandshakeDataHandler { return; } RegisteredServer server = config.getServer(event.getConnection().getProtocolVersion().getProtocol()); - getHandshake(server).whenComplete((msg,ex) -> { - if (ex != null) { - logger.warn("Could not sync player '" + event.getUsername() + "' to server '" - + server.getServerInfo().getName() +"' Cause: " + ex.getMessage()); - } else { - sendModlist(msg.modListPacket, (LoginPhaseConnection) event.getConnection(), server); - sendOther(msg.otherPackets, (LoginPhaseConnection) event.getConnection(), server); - } - continuation.resume(); - }); + + this.server.getEventManager().fire(new PreSyncEvent(event.getUsername(),event.getConnection(), server)) + .thenAccept((e) -> { + if (!e.getResult().getServer().isPresent()) { + //Do not sync + return; + } + getHandshake(server).whenComplete((msg,ex) -> { + if (ex != null) { + logger.warn("Could not sync player '" + event.getUsername() + "' to server '" + + server.getServerInfo().getName() +"' Cause: " + ex.getMessage()); + } else { + AtomicBoolean isForge = new AtomicBoolean(false); + sendModlist(msg.modListPacket, (LoginPhaseConnection) event.getConnection(), server).thenAccept(isForge::set); + sendOther(msg.otherPackets, (LoginPhaseConnection) event.getConnection(), server).thenAccept((ignored) -> {}); + } + //Writes the messages + continuation.resume(); + }); + }); } + @Subscribe public void onServerPostConnectEvent(ServerPostConnectEvent event) { RegisteredServer server = getSyncedServer(event.getPlayer()).orElse(null); @@ -123,18 +138,31 @@ public class ForgeHandshakeDataHandler { } } - private void sendModlist(byte[] modListPacket, LoginPhaseConnection connection, RegisteredServer server) { - connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml","loginwrapper"), modListPacket, responseBody -> recivedClientModlist.put(server,responseBody)); + //Should return ForgePlayer instead of Boolean in the future... + private CompletableFuture sendModlist(byte[] modListPacket, LoginPhaseConnection connection, RegisteredServer server) { + CompletableFuture future = new CompletableFuture(); + connection.sendLoginPluginMessage(MinecraftChannelIdentifier.create("fml","loginwrapper"), modListPacket, responseBody -> { + if (responseBody != null) { + recivedClientModlist.put(server,responseBody); + future.complete(true); + } else { + future.complete(false); + } + }); + return future; } - private void sendOther(List otherPackets, LoginPhaseConnection connection, RegisteredServer server) { + private CompletableFuture sendOther(List otherPackets, LoginPhaseConnection connection, RegisteredServer server) { + CompletableFuture future = new CompletableFuture(); for (int i = 0;i recivedClientACK = responseBody : responseBody -> { syncedConnections.put(connection,server); syncedConnections.keySet().removeIf(c -> !c.isActive()); + future.complete(null); }); } + return future; } public static int readVarInt(ByteArrayDataInput stream) { diff --git a/src/main/java/org/adde0109/ambassador/PostSyncEvent.java b/src/main/java/org/adde0109/ambassador/PostSyncEvent.java new file mode 100644 index 0000000..85c37a9 --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/PostSyncEvent.java @@ -0,0 +1,8 @@ +package org.adde0109.ambassador; + +public class PostSyncEvent { + + PostSyncEvent() { + + } +} diff --git a/src/main/java/org/adde0109/ambassador/PreSyncEvent.java b/src/main/java/org/adde0109/ambassador/PreSyncEvent.java new file mode 100644 index 0000000..942f612 --- /dev/null +++ b/src/main/java/org/adde0109/ambassador/PreSyncEvent.java @@ -0,0 +1,32 @@ +package org.adde0109.ambassador; + +import com.velocitypowered.api.event.ResultedEvent; +import com.velocitypowered.api.event.player.ServerPreConnectEvent; +import com.velocitypowered.api.proxy.InboundConnection; +import com.velocitypowered.api.proxy.server.RegisteredServer; + +public class PreSyncEvent implements ResultedEvent { + + private final String username; + private final InboundConnection connection; + private final RegisteredServer originalServer; + private ServerPreConnectEvent.ServerResult result; + + public PreSyncEvent(String username, InboundConnection connection, + RegisteredServer originalServer) { + this.username = username; + this.connection = connection; + this.originalServer = originalServer; + this.result = ServerPreConnectEvent.ServerResult.allowed(originalServer); + } + + @Override + public ServerPreConnectEvent.ServerResult getResult() { + return result; + } + + @Override + public void setResult(ServerPreConnectEvent.ServerResult result) { + + } +}