From c3452fa501198b788da023ecf58d5bdf1dd87560 Mon Sep 17 00:00:00 2001 From: Adrian Bergqvist Date: Fri, 7 Oct 2022 21:47:02 +0200 Subject: [PATCH] Rescue connection --- build.gradle | 2 +- .../org/adde0109/ambassador/Ambassador.java | 2 +- .../forge/ForgeFML2ClientConnectionPhase.java | 25 ++++++++----------- .../velocity/VelocityEventHandler.java | 18 ++++++------- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/build.gradle b/build.gradle index 6a12c4c..f849837 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'org.adde0109' -version '1.0.3-alpha' +version '1.0.4-alpha' repositories { maven { diff --git a/src/main/java/org/adde0109/ambassador/Ambassador.java b/src/main/java/org/adde0109/ambassador/Ambassador.java index c67f391..14a3033 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.3-alpha", authors = {"adde0109"}) +@Plugin(id = "ambassador", name = "Ambassador", version = "1.0.4-alpha", authors = {"adde0109"}) public class Ambassador { public ProxyServer server; diff --git a/src/main/java/org/adde0109/ambassador/forge/ForgeFML2ClientConnectionPhase.java b/src/main/java/org/adde0109/ambassador/forge/ForgeFML2ClientConnectionPhase.java index 521ad7a..127f7ff 100644 --- a/src/main/java/org/adde0109/ambassador/forge/ForgeFML2ClientConnectionPhase.java +++ b/src/main/java/org/adde0109/ambassador/forge/ForgeFML2ClientConnectionPhase.java @@ -1,43 +1,33 @@ package org.adde0109.ambassador.forge; import com.velocitypowered.api.event.Continuation; -import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.event.player.KickedFromServerEvent; +import com.velocitypowered.api.proxy.server.RegisteredServer; import com.velocitypowered.api.util.UuidUtils; -import com.velocitypowered.proxy.Velocity; import com.velocitypowered.proxy.VelocityServer; import com.velocitypowered.proxy.config.PlayerInfoForwarding; import com.velocitypowered.proxy.config.VelocityConfiguration; import com.velocitypowered.proxy.connection.MinecraftConnection; -import com.velocitypowered.proxy.connection.client.ClientConnectionPhase; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; -import com.velocitypowered.proxy.protocol.MinecraftPacket; import com.velocitypowered.proxy.protocol.StateRegistry; import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; import com.velocitypowered.proxy.protocol.packet.LoginPluginResponse; import com.velocitypowered.proxy.protocol.packet.PluginMessage; import com.velocitypowered.proxy.protocol.packet.ServerLoginSuccess; -import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; -import net.kyori.adventure.text.Component; import org.adde0109.ambassador.velocity.VelocityForgeClientConnectionPhase; import org.adde0109.ambassador.velocity.VelocityForgeHandshakeSessionHandler; -import org.checkerframework.checker.units.qual.A; -import org.checkerframework.checker.units.qual.C; -import javax.annotation.Nullable; -import java.lang.reflect.Method; import java.util.ArrayList; -import java.util.List; -import java.util.Optional; import java.util.UUID; -import java.util.concurrent.*; public class ForgeFML2ClientConnectionPhase implements VelocityForgeClientConnectionPhase { private boolean isResettable; //TODO: Use modData inside ConnectedPlayer instead public byte[] modListData; + private RegisteredServer backupServer; private final ArrayList listenerList = new ArrayList(); private Runnable whenComplete; @@ -87,6 +77,7 @@ public class ForgeFML2ClientConnectionPhase implements VelocityForgeClientConnec public void reset(ConnectedPlayer player, Runnable whenComplete) { this.whenComplete = whenComplete; if (player.getConnectedServer() != null) { + backupServer = player.getConnectedServer().getServer(); player.getConnectedServer().disconnect(); } MinecraftConnection connection = player.getConnection(); @@ -116,8 +107,12 @@ public class ForgeFML2ClientConnectionPhase implements VelocityForgeClientConnec connection.setState(StateRegistry.PLAY); connection.setSessionHandler(((VelocityForgeHandshakeSessionHandler) connection.getSessionHandler()).getOriginal()); } - public void send(ConnectedPlayer player, MinecraftPacket message) { - player.getConnection().write(message); + + public void handleKick(KickedFromServerEvent event) { + if (backupServer != null) { + net.kyori.adventure.text.Component reason = event.getServerKickReason().orElse(null); + event.setResult(KickedFromServerEvent.RedirectPlayer.create(backupServer,reason)); + } } public enum ClientPhase { diff --git a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java index 229a399..f247505 100644 --- a/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java +++ b/src/main/java/org/adde0109/ambassador/velocity/VelocityEventHandler.java @@ -3,18 +3,10 @@ package org.adde0109.ambassador.velocity; import com.velocitypowered.api.event.Continuation; import com.velocitypowered.api.event.Subscribe; import com.velocitypowered.api.event.permission.PermissionsSetupEvent; -import com.velocitypowered.api.event.player.ServerLoginPluginMessageEvent; -import com.velocitypowered.proxy.connection.MinecraftConnection; -import com.velocitypowered.proxy.connection.MinecraftSessionHandler; -import com.velocitypowered.proxy.connection.backend.VelocityServerConnection; +import com.velocitypowered.api.event.player.KickedFromServerEvent; import com.velocitypowered.proxy.connection.client.ConnectedPlayer; -import com.velocitypowered.proxy.protocol.packet.LoginPluginMessage; -import io.netty.buffer.Unpooled; import org.adde0109.ambassador.Ambassador; import org.adde0109.ambassador.forge.ForgeFML2ClientConnectionPhase; -import org.adde0109.ambassador.forge.ForgeFML2ConnectionType; -import org.adde0109.ambassador.velocity.backend.VelocityForgeBackendConnectionPhase; -import org.adde0109.ambassador.velocity.backend.VelocityForgeBackendHandshakeHandler; import java.util.Objects; @@ -38,4 +30,12 @@ public class VelocityEventHandler { } player.getConnection().eventLoop().submit(() -> phase.handleLogin(player,null,continuation)); } + + @Subscribe + public void onKickedFromServerEvent(KickedFromServerEvent event, Continuation continuation) { + if (((ConnectedPlayer) event.getPlayer()).getPhase() instanceof ForgeFML2ClientConnectionPhase phase) { + phase.handleKick(event); + } + continuation.resume(); + } }