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