diff --git a/api/src/main/java/us/ajg0702/queue/api/premium/Logic.java b/api/src/main/java/us/ajg0702/queue/api/premium/Logic.java index a08fe98..d60468e 100644 --- a/api/src/main/java/us/ajg0702/queue/api/premium/Logic.java +++ b/api/src/main/java/us/ajg0702/queue/api/premium/Logic.java @@ -38,6 +38,8 @@ public interface Logic { */ PermissionGetter getPermissionGetter(); + int getHighestPriority(QueueServer queueServer, AdaptedServer server, AdaptedPlayer player); + static int getUnJoinablePriorities(QueueServer queueServer, AdaptedServer server, AdaptedPlayer player) { Config config = AjQueueAPI.getInstance().getConfig(); int highest = 0; diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java index 4688b6a..728e146 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueMain.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueMain.java @@ -239,6 +239,7 @@ public class QueueMain extends AjQueueAPI { d.put("status.now-in-empty-queue", ""); d.put("status.sending-now", "&aSending you to &f{SERVER} &anow.."); d.put("status.making-room", "Making room for you.."); + d.put("status.priority-increased", "You now have higher priority! Moving you up in the queue.."); d.put("errors.server-not-exist", "&cThe server {SERVER} does not exist!"); d.put("errors.already-queued", "&cYou are already queued for that server!"); diff --git a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java index f24165f..08f1edf 100644 --- a/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java +++ b/common/src/main/java/us/ajg0702/queue/common/QueueManagerImpl.java @@ -447,6 +447,7 @@ public class QueueManagerImpl implements QueueManager { } protected final Map pausedAntiSpam = new ConcurrentHashMap<>(); + private boolean skipPriorityCheck = true; @Override public void sendQueueEvents() { @@ -489,6 +490,27 @@ public class QueueManagerImpl implements QueueManager { main.getPlatformMethods().sendPluginMessage(player, "inqueueevent", "true"); } } + if(main.getConfig().getBoolean("re-check-priority")) { + if(skipPriorityCheck) { + skipPriorityCheck = false; + } else { + for (QueueServer server : servers) { + for (QueuePlayer queuePlayer : server.getQueue()) { + if(queuePlayer.getPlayer() == null) continue; + AdaptedPlayer player = queuePlayer.getPlayer(); + AdaptedServer ideal = server.getIdealServer(player); + + int currentHighestPriority = main.getLogic().getHighestPriority(server, ideal, player); + if(queuePlayer.getPriority() >= currentHighestPriority) continue; + + player.sendMessage(main.getMessages().getComponent("status.priority-increased")); + + server.removePlayer(queuePlayer); + addToQueue(player, server); + } + } + } + } } @Override @@ -683,7 +705,7 @@ public class QueueManagerImpl implements QueueManager { // first, we need to find what the lowest priority on the server is int lowestPriority = Integer.MAX_VALUE; for (AdaptedPlayer player : players) { - int priority = main.getLogic().getPermissionGetter().getPriority(player); + int priority = main.getLogic().getHighestPriority(server, selected, player); if(priority < lowestPriority) lowestPriority = priority; } @@ -692,8 +714,8 @@ public class QueueManagerImpl implements QueueManager { long selectedTime = kickLongest ? Long.MAX_VALUE : 0; AdaptedPlayer selectedPlayer = null; for (AdaptedPlayer player : players) { - int priority = main.getLogic().getPermissionGetter().getPriority(player); - if(priority > lowestPriority) continue; // dont select players with higher priorities + int priority = main.getLogic().getHighestPriority(server, selected, player); + if(priority > lowestPriority) continue; // don't select players with higher priorities long switchTime = main.getServerTimeManager().getLastServerChange(player); if(selectedPlayer == null) { selectedPlayer = player; diff --git a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java index 3feb389..fa16f35 100644 --- a/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java +++ b/common/src/main/java/us/ajg0702/queue/logic/FreeLogic.java @@ -28,6 +28,11 @@ public class FreeLogic implements Logic { return null; } + @Override + public int getHighestPriority(QueueServer queueServer, AdaptedServer server, AdaptedPlayer player) { + return player.hasPermission("ajqueue.priority") ? 1 : 0; + } + @Override public boolean hasAnyBypass(AdaptedPlayer player, String server) { return false; diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index 9b73ccd..b11fb4b 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -301,6 +301,11 @@ make-room-kick-to: lobby make-room-kick-longest-playtime: true +# Should we check every 4 seconds if a player has a higher priority permission than before +# If they do, they are removed and re-added to the queue (only if they would be put in a higher position) +# Default: false +re-check-priority: false + # Should we check to make sure that people don't get sent quicker than wait-time? # Default: true check-last-player-sent-time: true @@ -399,4 +404,4 @@ debug: false # Don't touch this number please -config-version: 39 +config-version: 40 diff --git a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java index bd86144..1bf4e14 100644 --- a/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java +++ b/premium/src/main/java/us/ajg0702/queue/logic/PremiumLogic.java @@ -18,6 +18,15 @@ public class PremiumLogic implements Logic { return permissionGetter; } + @Override + public int getHighestPriority(QueueServer queueServer, AdaptedServer server, AdaptedPlayer player) { + int normalPriority = permissionGetter.getPriority(player); + int serverPriority = permissionGetter.getServerPriotity(queueServer.getName(), player); + int unJoinablePriority = Logic.getUnJoinablePriorities(queueServer, server, player); + + return Math.max(normalPriority, Math.max(serverPriority, unJoinablePriority)); + } + private final PermissionGetter permissionGetter; public PremiumLogic(QueueMain main) { permissionGetter = new PermissionGetterImpl(main);