mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-10-06 18:38:00 +02:00
c21eed1f7b
Upstream has released updates that appears 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: 70370faf Add checkstyle indentation checks 24a53a67 Show socketAddress in BungeeServerInfo.toString 503b4827 Fix bad formatting in EntityMap eeb37479 #2710: Store queue of pending keepalives 3f6aa033 Also check that things that should not be padded are so 78a84953 Add more checkstyle rules 636c0207 #2753: Add configurable remote ping caching a4512e50 Check Maven version in action build & don't print noisy transfer progress f510989c Add building of pull requests via GitHub Actions
84 lines
4.5 KiB
Diff
84 lines
4.5 KiB
Diff
From 27cf7ff629c65d8fdca62df4124069274e1deadd 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 03d51d88..8d047dfc 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;
|
|
|
|
@@ -107,20 +110,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.25.0
|
|
|