diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 9f7cf4f..bcdc7dc 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -4,7 +4,7 @@ us.ajg0702 ajQueue ajQueue - 1.5.0 + 1.5.1 diff --git a/pom.xml b/pom.xml index a18e1fb..49444c7 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 us.ajg0702 ajQueue - 1.5.0 + 1.5.1 ajQueue diff --git a/src/main/java/us/ajg0702/queue/AliasManager.java b/src/main/java/us/ajg0702/queue/AliasManager.java new file mode 100644 index 0000000..c857153 --- /dev/null +++ b/src/main/java/us/ajg0702/queue/AliasManager.java @@ -0,0 +1,11 @@ +package us.ajg0702.queue; + +public class AliasManager { + public AliasManager(Main pl) {} + public String getAlias(String server) { + return server; + } + public String getServer(String alias) { + return alias; + } +} diff --git a/src/main/java/us/ajg0702/queue/Logic.java b/src/main/java/us/ajg0702/queue/Logic.java index ad56d16..7ff4629 100644 --- a/src/main/java/us/ajg0702/queue/Logic.java +++ b/src/main/java/us/ajg0702/queue/Logic.java @@ -5,6 +5,8 @@ import java.util.List; import net.md_5.bungee.api.connection.ProxiedPlayer; public class Logic { + + static boolean isp = false; public static void priorityLogic(List list, String s, ProxiedPlayer p) {} diff --git a/src/main/java/us/ajg0702/queue/Main.java b/src/main/java/us/ajg0702/queue/Main.java index 779b801..fa227c6 100644 --- a/src/main/java/us/ajg0702/queue/Main.java +++ b/src/main/java/us/ajg0702/queue/Main.java @@ -44,6 +44,8 @@ public class Main extends Plugin implements Listener { MoveCommand moveCommand; + public AliasManager aliases; + @Override public void onEnable() { plugin = this; @@ -51,7 +53,7 @@ public class Main extends Plugin implements Listener { LinkedHashMap d = new LinkedHashMap<>(); - d.put("status.offline.base", "&cThe server you are queued for is {STATUS}. &7You are in position &f{POS}&7 of &f{LEN}&7."); + d.put("status.offline.base", "&c{SERVER} is {STATUS}. &7You are in position &f{POS}&7 of &f{LEN}&7."); d.put("status.offline.offline", "offline"); d.put("status.offline.restarting", "restarting"); @@ -92,12 +94,18 @@ public class Main extends Plugin implements Listener { d.put("placeholders.queued.none", "None"); d.put("placeholders.position.none", "None"); + d.put("commands.leave.more-args", "&cPlease specify which queue you want to leave! &7You are in these queues: {QUEUES}"); + d.put("commands.leave.queues-list-format", "&f{NAME}&7, "); + d.put("commands.leave.not-queued", "&cYou are not queued for that server! &7You are in these queues: {QUEUES}"); + msgs = BungeeMessages.getInstance(this, d); //msgs = BungeeMessages.getInstance(this); config = new BungeeConfig(this); checkConfig(); + aliases = new AliasManager(this); + moveCommand = new MoveCommand(this); this.getProxy().getPluginManager().registerCommand(this, moveCommand); this.getProxy().getPluginManager().registerCommand(this, new ManageCommand(this)); @@ -110,12 +118,7 @@ public class Main extends Plugin implements Listener { timeBetweenPlayers = config.getInt("wait-time"); - try { - Class.forName("us.ajg0702.queue.Logic"); - isp = true; - } catch(ClassNotFoundException e) { - isp = false; - } + isp = Logic.isp; man = Manager.getInstance(this); @@ -158,13 +161,11 @@ public class Main extends Plugin implements Listener { @EventHandler public void moveServer(ServerSwitchEvent e) { ProxiedPlayer p = e.getPlayer(); - Server alreadyqueued = man.findPlayerInQueue(p); - if(alreadyqueued != null) { - List queue = alreadyqueued.getQueue(); + List alreadyqueued = man.findPlayerInQueue(p); + for(Server ser : alreadyqueued) { + List queue = ser.getQueue(); int pos = queue.indexOf(p); - if(pos == 0) { - queue.remove(p); - } else if(config.getBoolean("remove-player-on-server-switch")) { + if((pos == 0 && p.getServer().getInfo().equals(ser.getInfo())) || config.getBoolean("remove-player-on-server-switch")) { queue.remove(p); } } @@ -185,8 +186,8 @@ public class Main extends Plugin implements Listener { @EventHandler public void onLeave(PlayerDisconnectEvent e) { ProxiedPlayer p = e.getPlayer(); - Server server = man.findPlayerInQueue(p); - if(server != null) { + List servers = man.findPlayerInQueue(p); + for(Server server : servers) { server.getQueue().remove(p); } } @@ -194,24 +195,25 @@ public class Main extends Plugin implements Listener { @EventHandler public void onFailedMove(ServerKickEvent e) { ProxiedPlayer p = e.getPlayer(); - Server server = man.findPlayerInQueue(p); - if(server == null) return; - if(!(e.getKickedFrom().equals(server.getInfo()))) return; - if(server.getQueue().indexOf(p) != 0) return; - List kickreasons = config.getStringList("kick-reasons"); - boolean hasReason = false; - //getLogger().info(e.getKickReasonComponent()); - for(String reason : kickreasons) { - for(BaseComponent b : e.getKickReasonComponent()) { - if(b.toPlainText().toLowerCase().contains(reason)) { - hasReason = true; - break; + List queuedServers = man.findPlayerInQueue(p); + for(Server server : queuedServers) { + if(!(e.getKickedFrom().equals(server.getInfo()))) continue; + if(server.getQueue().indexOf(p) != 0) continue; + List kickreasons = config.getStringList("kick-reasons"); + boolean hasReason = false; + //getLogger().info(e.getKickReasonComponent()); + for(String reason : kickreasons) { + for(BaseComponent b : e.getKickReasonComponent()) { + if(b.toPlainText().toLowerCase().contains(reason)) { + hasReason = true; + break; + } } + if(hasReason) break; } - if(hasReason) break; + if(!hasReason) continue; + server.getQueue().remove(p); } - if(!hasReason) return; - server.getQueue().remove(p); } @@ -234,10 +236,10 @@ public class Main extends Plugin implements Listener { } if(subchannel.equals("queuename")) { - BungeeUtils.sendCustomData(player, "queuename", man.getQueuedName(player)); + BungeeUtils.sendCustomData(player, "queuename", aliases.getAlias(man.getQueuedName(player))); } if(subchannel.equals("position")) { - Server server = man.findPlayerInQueue(player); + Server server = man.getSingleServer(player); String pos = msgs.get("placeholders.position.none"); if(server != null) { pos = server.getQueue().indexOf(player)+1+""; @@ -245,7 +247,7 @@ public class Main extends Plugin implements Listener { BungeeUtils.sendCustomData(player, "position", pos); } if(subchannel.equals("positionof")) { - Server server = man.findPlayerInQueue(player); + Server server = man.getSingleServer(player); String pos = msgs.get("placeholders.position.none"); if(server != null) { pos = server.getQueue().size()+""; @@ -253,7 +255,7 @@ public class Main extends Plugin implements Listener { BungeeUtils.sendCustomData(player, "positionof", pos); } if(subchannel.equals("inqueue")) { - Server server = man.findPlayerInQueue(player); + Server server = man.getSingleServer(player); BungeeUtils.sendCustomData(player, "inqueue", (server != null)+""); } diff --git a/src/main/java/us/ajg0702/queue/Manager.java b/src/main/java/us/ajg0702/queue/Manager.java index 6e14107..caf4266 100644 --- a/src/main/java/us/ajg0702/queue/Manager.java +++ b/src/main/java/us/ajg0702/queue/Manager.java @@ -112,16 +112,41 @@ public class Manager { } /** - * Get the name of the server the player is queued for + * Get the name of the server the player is queued for. + * If multiple servers are queued for, it will use the multi-server-queue-pick option in the config * @param p The player * @return The name of the server, the placeholder none message if not queued */ public String getQueuedName(ProxiedPlayer p) { - Server queued = findPlayerInQueue(p); - if(queued == null) { + List queued = findPlayerInQueue(p); + if(queued.size() <= 0) { return msgs.get("placeholders.queued.none"); } - return queued.getName(); + Server selected = queued.get(0); + + if(pl.config.getString("multi-server-queue-pick").equalsIgnoreCase("last")) { + selected = queued.get(queued.size()-1); + } + + return selected.getName(); + } + + /** + * Get a single server the player is queued for. Depends on the multi-server-queue-pick option in the config + * @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); + if(queued.size() <= 0) { + return null; + } + Server selected = queued.get(0); + + if(pl.config.getString("multi-server-queue-pick").equalsIgnoreCase("last")) { + selected = queued.get(queued.size()-1); + } + return selected; } @@ -147,7 +172,60 @@ public class Manager { */ public void sendActionBars() { if(!pl.getConfig().getBoolean("send-actionbar")) return; - for(Server s : servers) { + + for(ProxiedPlayer p : ProxyServer.getInstance().getPlayers()) { + Server s = this.getSingleServer(p); + + if(s == null) continue; + List plys = s.getQueue(); + int pos = plys.indexOf(p)+1; + if(pos == 0) { + plys.remove(p); + continue; + } + + int len = plys.size(); + if(!s.isOnline() || s.isFull() || !s.canAccess(p)) { + + String status = msgs.get("status.offline.restarting"); + + if(s.getOfflineTime() > pl.config.getInt("offline-time")) { + status = msgs.get("status.offline.offline"); + } + + if(!s.canAccess(p)) { + status = msgs.get("status.offline.restricted"); + } + + + BungeeUtils.sendCustomData(p, "actionbar", msgs.get("spigot.actionbar.offline") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + .replaceAll("\\{SERVER\\}", pl.aliases.getAlias(s.getName())) + .replaceAll("\\{STATUS\\}", status)+";time="+pl.timeBetweenPlayers); + } else { + int time = pos*pl.timeBetweenPlayers; + int min = (int) Math.floor((time) / (60)); + int sec = (int) Math.floor((time % (60))); + String timeStr; + if(min <= 0) { + timeStr = msgs.get("format.time.secs") + .replaceAll("\\{m\\}", "0") + .replaceAll("\\{s\\}", sec+""); + } else { + timeStr = msgs.get("format.time.mins") + .replaceAll("\\{m\\}", min+"") + .replaceAll("\\{s\\}", sec+""); + } + BungeeUtils.sendCustomData(p, "actionbar", msgs.get("spigot.actionbar.online") + .replaceAll("\\{POS\\}", pos+"") + .replaceAll("\\{LEN\\}", len+"") + .replaceAll("\\{SERVER\\}", pl.aliases.getAlias(s.getName())) + .replaceAll("\\{TIME\\}", timeStr)+";time="+pl.timeBetweenPlayers); + } + } + + /*for(Server s : servers) { int ot = s.getOfflineTime(); List plys = s.getQueue(); Iterator it = plys.iterator(); @@ -199,7 +277,7 @@ public class Manager { .replaceAll("\\{TIME\\}", timeStr)+";time="+pl.timeBetweenPlayers); } } - } + }*/ } /** @@ -238,7 +316,7 @@ public class Manager { .replaceAll("\\{STATUS\\}", status) .replaceAll("\\{POS\\}", pos+"") .replaceAll("\\{LEN\\}", len+"") - .replaceAll("\\{SERVER\\}", s.getName()) + .replaceAll("\\{SERVER\\}", pl.aliases.getAlias(s.getName())) )); } else { int time = pos*pl.timeBetweenPlayers; @@ -259,7 +337,7 @@ public class Manager { .replaceAll("\\{POS\\}", pos+"") .replaceAll("\\{LEN\\}", len+"") .replaceAll("\\{TIME\\}", timeStr) - .replaceAll("\\{SERVER\\}", s.getName()) + .replaceAll("\\{SERVER\\}", pl.aliases.getAlias(s.getName())) )); } @@ -326,7 +404,7 @@ public class Manager { if(s.getQueue().size() <= 0) continue; if(s.isFull() && !nextplayer.hasPermission("ajqueue.joinfull")) continue; - nextplayer.sendMessage(Main.formatMessage(msgs.get("status.sending-now").replaceAll("\\{SERVER\\}", name))); + nextplayer.sendMessage(Main.formatMessage(msgs.get("status.sending-now").replaceAll("\\{SERVER\\}", pl.aliases.getAlias(name)))); nextplayer.connect(s.getInfo()); } } @@ -348,14 +426,18 @@ public class Manager { return; } - Server beforeQueue = findPlayerInQueue(p); - if(beforeQueue != null) { - if(beforeQueue.equals(server)) { + List beforeQueues = findPlayerInQueue(p); + if(beforeQueues.size() > 0) { + if(beforeQueues.contains(server)) { p.sendMessage(msgs.getBC("errors.already-queued")); return; } - p.sendMessage(msgs.getBC("status.left-last-queue")); - beforeQueue.getQueue().remove(p); + if(!pl.config.getBoolean("allow-multiple-queues")) { + p.sendMessage(msgs.getBC("status.left-last-queue")); + for(Server ser : beforeQueues) { + ser.getQueue().remove(p); + } + } } List list = server.getQueue(); @@ -396,33 +478,36 @@ public class Manager { msgs.get("status.now-in-empty-queue") .replaceAll("\\{POS\\}", pos+"") .replaceAll("\\{LEN\\}", len+"") - .replaceAll("\\{SERVER\\}", s) + .replaceAll("\\{SERVER\\}", pl.aliases.getAlias(s)) )); } else { p.sendMessage(Main.formatMessage( msgs.get("status.now-in-queue") .replaceAll("\\{POS\\}", pos+"") .replaceAll("\\{LEN\\}", len+"") - .replaceAll("\\{SERVER\\}", s) + .replaceAll("\\{SERVER\\}", pl.aliases.getAlias(s)) )); } BungeeUtils.sendCustomData(p, "position", pos+""); BungeeUtils.sendCustomData(p, "positionof", len+""); - BungeeUtils.sendCustomData(p, "queuename", s); + BungeeUtils.sendCustomData(p, "queuename", pl.aliases.getAlias(s)); BungeeUtils.sendCustomData(p, "inqueue", "true"); } /** - * Finds which server the player is queued for + * Finds which servers the player is queued for * @param p The player to search for - * @return The server the player is queued for. Null if not in a queue + * @return The servers the player is queued for. */ - public Server findPlayerInQueue(ProxiedPlayer p) { + public List findPlayerInQueue(ProxiedPlayer p) { + List srs = new ArrayList<>(); for(Server s : servers) { - if(s.getQueue().contains(p)) return s; + if(s.getQueue().contains(p)) { + srs.add(s); + } } - return null; + return srs; } public Server getServer(String name) { diff --git a/src/main/java/us/ajg0702/queue/Server.java b/src/main/java/us/ajg0702/queue/Server.java index 4992969..7bca31b 100644 --- a/src/main/java/us/ajg0702/queue/Server.java +++ b/src/main/java/us/ajg0702/queue/Server.java @@ -7,13 +7,16 @@ import net.md_5.bungee.api.Callback; import net.md_5.bungee.api.ServerPing; import net.md_5.bungee.api.config.ServerInfo; import net.md_5.bungee.api.connection.ProxiedPlayer; +import us.ajg0702.utils.bungee.BungeeConfig; public class Server { String name; ServerInfo info; + BungeeConfig config; public Server(String name, ServerInfo info) { this.name = name; this.info = info; + config = Manager.getInstance().pl.config; update(); } @@ -70,8 +73,14 @@ public class Server { public int getOfflineTime() { return offlineTime; } - + long lastOffline = 0; public boolean isOnline() { + if(System.currentTimeMillis()-lastOffline <= (config.getInt("wait-after-online")*1000) && online) { + return false; + } + if(!online) { + lastOffline = System.currentTimeMillis(); + } return online; } public boolean isFull() { diff --git a/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java b/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java index 1f7b684..e0557ef 100644 --- a/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java +++ b/src/main/java/us/ajg0702/queue/commands/LeaveCommand.java @@ -1,5 +1,7 @@ package us.ajg0702.queue.commands; +import java.util.List; + import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; @@ -23,11 +25,47 @@ public class LeaveCommand extends Command { sender.sendMessage(msgs.getBC("errors.player-only")); return; } + Manager man = Manager.getInstance(); ProxiedPlayer p = (ProxiedPlayer) sender; - Server server = Manager.getInstance().findPlayerInQueue((ProxiedPlayer) sender); - if(server != null) { - server.getQueue().remove(p); - p.sendMessage(msgs.getBC("commands.leave-queue", "SERVER:"+server.getName())); + List servers = man.findPlayerInQueue(p); + + + if(servers.size() == 1) { + servers.get(0).getQueue().remove(p); + p.sendMessage(msgs.getBC("commands.leave-queue", "SERVER:"+plugin.aliases.getAlias(servers.get(0).getName()))); + return; } + + + if(args.length <= 0) { + p.sendMessage(msgs.getBC("commands.leave.more-args", "QUEUES:"+getQueueList(servers))); + return; + } + + String leaving = args[0]; + Server leavingsrv = man.getServer(leaving); + if(leavingsrv == null) { + p.sendMessage(msgs.getBC("commands.leave.not-queued", "QUEUES:"+getQueueList(servers))); + return; + } + if(leavingsrv.getQueue().indexOf(p) == -1) { + p.sendMessage(msgs.getBC("commands.leave.not-queued", "QUEUES:"+getQueueList(servers))); + return; + } + + leavingsrv.getQueue().remove(p); + p.sendMessage(msgs.getBC("commands.leave-queue", "SERVER:"+plugin.aliases.getAlias(leavingsrv.getName()))); + + } + + private String getQueueList(List servers) { + String queueList = ""; + for(Server server : servers) { + queueList += msgs.get("commands.leave.queues-list-format").replaceAll("\\{NAME\\}", server.getName()); + } + if(queueList.length() > 2) { + queueList = queueList.substring(0, queueList.length()-2); + } + return queueList; } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 3223fb9..6c6b6c8 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Dont touch this number please -config-version: 8 +config-version: 11 # The time the server will wait between sending people in the queue # Default: 5 @@ -60,3 +60,31 @@ reload-servers-interval: 0 # If enabled, players will be required to have the permission ajqueue.queue. # Default: false require-permission: false + + +# Should we let players join more than one queue? +# If enabled, players will be able to be in multiple queues at once. +# Default: true +allow-multiple-queues: true + +# If the player is queued for multiple servers, which server should we pick to use in things like placeholders and actionbars +# Options are first and last +# Default: last +multi-server-queue-pick: last + + +# THIS FEATURE IS ONLY AVAILABLE ON ajQueuePlus (https://www.spigotmc.org/resources/ajqueueplus.79123/) +# This will show players a different name than the actual bungeecord server name +# 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 +server-aliases: +- "event-a:Event A" + + +# How long should we wait after a server is online before sending players? +# The server will still show up as offline or restarting until this amount of time after its up +# Meant to let your server 'cool down' after lag from starting up +# In seconds +# Default: 1 +wait-after-online: 1