From 4dfa9d02bd3db43c5c5ee45c47103f71bcb4de6c Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Thu, 27 Oct 2022 22:33:21 +0200 Subject: [PATCH] Doesn't ping the server. Legacy forwarding --- build.gradle | 2 +- .../org/adde0109/ambassador/Ambassador.java | 2 +- .../forge/FML2ClientConnectionPhase.java | 77 +++++++------------ .../forge/ForgeFMLConnectionType.java | 5 +- .../velocity/VelocityEventHandler.java | 19 ++++- .../VelocityForgeBackendHandshakeHandler.java | 11 ++- 6 files changed, 56 insertions(+), 60 deletions(-) diff --git a/build.gradle b/build.gradle index 8fff7af..1790e83 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'org.adde0109' -version '1.0.13-alpha' +version '1.1.0-alpha' repositories { maven { diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index b90cea5..2e87081 100644 --- a/src/main/java/org/adde0109/ambassador/Ambassador.java +++ b/src/main/java/org/adde0109/ambassador/Ambassador.java @@ -22,7 +22,7 @@ import org.slf4j.Logger; import java.nio.file.Path; -@Plugin(id = "ambassador", name = "Ambassador", version = "1.0.13-alpha", authors = {"adde0109"}) +@Plugin(id = "ambassador", name = "Ambassador", version = "1.1.0-alpha", authors = {"adde0109"}) public class Ambassador { public ProxyServer server; diff --git a/src/main/java/org/adde0109/ambassador/forge/FML2ClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/FML2ClientConnectionPhase.java index cd940f4..af889e5 100644 --- a/src/main/java/org/adde0109/ambassador/forge/FML2ClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/FML2ClientConnectionPhase.java @@ -1,25 +1,25 @@ package org.adde0109.ambassador.forge; import com.velocitypowered.api.event.Continuation; -import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.proxy.server.ServerPing; import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; +import com.velocitypowered.proxy.connection.client.LoginSessionHandler; import com.velocitypowered.proxy.protocol.ProtocolUtils; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelInitializer; import io.netty.util.ReferenceCountUtil; import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.NamedTextColor; import org.adde0109.ambassador.velocity.VelocityForgeClientConnectionPhase; -import org.adde0109.ambassador.velocity.VelocityLoginPayloadManager; import org.apache.commons.collections4.map.PassiveExpiringMap; +import java.lang.reflect.Method; import java.util.Arrays; -import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -33,25 +33,32 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas private RegisteredServer triedServer; private Continuation continuation; + private static final Method CONNECT_TO_INITIAL_SERVER; + + static { + try { + CONNECT_TO_INITIAL_SERVER = LoginSessionHandler.class.getDeclaredMethod("connectToInitialServer", ConnectedPlayer.class); + CONNECT_TO_INITIAL_SERVER.setAccessible(true); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } @Override public void handleLogin(ConnectedPlayer player, VelocityServer server, Continuation continuation) { this.continuation = continuation; final MinecraftConnection connection = player.getConnection(); - final Runnable defaultTask = () -> { - Optional initialFromConfig = player.getNextServerToTry(); - PlayerChooseInitialServerEvent event = new PlayerChooseInitialServerEvent(player, - initialFromConfig.orElse(null)); - server.getEventManager().fire(event) - .thenRun(() -> { - Optional toTry = event.getInitialServer(); - tryServer(player, toTry.orElse(null)); - }); - }; - forced = TEMPORARY_FORCED.remove(player.getUsername()); - connection.eventLoop().submit(defaultTask); + if (forced != null) { + player.createConnectionRequest(forced).fireAndForget(); + } else { + try { + CONNECT_TO_INITIAL_SERVER.invoke(player.getConnection().getSessionHandler(),player); + } catch (ReflectiveOperationException e) { + continuation.resumeWithException(e); + } + } } @Override @@ -73,30 +80,13 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas if (triedServer != null) player.sendMessage(Component.translatable("velocity.error.connecting-server-error", Component.text(triedServer.getServerInfo().getName()))); - if (clientPhase == ClientPhase.MODLIST) { - clientPhase = ClientPhase.MODDED; - internalServerConnection = player.getConnectionInFlight(); - player.resetInFlightConnection(); - continuation.resume(); - } + clientPhase = clientPhase == ClientPhase.MODLIST ? ClientPhase.MODDED : ClientPhase.VANILLA; + internalServerConnection = player.getConnectionInFlight(); + player.resetInFlightConnection(); + continuation.resume(); + } - private void tryServer(ConnectedPlayer player, RegisteredServer server) { - if (server == null) { - player.disconnect0(Component.translatable("velocity.error.no-available-servers", - NamedTextColor.RED), true); - return; - } - server.ping().whenCompleteAsync((msg,ex) -> { - if (ex != null) { - if (throwable == null) - throwable = ex; - tryServer(player, player.getNextServerToTry().orElse(null)); - } else { - handlePingResponse(player, server, msg); - } - }, player.getConnection().eventLoop()); - } @Override @@ -120,15 +110,4 @@ public class FML2ClientConnectionPhase extends VelocityForgeClientConnectionPhas ReferenceCountUtil.release(buf); } } - - - private void handlePingResponse(ConnectedPlayer player, RegisteredServer server, ServerPing ping) { - if (ping.getModinfo().isEmpty()) { - clientPhase = ClientPhase.VANILLA; - continuation.resume(); - } else { - player.createConnectionRequest(server).fireAndForget(); - } - - } } diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeFMLConnectionType.java b/src/main/java/org/adde0109/ambassador/forge/ForgeFMLConnectionType.java index 803f0e3..8d6ffe1 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeFMLConnectionType.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeFMLConnectionType.java @@ -30,8 +30,9 @@ public class ForgeFMLConnectionType implements ConnectionType { @Override public GameProfile addGameProfileTokensIfRequired(GameProfile original, PlayerInfoForwarding forwardingType) { if (forwardingType == PlayerInfoForwarding.LEGACY) { - original.addProperties(Collections.singleton(new GameProfile.Property("extraData", "\1FML" + netVersion + "\1", ""))); + return original.addProperties(Collections.singleton(new GameProfile.Property("extraData", "\1FML" + netVersion + "\1", ""))); + } else { + return original; } - return original; } } diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java index 919ea75..9433da4 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java @@ -9,6 +9,7 @@ import com.velocitypowered.api.event.connection.PostLoginEvent; import com.velocitypowered.api.event.permission.PermissionsSetupEvent; import com.velocitypowered.api.event.player.KickedFromServerEvent; import com.velocitypowered.api.event.player.PlayerChooseInitialServerEvent; +import com.velocitypowered.api.event.player.ServerPostConnectEvent; import com.velocitypowered.api.event.player.ServerPreConnectEvent; import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; @@ -44,7 +45,7 @@ public class VelocityEventHandler { continuation.resume(); } - @Subscribe(order = PostOrder.FIRST) + @Subscribe(order = PostOrder.LAST) public void onServerPreConnectEvent(ServerPreConnectEvent event, Continuation continuation) { ConnectedPlayer player = (ConnectedPlayer) event.getPlayer(); if (!(player.getPhase() instanceof VelocityForgeClientConnectionPhase phase)) { @@ -65,10 +66,22 @@ public class VelocityEventHandler { continuation.resume(); return; } - if (phase.forced != null) - event.setInitialServer(phase.forced); if (event.getInitialServer().isEmpty()) event.setInitialServer(phase.internalServerConnection.getServer()); continuation.resume(); } + + @Subscribe(order = PostOrder.LAST) + public void onServerPostConnectEvent(ServerPostConnectEvent event, Continuation continuation) { + ConnectedPlayer player = (ConnectedPlayer) event.getPlayer(); + if (!(player.getPhase() instanceof VelocityForgeClientConnectionPhase phase)) { + continuation.resume(); + return; + } + if (phase.internalServerConnection != null) { + player.setConnectedServer(null); + } + continuation.resume(); + } + } diff --git a/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java b/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java index b20e980..c1df185 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/backend/VelocityForgeBackendHandshakeHandler.java @@ -1,6 +1,7 @@ package org.adde0109.ambassador.velocity.backend; import com.velocitypowered.proxy.VelocityServer; +import com.velocitypowered.proxy.config.PlayerInfoForwarding; import com.velocitypowered.proxy.connection.ConnectionType; import com.velocitypowered.proxy.connection.MinecraftConnection; import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; @@ -69,10 +70,12 @@ public class VelocityForgeBackendHandshakeHandler extends ChannelDuplexHandler { if (connection.getAssociation() instanceof VelocityServerConnection serverConnection) { if (serverConnection.getPlayer().getConnection().getType() instanceof ForgeFMLConnectionType type) { initBackend(connection,serverConnection,type); - if (type == ForgeConstants.ForgeFML2) { - handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML2Marker); - } else if (type == ForgeConstants.ForgeFML3) { - handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML3Marker); + if (server.getConfiguration().getPlayerInfoForwardingMode() != PlayerInfoForwarding.LEGACY) { + if (type == ForgeConstants.ForgeFML2) { + handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML2Marker); + } else if (type == ForgeConstants.ForgeFML3) { + handshake.setServerAddress(handshake.getServerAddress() + ForgeConstants.FML3Marker); + } } } else { ctx.pipeline().remove(this);