From 17e23d5c3f1d3aa0bbd6497c7839b780e88ae053 Mon Sep 17 00:00:00 2001 From: ignPurple Date: Sat, 13 Apr 2024 17:08:15 +1000 Subject: [PATCH] #3628: Convert PostLoginEvent to AsyncEvent and expose target server --- .../md_5/bungee/api/event/PostLoginEvent.java | 16 +++++++-- .../bungee/connection/InitialHandler.java | 35 ++++++++++++------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/api/src/main/java/net/md_5/bungee/api/event/PostLoginEvent.java b/api/src/main/java/net/md_5/bungee/api/event/PostLoginEvent.java index 70660af3f..2112aa8b9 100644 --- a/api/src/main/java/net/md_5/bungee/api/event/PostLoginEvent.java +++ b/api/src/main/java/net/md_5/bungee/api/event/PostLoginEvent.java @@ -3,8 +3,9 @@ package net.md_5.bungee.api.event; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; +import net.md_5.bungee.api.Callback; +import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; -import net.md_5.bungee.api.plugin.Event; /** * Event called as soon as a connection has a {@link ProxiedPlayer} and is ready @@ -13,11 +14,22 @@ import net.md_5.bungee.api.plugin.Event; @Data @ToString(callSuper = false) @EqualsAndHashCode(callSuper = false) -public class PostLoginEvent extends Event +public class PostLoginEvent extends AsyncEvent { /** * The player involved with this event. */ private final ProxiedPlayer player; + /** + * The server to which the player will initially be connected. + */ + private ServerInfo target; + + public PostLoginEvent(ProxiedPlayer player, ServerInfo target, Callback done) + { + super( done ); + this.player = player; + this.target = target; + } } diff --git a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java index d9247fb2f..4ccd71e3b 100644 --- a/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java +++ b/proxy/src/main/java/net/md_5/bungee/connection/InitialHandler.java @@ -652,28 +652,37 @@ public class InitialHandler extends PacketHandler implements PendingConnection } ch.getHandle().pipeline().get( HandlerBoss.class ).setHandler( new UpstreamBridge( bungee, userCon ) ); - bungee.getPluginManager().callEvent( new PostLoginEvent( userCon ) ); - // #3612: Don't progress further if disconnected during event - if ( ch.isClosed() ) - { - return; - } - - ServerInfo server; + ServerInfo initialServer; if ( bungee.getReconnectHandler() != null ) { - server = bungee.getReconnectHandler().getServer( userCon ); + initialServer = bungee.getReconnectHandler().getServer( userCon ); } else { - server = AbstractReconnectHandler.getForcedHost( InitialHandler.this ); + initialServer = AbstractReconnectHandler.getForcedHost( InitialHandler.this ); } - if ( server == null ) + if ( initialServer == null ) { - server = bungee.getServerInfo( listener.getDefaultServer() ); + initialServer = bungee.getServerInfo( listener.getDefaultServer() ); } - userCon.connect( server, null, true, ServerConnectEvent.Reason.JOIN_PROXY ); + Callback complete = new Callback() + { + @Override + public void done(PostLoginEvent result, Throwable error) + { + // #3612: Don't progress further if disconnected during event + if ( ch.isClosed() ) + { + return; + } + + userCon.connect( result.getTarget(), null, true, ServerConnectEvent.Reason.JOIN_PROXY ); + } + }; + + // fire post-login event + bungee.getPluginManager().callEvent( new PostLoginEvent( userCon, initialServer, complete ) ); } @Override