Choose fallback based on confidence score

The fallback server chosen when a server goes down is now chosen based on SubServers' confidence that the server can recieve the player in question.

If there is a tie, the first server to achieve a high score is chosen. Servers meeting these requirements will get the highest score currently possible:
-> Fallback servers should not be white-listed (`Restricted: false`)
-> Fallback servers should be visible (`Hidden: false`)
-> Fallback subservers should be running
-> SubServers trusts that fallback servers connected to SubData are online
This commit is contained in:
ME1312 2018-10-14 03:26:23 -04:00
parent ba2a69a568
commit 52c6da2517
No known key found for this signature in database
GPG Key ID: FEFFE2F698E88FA8
11 changed files with 183 additions and 79 deletions

View File

@ -1,12 +1,15 @@
package net.ME1312.SubServers.Bungee.Host;
import net.ME1312.SubServers.Bungee.Event.SubEditServerEvent;
import net.ME1312.SubServers.Bungee.Event.SubNetworkConnectEvent;
import net.ME1312.SubServers.Bungee.Event.SubNetworkDisconnectEvent;
import net.ME1312.SubServers.Bungee.Library.Config.YAMLSection;
import net.ME1312.SubServers.Bungee.Library.Config.YAMLValue;
import net.ME1312.SubServers.Bungee.Library.Exception.InvalidServerException;
import net.ME1312.SubServers.Bungee.Library.NamedContainer;
import net.ME1312.SubServers.Bungee.Library.Util;
import net.ME1312.SubServers.Bungee.Network.Client;
import net.ME1312.SubServers.Bungee.Network.Packet.PacketOutRunEvent;
import net.ME1312.SubServers.Bungee.Network.SubDataServer;
import net.ME1312.SubServers.Bungee.SubAPI;
import net.ME1312.SubServers.Bungee.SubPlugin;
@ -45,6 +48,12 @@ public class ServerContainer extends BungeeServerInfo implements Server {
@Override
public void setSubData(Client client) {
this.client = client;
for (Proxy proxy : SubAPI.getInstance().getProxies().values()) if (proxy.getSubData() != null) {
YAMLSection args = new YAMLSection();
args.set("server", getName());
if (client != null) args.set("address", client.getAddress().toString());
proxy.getSubData().sendPacket(new PacketOutRunEvent((client != null)?SubNetworkConnectEvent.class:SubNetworkDisconnectEvent.class, args));
}
if (client != null && (client.getHandler() == null || !equals(client.getHandler()))) client.setHandler(this);
}

View File

@ -1,4 +1,4 @@
# SubCreator Sponge Build Script
# SubCreator Sponge Forge Script
# Usage: "bash build.sh <forge version> <sponge version>"
#
#!/usr/bin/env bash

View File

@ -35,7 +35,7 @@ listeners:
max_players: 1
tab_size: 60
ping_passthrough: false
force_default_server: false
force_default_server: true
player_limit: -1
online_mode: true
log_commands: false

View File

@ -726,19 +726,47 @@ public final class SubPlugin extends BungeeCord implements Listener {
@EventHandler(priority = Byte.MIN_VALUE)
public void fallback(ServerKickEvent e) {
if (e.getPlayer().getPendingConnection().getListener().isForceDefault()) {
int i = 0;
ServerInfo from = e.getKickedFrom();
ServerInfo to = null;
while (to == null || from == to) {
if (e.getPlayer().getPendingConnection().getListener().getServerPriority().size() > i) {
to = getServerInfo(e.getPlayer().getPendingConnection().getListener().getServerPriority().get(i));
} else break;
i++;
ServerInfo next = null;
for (String name : e.getPlayer().getPendingConnection().getListener().getServerPriority()) {
if (!e.getKickedFrom().getName().equalsIgnoreCase(name)) {
ServerInfo server = getServerInfo(name);
if (server != null) {
if (next == null) {
next = server;
} else {
int current = 0;
if (next instanceof Server) {
if (!((Server) next).isHidden()) current++;
if (!((Server) next).isRestricted()) current++;
if (((Server) next).getSubData() != null) current++;
if (next instanceof SubServer) {
if (((SubServer) next).isRunning()) current++;
}
}
int proposed = 0;
if (server instanceof Server) {
if (!((Server) server).isHidden()) proposed++;
if (!((Server) server).isRestricted()) proposed++;
if (((Server) server).getSubData() != null) proposed++;
if (server instanceof SubServer) {
if (((SubServer) server).isRunning()) proposed++;
}
}
if (proposed > current)
next = server;
}
}
}
}
if (to != null && from != to) {
e.setCancelServer(to);
if (next != null) {
e.setCancelServer(next);
e.setCancelled(true);
e.getPlayer().sendMessage(api.getLang("SubServers", "Bungee.Feature.Return").replace("$str$", (to instanceof Server)?((Server) to).getDisplayName():to.getName()).replace("$msg$", e.getKickReason()));
e.getPlayer().sendMessage(api.getLang("SubServers", "Bungee.Feature.Return").replace("$str$", (next instanceof Server)?((Server) next).getDisplayName():next.getName()).replace("$msg$", e.getKickReason()));
}
}
}

View File

@ -32,7 +32,7 @@ listeners:
max_players: 1
tab_size: 60
ping_passthrough: false
force_default_server: false
force_default_server: true
player_limit: -1
online_mode: true
log_commands: false

View File

@ -6,6 +6,7 @@ import net.ME1312.SubServers.Sync.Library.Config.YAMLSection;
import net.ME1312.SubServers.Sync.Library.NamedContainer;
import net.ME1312.SubServers.Sync.Library.Version.Version;
import net.ME1312.SubServers.Sync.Network.PacketIn;
import net.ME1312.SubServers.Sync.SubPlugin;
import net.md_5.bungee.api.ProxyServer;
import java.util.ArrayList;
@ -22,7 +23,7 @@ public class PacketInRunEvent implements PacketIn {
/**
* New PacketInRunEvent
*/
public PacketInRunEvent() {
public PacketInRunEvent(SubPlugin plugin) {
callback("SubAddHostEvent", new Callback<YAMLSection>() {
@Override
public void run(YAMLSection data) {
@ -73,6 +74,20 @@ public class PacketInRunEvent implements PacketIn {
callback("SubStartEvent", this);
}
});
callback("SubNetworkConnectEvent", new Callback<YAMLSection>() {
@Override
public void run(YAMLSection data) {
plugin.connect(plugin.servers.get(data.getRawString("server").toLowerCase()), data.getRawString("address"));
callback("SubNetworkConnectEvent", this);
}
});
callback("SubNetworkDisconnectEvent", new Callback<YAMLSection>() {
@Override
public void run(YAMLSection data) {
plugin.disconnect(plugin.servers.get(data.getRawString("server").toLowerCase()));
callback("SubNetworkDisconnectEvent", this);
}
});
callback("SubStopEvent", new Callback<YAMLSection>() {
@Override
public void run(YAMLSection data) {

View File

@ -146,7 +146,7 @@ public final class SubDataClient {
registerPacket(new PacketDownloadPlayerList(), "SubServers", "DownloadPlayerList");
registerPacket(new PacketDownloadProxyInfo(), "SubServers", "DownloadProxyInfo");
registerPacket(new PacketDownloadServerInfo(), "SubServers", "DownloadServerInfo");
registerPacket(new PacketInRunEvent(), "SubServers", "RunEvent");
registerPacket(new PacketInRunEvent(plugin), "SubServers", "RunEvent");
registerPacket(new PacketInReset(), "SubServers", "Reset");
registerPacket(new PacketLinkProxy(plugin), "SubServers", "LinkProxy");
registerPacket(new PacketStartServer(), "SubServers", "StartServer");

View File

@ -10,19 +10,39 @@ import java.net.InetSocketAddress;
/**
* Server Class
*/
public class Server extends BungeeServerInfo {
public class ServerContainer extends BungeeServerInfo {
private final String signature;
private String nick = null;
private String subdata;
private boolean hidden;
public Server(String signature, String name, String display, InetSocketAddress address, String motd, boolean hidden, boolean restricted) {
public ServerContainer(String signature, String name, String display, InetSocketAddress address, String subdata, String motd, boolean hidden, boolean restricted) {
super(name, address, motd, restricted);
if (Util.isNull(name, address, motd, hidden, restricted)) throw new NullPointerException();
this.signature = signature;
this.subdata = subdata;
this.hidden = hidden;
setDisplayName(display);
}
/**
* Gets the SubData Client Address
*
* @return SubData Client Address (or null if not linked)
*/
public String getSubData() {
return subdata;
}
/**
* Sets the SubData Client Address
*
* @param subdata SubData Client Address (null represents not linked)
*/
public void setSubData(String subdata) {
this.subdata = subdata;
}
/**
* Get the Display Name of this Server
*

View File

@ -5,11 +5,11 @@ import java.net.InetSocketAddress;
/**
* SubServer Class
*/
public class SubServer extends Server {
public class SubServerContainer extends ServerContainer {
private boolean running;
public SubServer(String signature, String name, String display, InetSocketAddress address, String motd, boolean hidden, boolean restricted, boolean running) {
super(signature, name, display, address, motd, hidden, restricted);
public SubServerContainer(String signature, String name, String display, InetSocketAddress address, String subdata, String motd, boolean hidden, boolean restricted, boolean running) {
super(signature, name, display, address, subdata, motd, hidden, restricted);
this.running = running;
}

View File

@ -8,6 +8,8 @@ import net.ME1312.SubServers.Sync.Library.Util;
import net.ME1312.SubServers.Sync.Library.Version.Version;
import net.ME1312.SubServers.Sync.Network.API.*;
import net.ME1312.SubServers.Sync.Network.Packet.*;
import net.ME1312.SubServers.Sync.Server.ServerContainer;
import net.ME1312.SubServers.Sync.Server.SubServerContainer;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.ClickEvent;
@ -539,7 +541,7 @@ public final class SubCommand extends CommandX {
for (String proxy : proxyCache) if (!list.contains(proxy)) list.add(proxy);
for (String host : hostCache.keySet()) if (!list.contains(host)) list.add(host);
for (String group : groupCache) if (!list.contains(group)) list.add(group);
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) if (!list.contains(server.getName())) list.add(server.getName());
for (ServerContainer server : plugin.servers.values()) if (!list.contains(server.getName())) list.add(server.getName());
} else {
for (String command : subcommands) {
if (!list.contains(command) && command.toLowerCase().startsWith(last))
@ -557,7 +559,7 @@ public final class SubCommand extends CommandX {
if (!list.contains(group) && group.toLowerCase().startsWith(last))
list.add(last + group.substring(last.length()));
}
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) {
for (ServerContainer server : plugin.servers.values()) {
if (!list.contains(server.getName()) && server.getName().toLowerCase().startsWith(last))
list.add(last + server.getName().substring(last.length()));
}
@ -583,7 +585,7 @@ public final class SubCommand extends CommandX {
case "s":
case "server":
case "subserver":
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) list.add(server.getName());
for (ServerContainer server : plugin.servers.values()) list.add(server.getName());
break;
}
} else {
@ -612,7 +614,7 @@ public final class SubCommand extends CommandX {
case "s":
case "server":
case "subserver":
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) {
for (ServerContainer server : plugin.servers.values()) {
if (server.getName().toLowerCase().startsWith(last))
list.add(last + server.getName().substring(last.length()));
}
@ -629,10 +631,10 @@ public final class SubCommand extends CommandX {
List<String> list = new ArrayList<String>();
if (args.length == 2) {
if (last.length() == 0) {
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) if (server instanceof net.ME1312.SubServers.Sync.Server.SubServer) list.add(server.getName());
for (ServerContainer server : plugin.servers.values()) if (server instanceof SubServerContainer) list.add(server.getName());
} else {
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) {
if (server instanceof net.ME1312.SubServers.Sync.Server.SubServer && server.getName().toLowerCase().startsWith(last))
for (ServerContainer server : plugin.servers.values()) {
if (server instanceof SubServerContainer && server.getName().toLowerCase().startsWith(last))
list.add(last + server.getName().substring(last.length()));
}
}
@ -644,10 +646,10 @@ public final class SubCommand extends CommandX {
if (args.length == 2) {
List<String> list = new ArrayList<String>();
if (last.length() == 0) {
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) if (server instanceof net.ME1312.SubServers.Sync.Server.SubServer) list.add(server.getName());
for (ServerContainer server : plugin.servers.values()) if (server instanceof SubServerContainer) list.add(server.getName());
} else {
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) {
if (server instanceof net.ME1312.SubServers.Sync.Server.SubServer && server.getName().toLowerCase().startsWith(last)) list.add(last + server.getName().substring(last.length()));
for (ServerContainer server : plugin.servers.values()) {
if (server instanceof SubServerContainer && server.getName().toLowerCase().startsWith(last)) list.add(last + server.getName().substring(last.length()));
}
}
return new NamedContainer<>((list.size() <= 0)?plugin.api.getLang("SubServers", "Command.Generic.Unknown-SubServer").replace("$str$", args[0]):null, list);
@ -765,7 +767,7 @@ public final class SubCommand extends CommandX {
public void execute(CommandSender sender, String[] args) {
if (sender instanceof ProxiedPlayer) {
if (args.length > 0) {
Map<String, net.ME1312.SubServers.Sync.Server.Server> servers = plugin.servers;
Map<String, ServerContainer> servers = plugin.servers;
if (servers.keySet().contains(args[0].toLowerCase())) {
((ProxiedPlayer) sender).connect(servers.get(args[0].toLowerCase()));
} else {
@ -775,8 +777,8 @@ public final class SubCommand extends CommandX {
int i = 0;
TextComponent serverm = new TextComponent(ChatColor.RESET.toString());
TextComponent div = new TextComponent(plugin.api.getLang("SubServers", "Bungee.Server.Divider"));
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) {
if (!server.isHidden() && (!(server instanceof net.ME1312.SubServers.Sync.Server.SubServer) || ((net.ME1312.SubServers.Sync.Server.SubServer) server).isRunning())) {
for (ServerContainer server : plugin.servers.values()) {
if (!server.isHidden() && (!(server instanceof SubServerContainer) || ((SubServerContainer) server).isRunning())) {
if (i != 0) serverm.addExtra(div);
TextComponent message = new TextComponent(plugin.api.getLang("SubServers", "Bungee.Server.List").replace("$str$", server.getDisplayName()));
try {
@ -846,7 +848,7 @@ public final class SubCommand extends CommandX {
public void execute(CommandSender sender, String[] args) {
List<String> messages = new LinkedList<String>();
int players = 0;
for (net.ME1312.SubServers.Sync.Server.Server server : plugin.servers.values()) {
for (ServerContainer server : plugin.servers.values()) {
List<String> playerlist = new ArrayList<String>();
if (plugin.redis) {
try {
@ -860,7 +862,7 @@ public final class SubCommand extends CommandX {
Collections.sort(playerlist);
players += playerlist.size();
if (!server.isHidden() && (!(server instanceof net.ME1312.SubServers.Sync.Server.SubServer) || ((net.ME1312.SubServers.Sync.Server.SubServer) server).isRunning())) {
if (!server.isHidden() && (!(server instanceof SubServerContainer) || ((SubServerContainer) server).isRunning())) {
int i = 0;
String message = plugin.api.getLang("SubServers", "Bungee.List.Format").replace("$str$", server.getDisplayName()).replace("$int$", Integer.toString(playerlist.size()));
for (String player : playerlist) {

View File

@ -10,12 +10,10 @@ import net.ME1312.SubServers.Sync.Library.NamedContainer;
import net.ME1312.SubServers.Sync.Library.UniversalFile;
import net.ME1312.SubServers.Sync.Library.Util;
import net.ME1312.SubServers.Sync.Library.Version.Version;
import net.ME1312.SubServers.Sync.Library.Version.VersionType;
import net.ME1312.SubServers.Sync.Network.Cipher;
import net.ME1312.SubServers.Sync.Network.Packet.PacketDownloadServerInfo;
import net.ME1312.SubServers.Sync.Network.SubDataClient;
import net.ME1312.SubServers.Sync.Server.Server;
import net.ME1312.SubServers.Sync.Server.SubServer;
import net.ME1312.SubServers.Sync.Server.ServerContainer;
import net.ME1312.SubServers.Sync.Server.SubServerContainer;
import net.md_5.bungee.BungeeCord;
import net.md_5.bungee.api.config.ListenerInfo;
import net.md_5.bungee.api.config.ServerInfo;
@ -23,16 +21,10 @@ import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.event.ServerKickEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.event.EventHandler;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.URL;
import java.nio.charset.Charset;
import java.nio.file.Files;
@ -44,7 +36,7 @@ import java.util.concurrent.TimeUnit;
*/
public final class SubPlugin extends BungeeCord implements Listener {
protected NamedContainer<Long, Map<String, Map<String, String>>> lang = null;
public final Map<String, Server> servers = new TreeMap<String, Server>();
public final Map<String, ServerContainer> servers = new TreeMap<String, ServerContainer>();
public final PrintStream out;
public final UniversalFile dir = new UniversalFile(new File(System.getProperty("user.dir")));
@ -263,19 +255,47 @@ public final class SubPlugin extends BungeeCord implements Listener {
@EventHandler(priority = Byte.MIN_VALUE)
public void fallback(ServerKickEvent e) {
if (e.getPlayer().getPendingConnection().getListener().isForceDefault()) {
int i = 0;
ServerInfo from = e.getKickedFrom();
ServerInfo to = null;
while (to == null || from == to) {
if (e.getPlayer().getPendingConnection().getListener().getServerPriority().size() > i) {
to = getServerInfo(e.getPlayer().getPendingConnection().getListener().getServerPriority().get(i));
} else break;
i++;
ServerInfo next = null;
for (String name : e.getPlayer().getPendingConnection().getListener().getServerPriority()) {
if (!e.getKickedFrom().getName().equalsIgnoreCase(name)) {
ServerInfo server = getServerInfo(name);
if (server != null) {
if (next == null) {
next = server;
} else {
int current = 0;
if (next instanceof ServerContainer) {
if (!((ServerContainer) next).isHidden()) current++;
if (!((ServerContainer) next).isRestricted()) current++;
if (((ServerContainer) next).getSubData() != null) current++;
if (next instanceof SubServerContainer) {
if (((SubServerContainer) next).isRunning()) current++;
}
}
int proposed = 0;
if (server instanceof ServerContainer) {
if (!((ServerContainer) server).isHidden()) proposed++;
if (!((ServerContainer) server).isRestricted()) proposed++;
if (((ServerContainer) server).getSubData() != null) proposed++;
if (server instanceof SubServerContainer) {
if (((SubServerContainer) server).isRunning()) proposed++;
}
}
if (proposed > current)
next = server;
}
}
}
}
if (to != null && from != to) {
e.setCancelServer(to);
if (next != null) {
e.setCancelServer(next);
e.setCancelled(true);
e.getPlayer().sendMessage(api.getLang("SubServers", "Bungee.Feature.Return").replace("$str$", (to instanceof Server)?((Server) to).getDisplayName():to.getName()).replace("$msg$", e.getKickReason()));
e.getPlayer().sendMessage(api.getLang("SubServers", "Bungee.Feature.Return").replace("$str$", (next instanceof ServerContainer)?((ServerContainer) next).getDisplayName():next.getName()).replace("$msg$", e.getKickReason()));
}
}
}
@ -285,42 +305,36 @@ public final class SubPlugin extends BungeeCord implements Listener {
api.getServer(e.getServer(), server -> {
if (server != null) {
if (server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer) {
servers.put(server.getName().toLowerCase(), new SubServer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(),
server.getMotd(), server.isHidden(), server.isRestricted(), ((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning()));
servers.put(server.getName().toLowerCase(), new SubServerContainer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(),
server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted(), ((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning()));
System.out.println("SubServers > Added SubServer: " + e.getServer());
} else {
servers.put(server.getName().toLowerCase(), new Server(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(),
server.getMotd(), server.isHidden(), server.isRestricted()));
servers.put(server.getName().toLowerCase(), new ServerContainer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(),
server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted()));
System.out.println("SubServers > Added Server: " + e.getServer());
}
} else System.out.println("PacketDownloadServerInfo(" + e.getServer() + ") returned with an invalid response");
});
}
@EventHandler(priority = Byte.MIN_VALUE)
public void start(SubStartEvent e) {
if (servers.keySet().contains(e.getServer().toLowerCase()) && servers.get(e.getServer().toLowerCase()) instanceof SubServer)
((SubServer) servers.get(e.getServer().toLowerCase())).setRunning(true);
}
public Boolean merge(net.ME1312.SubServers.Sync.Network.API.Server server) {
Server current = servers.get(server.getName().toLowerCase());
if (current == null || server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer || !(current instanceof SubServer)) {
ServerContainer current = servers.get(server.getName().toLowerCase());
if (current == null || server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer || !(current instanceof SubServerContainer)) {
if (current == null || !current.getSignature().equals(server.getSignature())) {
if (server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer) {
servers.put(server.getName().toLowerCase(), new SubServer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(),
server.getMotd(), server.isHidden(), server.isRestricted(), ((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning()));
servers.put(server.getName().toLowerCase(), new SubServerContainer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(),
server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted(), ((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning()));
} else {
servers.put(server.getName().toLowerCase(), new Server(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(),
server.getMotd(), server.isHidden(), server.isRestricted()));
servers.put(server.getName().toLowerCase(), new ServerContainer(server.getSignature(), server.getName(), server.getDisplayName(), server.getAddress(),
server.getSubData(), server.getMotd(), server.isHidden(), server.isRestricted()));
}
System.out.println("SubServers > Added "+((server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer)?"Sub":"")+"Server: " + server.getName());
return true;
} else {
if (server instanceof net.ME1312.SubServers.Sync.Network.API.SubServer) {
if (((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning() != ((SubServer) current).isRunning())
((SubServer) current).setRunning(((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning());
if (((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning() != ((SubServerContainer) current).isRunning())
((SubServerContainer) current).setRunning(((net.ME1312.SubServers.Sync.Network.API.SubServer) server).isRunning());
}
if (!server.getMotd().equals(current.getMotd()))
current.setMotd(server.getMotd());
@ -341,7 +355,7 @@ public final class SubPlugin extends BungeeCord implements Listener {
@EventHandler(priority = Byte.MIN_VALUE)
public void edit(SubEditServerEvent e) {
if (servers.keySet().contains(e.getServer().toLowerCase())) {
Server server = servers.get(e.getServer().toLowerCase());
ServerContainer server = servers.get(e.getServer().toLowerCase());
switch (e.getEdit().name().toLowerCase()) {
case "display":
server.setDisplayName(e.getEdit().get().asString());
@ -359,10 +373,26 @@ public final class SubPlugin extends BungeeCord implements Listener {
}
}
@EventHandler(priority = Byte.MIN_VALUE)
public void start(SubStartEvent e) {
if (servers.keySet().contains(e.getServer().toLowerCase()) && servers.get(e.getServer().toLowerCase()) instanceof SubServerContainer)
((SubServerContainer) servers.get(e.getServer().toLowerCase())).setRunning(true);
}
public void connect(ServerContainer server, String address) {
System.out.println("SubServers > Networked Server: " + server.getName());
server.setSubData(address);
}
public void disconnect(ServerContainer server) {
System.out.println("SubServers > Unnetworked Server: " + server.getName());
server.setSubData(null);
}
@EventHandler(priority = Byte.MIN_VALUE)
public void stop(SubStoppedEvent e) {
if (servers.keySet().contains(e.getServer().toLowerCase()) && servers.get(e.getServer().toLowerCase()) instanceof SubServer)
((SubServer) servers.get(e.getServer().toLowerCase())).setRunning(false);
if (servers.keySet().contains(e.getServer().toLowerCase()) && servers.get(e.getServer().toLowerCase()) instanceof SubServerContainer)
((SubServerContainer) servers.get(e.getServer().toLowerCase())).setRunning(false);
}
@EventHandler(priority = Byte.MIN_VALUE)