Waterfall/BungeeCord-Patches/0013-Allow-removing-servers-or-changing-addresses-on-relo.patch
LinsaFTW 1efb2d439e
Updated Upstream (BungeeCord) (#844)
Upstream has released updates that appear to apply and compile correctly.
This update has not been tested by PaperMC and as with ANY update, please do your own testing

BungeeCord Changes:
d0fa62d4 Minecraft 24w06a support
464ed018 Improve cookie support during login
eda268b4 Fix 24w05b spectate packet ID
3e100752 #3612: Error when disconnecting player on PostLoginEvent
b52b1469 Add PendingConnection#isTransferred API method
94d5b0d0 Minecraft 24w05b support
c3f228f6 #3610, 3611: inverted isEmpty method on ComponentStyle
02c5c1ee #3602: Minecraft 24w04a support
c69acf72 Add JetBrains java-annotations
a1cd6943 Bump version to 1.20-R0.3-SNAPSHOT
3e2bc8e2 Release 1.20-R0.2
ad7163d2 #3600: Bump io.netty:netty-bom from 4.1.104.Final to 4.1.106.Final
2024-02-24 17:21:31 +00:00

84 lines
4.5 KiB
Diff

From 9a24ff623c14bd07b709f8620d978d6432d9048a Mon Sep 17 00:00:00 2001
From: Techcable <Techcable@outlook.com>
Date: Thu, 28 Jan 2016 15:13:29 -0700
Subject: [PATCH] Allow removing servers or changing addresses on reload
Moves all players on the removed server to the default server.
Address changes also move the players to the default server.
Kicks players on failure to move.
Original Issue: https://github.com/WaterfallMC/Waterfall-Old/issues/17
diff --git a/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java b/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java
index 1a688179..fea0ec61 100644
--- a/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java
+++ b/proxy/src/main/java/net/md_5/bungee/conf/Configuration.java
@@ -11,12 +11,15 @@ import java.util.UUID;
import java.util.logging.Level;
import javax.imageio.ImageIO;
import lombok.Getter;
+
+import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.Favicon;
import net.md_5.bungee.api.ProxyConfig;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ConfigurationAdapter;
import net.md_5.bungee.api.config.ListenerInfo;
import net.md_5.bungee.api.config.ServerInfo;
+import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.util.CaseInsensitiveMap;
import net.md_5.bungee.util.CaseInsensitiveSet;
@@ -118,20 +121,38 @@ public abstract class Configuration implements ProxyConfig
servers = new CaseInsensitiveMap<>( newServers );
} else
{
- for ( ServerInfo oldServer : servers.values() )
- {
- // Don't allow servers to be removed
- Preconditions.checkArgument( newServers.containsKey( oldServer.getName() ), "Server %s removed on reload!", oldServer.getName() );
- }
+ Map<String, ServerInfo> oldServers = this.servers;
- // Add new servers
- for ( Map.Entry<String, ServerInfo> newServer : newServers.entrySet() )
+ for ( ServerInfo oldServer : oldServers.values() )
{
- if ( !servers.containsValue( newServer.getValue() ) )
- {
- servers.put( newServer.getKey(), newServer.getValue() );
+ ServerInfo newServer = newServers.get(oldServer.getName());
+ if ((newServer == null || !oldServer.getAddress().equals(newServer.getAddress())) && !oldServer.getPlayers().isEmpty()) {
+ BungeeCord.getInstance().getLogger().info("Moving players off of server: " + oldServer.getName());
+ // The server is being removed, or having it's address changed
+ for (ProxiedPlayer player : oldServer.getPlayers()) {
+ ListenerInfo listener = player.getPendingConnection().getListener();
+ String destinationName = newServers.get(listener.getDefaultServer()) == null ? listener.getDefaultServer() : listener.getFallbackServer();
+ ServerInfo destination = newServers.get(destinationName);
+ if (destination == null) {
+ BungeeCord.getInstance().getLogger().severe("Couldn't find server " + listener.getDefaultServer() + " or " + listener.getFallbackServer() + " to put player " + player.getName() + " on");
+ player.disconnect(BungeeCord.getInstance().getTranslation("fallback_kick", "Not found on reload"));
+ continue;
+ }
+ player.connect(destination, (success, cause) -> {
+ if (!success) {
+ BungeeCord.getInstance().getLogger().log(Level.WARNING, "Failed to connect " + player.getName() + " to " + destination.getName(), cause);
+ player.disconnect(BungeeCord.getInstance().getTranslation("fallback_kick", cause.getCause().getClass().getName()));
+ }
+ });
+ }
+ } else {
+ // This server isn't new or removed, we'll use bungees behavior of just ignoring
+ // any changes to info outside of the address, this is not ideal, but the alternative
+ // requires resetting multiple objects of which have no proper identity
+ newServers.put(oldServer.getName(), oldServer);
}
}
+ this.servers = new CaseInsensitiveMap<>(newServers);
}
for ( ListenerInfo listener : listeners )
--
2.43.0.windows.1