diff --git a/src/main/java/us/ajg0702/queue/Main.java b/src/main/java/us/ajg0702/queue/Main.java index d149282..0ee3902 100644 --- a/src/main/java/us/ajg0702/queue/Main.java +++ b/src/main/java/us/ajg0702/queue/Main.java @@ -163,11 +163,11 @@ public class Main extends Plugin implements Listener { @EventHandler public void moveServer(ServerSwitchEvent e) { ProxiedPlayer p = e.getPlayer(); - List alreadyqueued = man.findPlayerInQueue(p); - for(Server ser : alreadyqueued) { + List alreadyqueued = man.findPlayerInQueue(p); + for(QueueServer ser : alreadyqueued) { List queue = ser.getQueue(); int pos = queue.indexOf(p); - if((pos == 0 && p.getServer().getInfo().equals(ser.getInfo())) || config.getBoolean("remove-player-on-server-switch")) { + if((pos == 0 && ser.getInfos().contains(p.getServer().getInfo())) || config.getBoolean("remove-player-on-server-switch")) { queue.remove(p); } } @@ -189,8 +189,8 @@ public class Main extends Plugin implements Listener { public void onLeave(PlayerDisconnectEvent e) { ProxiedPlayer p = e.getPlayer(); if(p.hasPermission("ajqueue.stay-queued-on-leave")) return; - List servers = man.findPlayerInQueue(p); - for(Server server : servers) { + List servers = man.findPlayerInQueue(p); + for(QueueServer server : servers) { server.getQueue().remove(p); } } @@ -198,9 +198,9 @@ public class Main extends Plugin implements Listener { @EventHandler public void onFailedMove(ServerKickEvent e) { ProxiedPlayer p = e.getPlayer(); - List queuedServers = man.findPlayerInQueue(p); - for(Server server : queuedServers) { - if(!(e.getKickedFrom().equals(server.getInfo()))) continue; + List queuedServers = man.findPlayerInQueue(p); + for(QueueServer server : queuedServers) { + if(!(server.getInfos().contains(e.getKickedFrom()))) continue; if(server.getQueue().indexOf(p) != 0) continue; List kickreasons = config.getStringList("kick-reasons"); boolean hasReason = false; @@ -243,7 +243,7 @@ public class Main extends Plugin implements Listener { BungeeUtils.sendCustomData(player, "queuename", aliases.getAlias(man.getQueuedName(player))); } if(subchannel.equals("position")) { - Server server = man.getSingleServer(player); + QueueServer server = man.getSingleServer(player); String pos = msgs.get("placeholders.position.none"); if(server != null) { pos = server.getQueue().indexOf(player)+1+""; @@ -251,7 +251,7 @@ public class Main extends Plugin implements Listener { BungeeUtils.sendCustomData(player, "position", pos); } if(subchannel.equals("positionof")) { - Server server = man.getSingleServer(player); + QueueServer server = man.getSingleServer(player); String pos = msgs.get("placeholders.position.none"); if(server != null) { pos = server.getQueue().size()+""; @@ -259,12 +259,12 @@ public class Main extends Plugin implements Listener { BungeeUtils.sendCustomData(player, "positionof", pos); } if(subchannel.equals("inqueue")) { - Server server = man.getSingleServer(player); + QueueServer server = man.getSingleServer(player); BungeeUtils.sendCustomData(player, "inqueue", (server != null)+""); } if(subchannel.equals("queuedfor")) { String srv = in.readUTF(); - Server server = man.findServer(srv); + QueueServer server = man.findServer(srv); if(server == null) return; BungeeUtils.sendCustomData(player, "queuedfor", srv, server.getQueue().size()+""); } diff --git a/src/main/java/us/ajg0702/queue/Manager.java b/src/main/java/us/ajg0702/queue/Manager.java index b41ea38..4c6af81 100644 --- a/src/main/java/us/ajg0702/queue/Manager.java +++ b/src/main/java/us/ajg0702/queue/Manager.java @@ -1,12 +1,14 @@ package us.ajg0702.queue; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.config.ServerInfo; @@ -49,7 +51,7 @@ public class Manager { /* * Returns all servers */ - public List getServers() { + public List getServers() { return servers; } @@ -59,7 +61,7 @@ public class Manager { */ public List getServerNames() { List names = new ArrayList<>(); - for(Server s : servers) { + for(QueueServer s : servers) { names.add(s.getName()); } return names; @@ -132,11 +134,11 @@ public class Manager { * @return The name of the server, the placeholder none message if not queued */ public String getQueuedName(ProxiedPlayer p) { - List queued = findPlayerInQueue(p); + List queued = findPlayerInQueue(p); if(queued.size() <= 0) { return msgs.get("placeholders.queued.none"); } - Server selected = queued.get(0); + QueueServer selected = queued.get(0); if(pl.config.getString("multi-server-queue-pick").equalsIgnoreCase("last")) { selected = queued.get(queued.size()-1); @@ -150,12 +152,12 @@ public class Manager { * @param p The player * @return The server that was chosen that the player is queued for. */ - public Server getSingleServer(ProxiedPlayer p) { - List queued = findPlayerInQueue(p); + public QueueServer getSingleServer(ProxiedPlayer p) { + List queued = findPlayerInQueue(p); if(queued.size() <= 0) { return null; } - Server selected = queued.get(0); + QueueServer selected = queued.get(0); if(pl.config.getString("multi-server-queue-pick").equalsIgnoreCase("last")) { selected = queued.get(queued.size()-1); @@ -166,17 +168,52 @@ public class Manager { - List servers = new ArrayList<>(); + List servers = new ArrayList<>(); /** * Checks servers that are in bungeecord and adds any it doesnt * know about. + * + * Also creates/edits server groups */ public void reloadServers() { Map svs = ProxyServer.getInstance().getServers(); for(String name : svs.keySet()) { if(findServer(name) != null) continue; ServerInfo info = svs.get(name); - servers.add(new Server(name, info)); + servers.add(new QueueServer(name, info)); + } + + List groupsraw = pl.config.getStringList("server-groups"); + for(String groupraw : groupsraw) { + if(groupraw.isEmpty()) { + pl.getLogger().warning("Empty group string! If you dont want server groups, set server-groups like this: server-groups: []"); + continue; + } + + String groupname = groupraw.split(":")[0]; + String[] serversraw = groupraw.split(":")[1].split(","); + + if(getServer(groupname) != null) { + pl.getLogger().warning("The name of a group ('"+groupname+"') cannot be the same as the name of a server!"); + continue; + } + + List servers = new ArrayList<>(); + + for(String serverraw : serversraw) { + ServerInfo si = svs.get(serverraw); + if(si == null) { + pl.getLogger().warning("Could not find server named '"+serverraw+"' in servergroup '"+groupname+"'!"); + continue; + } + } + + if(servers.size() == 0) { + pl.getLogger().warning("Server group '"+groupname+"' has no servers! Ignoring it."); + continue; + } + + this.servers.add(new QueueServer(groupname, servers)); } } @@ -188,7 +225,7 @@ public class Manager { if(!pl.getConfig().getBoolean("send-actionbar")) return; for(ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) { - Server s = this.getSingleServer(p); + QueueServer s = this.getSingleServer(p); if(s == null) continue; List plys = s.getQueue(); @@ -312,7 +349,7 @@ public class Manager { * along with their time remaining */ public void sendMessages() { - for(Server s : servers) { + for(QueueServer s : servers) { int ot = s.getOfflineTime(); List plys = s.getQueue(); for(ProxiedPlayer ply : plys) { @@ -381,8 +418,8 @@ public class Manager { * @param name Name of the server * @return The server if it exists (otherwise null) */ - public Server findServer(String name) { - for(Server server : servers) { + public QueueServer findServer(String name) { + for(QueueServer server : servers) { if(server.getName().equals(name)) { return server; } @@ -394,7 +431,7 @@ public class Manager { * Updates info about servers. */ public void updateServers() { - Iterator it = servers.iterator(); + Iterator it = servers.iterator(); while(it.hasNext()) { it.next().update(); } @@ -411,7 +448,7 @@ public class Manager { * @param server The server to send the first player in the queue. null for all servers. */ public void sendPlayers(String server) { - for(Server s : servers) { + for(QueueServer s : servers) { String name = s.getName(); if(server != null && !server.equals(name)) continue; if(!s.isOnline()) continue; @@ -419,10 +456,36 @@ public class Manager { if(s.getQueue().size() <= 0) continue; if(pl.config.getBoolean("send-all-when-back-online") && s.justWentOnline() && s.isOnline()) { + + for(ProxiedPlayer p : s.getQueue()) { - if(s.isFull() && !p.hasPermission("ajqueue.joinfull")) break; + + if(s.isFull() && !p.hasPermission("ajqueue.joinfull")) continue; + + HashMap serverInfos = s.getLastPings(); + ServerInfo selected = null; + int selectednum = 0; + for(ServerInfo si : serverInfos.keySet()) { + ServerPing sp = serverInfos.get(si); + int online = sp.getPlayers().getOnline(); + if(selected == null) { + selected = si; + selectednum = online; + continue; + } + if(selectednum > online && findServer(si.getName()).isJoinable(p)) { + selected = si; + selectednum = online; + continue; + } + } + if(selected == null) { + pl.getLogger().severe("Could not find ideal server for server/group '"+s.getName()+"'!"); + continue; + } + p.sendMessage(msgs.getBC("status.sending-now", "SERVER:"+pl.aliases.getAlias(name))); - p.connect(s.getInfo()); + p.connect(selected); } return; } @@ -446,7 +509,28 @@ public class Manager { if(s.isFull() && !nextplayer.hasPermission("ajqueue.joinfull")) continue; nextplayer.sendMessage(Main.formatMessage(msgs.get("status.sending-now").replaceAll("\\{SERVER\\}", pl.aliases.getAlias(name)))); - nextplayer.connect(s.getInfo()); + HashMap serverInfos = s.getLastPings(); + ServerInfo selected = null; + int selectednum = 0; + for(ServerInfo si : serverInfos.keySet()) { + ServerPing sp = serverInfos.get(si); + int online = sp.getPlayers().getOnline(); + if(selected == null) { + selected = si; + selectednum = online; + continue; + } + if(selectednum > online && findServer(si.getName()).isJoinable(nextplayer)) { + selected = si; + selectednum = online; + continue; + } + } + if(selected == null) { + pl.getLogger().severe("Could not find ideal server for server/group '"+s.getName()+"'!"); + continue; + } + nextplayer.connect(selected); } } @@ -456,7 +540,7 @@ public class Manager { * @param s The name of the server */ public void addToQueue(ProxiedPlayer p, String s) { - Server server = findServer(s); + QueueServer server = findServer(s); if(server == null) { p.sendMessage(msgs.getBC("errors.server-not-exist")); return; @@ -477,7 +561,7 @@ public class Manager { return; } - List beforeQueues = findPlayerInQueue(p); + List beforeQueues = findPlayerInQueue(p); if(beforeQueues.size() > 0) { if(beforeQueues.contains(server)) { p.sendMessage(msgs.getBC("errors.already-queued")); @@ -485,7 +569,7 @@ public class Manager { } if(!pl.config.getBoolean("allow-multiple-queues")) { p.sendMessage(msgs.getBC("status.left-last-queue")); - for(Server ser : beforeQueues) { + for(QueueServer ser : beforeQueues) { ser.getQueue().remove(p); } } @@ -549,9 +633,9 @@ public class Manager { * @param p The player to search for * @return The servers the player is queued for. */ - public List findPlayerInQueue(ProxiedPlayer p) { - List srs = new ArrayList<>(); - for(Server s : servers) { + public List findPlayerInQueue(ProxiedPlayer p) { + List srs = new ArrayList<>(); + for(QueueServer s : servers) { if(s.getQueue().contains(p)) { srs.add(s); } @@ -559,7 +643,7 @@ public class Manager { return srs; } - public Server getServer(String name) { + public QueueServer getServer(String name) { return findServer(name); } } diff --git a/src/main/java/us/ajg0702/queue/Server.java b/src/main/java/us/ajg0702/queue/QueueServer.java similarity index 100% rename from src/main/java/us/ajg0702/queue/Server.java rename to src/main/java/us/ajg0702/queue/QueueServer.java diff --git a/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java b/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java index d8d090d..0021a57 100644 --- a/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java +++ b/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java @@ -7,7 +7,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; import us.ajg0702.queue.Main; import us.ajg0702.queue.Manager; -import us.ajg0702.queue.Server; +import us.ajg0702.queue.QueueServer; import us.ajg0702.utils.bungee.BungeeMessages; public class LeaveCommand extends Command { @@ -27,7 +27,7 @@ public class LeaveCommand extends Command { } Manager man = Manager.getInstance(); ProxiedPlayer p = (ProxiedPlayer) sender; - List servers = man.findPlayerInQueue(p); + List servers = man.findPlayerInQueue(p); if(servers.size() == 0) { p.sendMessage(msgs.getBC("commands.leave.no-queues")); @@ -47,7 +47,7 @@ public class LeaveCommand extends Command { } String leaving = args[0]; - Server leavingsrv = man.getServer(leaving); + QueueServer leavingsrv = man.getServer(leaving); if(leavingsrv == null) { p.sendMessage(msgs.getBC("commands.leave.not-queued", "QUEUES:"+getQueueList(servers))); return; @@ -62,9 +62,9 @@ public class LeaveCommand extends Command { } - private String getQueueList(List servers) { + private String getQueueList(List servers) { String queueList = ""; - for(Server server : servers) { + for(QueueServer server : servers) { queueList += msgs.get("commands.leave.queues-list-format").replaceAll("\\{NAME\\}", server.getName()); } if(queueList.length() > 2) { diff --git a/src/main/java/us/ajg0702/queue/commands/ManageCommand.java b/src/main/java/us/ajg0702/queue/commands/ManageCommand.java index 63178af..a7133e5 100644 --- a/src/main/java/us/ajg0702/queue/commands/ManageCommand.java +++ b/src/main/java/us/ajg0702/queue/commands/ManageCommand.java @@ -5,7 +5,7 @@ import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; import us.ajg0702.queue.Main; import us.ajg0702.queue.Manager; -import us.ajg0702.queue.Server; +import us.ajg0702.queue.QueueServer; import us.ajg0702.utils.bungee.BungeeMessages; import java.util.ArrayList; @@ -44,7 +44,7 @@ public class ManageCommand extends Command { } if(args[0].equalsIgnoreCase("list")) { int total = 0; - for(Server server : Manager.getInstance().getServers()) { + for(QueueServer server : Manager.getInstance().getServers()) { String msg = msgs.get("list.format").replaceAll("\\{SERVER\\}", server.getName()); String playerlist = ""; @@ -71,7 +71,7 @@ public class ManageCommand extends Command { return; } if(args[0].equalsIgnoreCase("statusdebug")) { - Server s = Manager.getInstance().getSingleServer((ProxiedPlayer) sender); + QueueServer s = Manager.getInstance().getSingleServer((ProxiedPlayer) sender); if(s == null) return; sender.sendMessage(Main.formatMessage(s.getJoinableDebug((ProxiedPlayer) sender))); } @@ -102,7 +102,7 @@ public class ManageCommand extends Command { sender.sendMessage(msgs.getBC("")); return; } - Server srv = Manager.getInstance().findServer(args[1]); + QueueServer srv = Manager.getInstance().findServer(args[1]); if(srv == null) { sender.sendMessage(msgs.getBC("commands.pause.no-server", "SERVER:"+args[1])); return; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6f9f612..7a840b1 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -78,6 +78,7 @@ multi-server-queue-pick: last # for example, instead of showing players "event-a", this option can make it appear as "Event A" # With this example, you would use this: - "event-a:Event A" # Note that currently players still have to use the normal names in queue commands and leave commands +# Format: "realname:Alias" server-aliases: - "event-a:Event A" @@ -110,3 +111,10 @@ send-all-when-back-online: false # Replace with the name of the server # Default: false joinfrom-server-permission: false + +# Server groups are a group of servers that you can queue for. It will send you to the server that is the least full. +# If all servers in the group are full, it will act the same as it would when a single server is full. +# Same if all servers are offline. It will only send players to servers that are online. +# Format: "groupname:server1,server2,etc" +server-groups: +- "lobbys:lobby-1,lobby-2,lobby-3"