77import net .md_5 .bungee .api .connection .ProxiedPlayer ;
88import net .md_5 .bungee .api .event .ServerConnectEvent ;
99
10+ import java .util .ArrayList ;
11+ import java .util .Collections ;
12+ import java .util .List ;
1013import java .util .Queue ;
1114import java .util .concurrent .*;
1215
1316public class QueueManager {
1417
1518 private AdvancedBungeeQueue plugin ;
1619
17- private ConcurrentHashMap <ServerInfo , Queue <QueuedPlayer >> queue ;
20+ private ConcurrentHashMap <ServerInfo , List <QueuedPlayer >> queue ;
1821 private ScheduledExecutorService scheduledExecutorService ;
1922 private boolean queueRunning = true ;
2023
@@ -24,7 +27,7 @@ public QueueManager(AdvancedBungeeQueue plugin) {
2427 this .scheduledExecutorService = new ScheduledThreadPoolExecutor (plugin .getConfigFile ().getInt ("thread-pool-size" ));
2528
2629 this .loadServersQueue ();
27- for (ServerInfo serverInfo : queue .keySet ()) {
30+ for (ServerInfo serverInfo : queue .keySet ()) {
2831 this .scheduledExecutorService .scheduleAtFixedRate (new ConnectRunnable (plugin , serverInfo ), this .plugin .getConfigFile ().getLong ("queue-speed" ), this .plugin .getConfigFile ().getLong ("queue-speed" ), TimeUnit .MILLISECONDS );
2932 }
3033 }
@@ -34,32 +37,53 @@ public boolean isQueueRunning() {
3437 }
3538
3639 public void addPlayerInQueue (ProxiedPlayer proxiedPlayer , ServerInfo serverInfo ) {
37- if (plugin .getConfigFile ().getStringList ("default-servers" ).stream ().noneMatch (s -> proxiedPlayer .getServer ().getInfo ().getName ().contains (s ))) {
40+ if (plugin .getConfigFile ().getStringList ("default-servers" ).stream ().noneMatch (s -> proxiedPlayer .getServer ().getInfo ().getName ().contains (s ))) {
3841 return ;
3942 }
40- if (proxiedPlayer .hasPermission (plugin .getConfigFile ().getString ("permissions.bypass" ))) {
43+ if (proxiedPlayer .hasPermission (plugin .getConfigFile ().getString ("permissions.bypass" ))) {
4144 proxiedPlayer .connect (serverInfo );
4245 return ;
4346 }
44- Queue <QueuedPlayer > queuedPlayers = queue .get (serverInfo );
45- QueuedPlayer queuedPlayer = QueuedPlayer .get (proxiedPlayer );
46- if (queuedPlayer .isWaiting ())return ;
47+ List <QueuedPlayer > queuedPlayers = queue .get (serverInfo );
48+ if (this .plugin .getConfigFile ().getBoolean ("use-same-queue" )) queuedPlayers = queue .values ().stream ().findFirst ().get ();
49+ if (queuedPlayers == null )return ;
50+
51+ QueuedPlayer queuedPlayer = new QueuedPlayer (proxiedPlayer , serverInfo , getPriority (proxiedPlayer ));
52+ if (queuedPlayer .isWaiting ()) return ;
4753 queuedPlayer .setTargetServer (serverInfo );
48- queuedPlayers .add (queuedPlayer );
49- queue .put (serverInfo , queuedPlayers );
54+
55+ for (QueuedPlayer player : queuedPlayers ) {
56+ if (player .getPriority () <= queuedPlayer .getPriority ()) {
57+ queuedPlayers .add (queuedPlayers .indexOf (player ), queuedPlayer );
58+ }
59+ }
60+ }
61+
62+ public int getPriority (ProxiedPlayer proxiedPlayer ) {
63+ for (String str : plugin .getConfigFile ().getSection ("priorities" ).getKeys ()) {
64+ if (proxiedPlayer .hasPermission ("advancedbungeequeue.priority." + str )) return plugin .getConfigFile ().getInt ("priorities." + str );
65+ }
66+ return plugin .getConfigFile ().getInt ("priorities.default" , 0 );
67+ }
68+
69+ public int getPlayerPosition (ProxiedPlayer proxiedPlayer ) {
70+ QueuedPlayer queuedPlayer = QueuedPlayer .get (proxiedPlayer );
71+ if (queue .get (queuedPlayer .getTargetServer ()) != null )
72+ return queue .get (queuedPlayer .getTargetServer ()).indexOf (queuedPlayer ) + 1 ;
73+ return -1 ;
5074 }
5175
5276 public void setQueueRunning (boolean queueRunning ) {
5377 this .queueRunning = queueRunning ;
5478 }
5579
5680 public void connectNextPlayers (ServerInfo serverInfo ) {
57- for (int i = 0 ; i < plugin .getConfigFile ().getInt ("player-amount" ); i ++) {
58- Queue <QueuedPlayer > queuedPlayers = queue .get (serverInfo );
59- QueuedPlayer queuedPlayer = queuedPlayers .peek ( );
60- if (queuedPlayer == null )continue ;
81+ for (int i = 0 ; i < plugin .getConfigFile ().getInt ("player-amount" ); i ++) {
82+ List <QueuedPlayer > queuedPlayers = queue .get (serverInfo );
83+ QueuedPlayer queuedPlayer = queuedPlayers .get ( 0 );
84+ if (queuedPlayer == null ) continue ;
6185 queuedPlayer .getProxiedPlayer ().connect (serverInfo , (result , error ) -> {
62- if (result ) {
86+ if (result ) {
6387 queuedPlayers .remove (queuedPlayer );
6488 } else {
6589
@@ -72,13 +96,13 @@ public void loadServersQueue() {
7296 for (String servers : this .plugin .getConfigFile ().getStringList ("queued-servers" )) {
7397 ServerInfo serverInfo = this .plugin .getProxy ().getServerInfo (servers );
7498 if (serverInfo != null ) {
75- queue .putIfAbsent (serverInfo , new ConcurrentLinkedQueue <>());
99+ queue .putIfAbsent (serverInfo , Collections . synchronizedList ( new ArrayList <>() ));
76100 if (!this .plugin .getConfigFile ().getBoolean ("use-same-queue" )) break ;
77101 }
78102 }
79103 }
80104
81- public ConcurrentHashMap <ServerInfo , Queue <QueuedPlayer >> getQueues () {
105+ public ConcurrentHashMap <ServerInfo , List <QueuedPlayer >> getQueues () {
82106 return queue ;
83107 }
84108}
0 commit comments