2323
2424// velocity api event docs:
2525// https://jd.papermc.io/velocity/3.3.0/com/velocitypowered/api/event/package-summary.html
26- // TODO: replace player objects with uuids
2726
2827public class Queue {
2928 private final ComponentLogger log ;
@@ -34,7 +33,7 @@ public class Queue {
3433
3534 private final Deque <Player > playerQueue ;
3635
37- private final HashMap <Player , Long > kickedPlayers ;
36+ private final HashMap <UUID , Long > kickedPlayers ;
3837
3938 /**
4039 * Initializes the queue.
@@ -91,9 +90,10 @@ public void onServerPreConnect(ServerPreConnectEvent event) {
9190 if (event .getPreviousServer () != null )
9291 return ;
9392
94- // Check if player is connecting to the queue server
95- if (getSize () == 0 && event .getOriginalServer ().getServerInfo ().getName ().equals (Config .queue )) {
96- // If queue is empty, attempt passthrough
93+ // If queue is empty and player is not in the kicked list, attempt passthrough
94+ if (getSize () == 0 &&
95+ event .getOriginalServer ().getServerInfo ().getName ().equals (Config .queue ) &&
96+ !kickedPlayers .containsKey (event .getPlayer ().getUniqueId ())) {
9797 try {
9898 // Check target server reachability
9999 RegisteredServer serverTarget = getServer (Config .target );
@@ -167,7 +167,7 @@ public void onPlayerDisconnect(DisconnectEvent event) {
167167 Player player = event .getPlayer ();
168168 if (playerQueue .contains (player )) {
169169 playerQueue .remove (player );
170- kickedPlayers . remove ( player );
170+ // Leave the players UUID in the kicked players to prevent fast relogs
171171 log .info (mm ("<white>" + player .getUsername () + "<dark_aqua> disconnected and was removed from the <light_purple>queue<dark_aqua>." ));
172172 }
173173 } finally {
@@ -196,7 +196,7 @@ private void KickOrRequeue(Player player, Component reason) {
196196 || (!Config .kickOnBusy && textReason .contains ("Too fast re-login, try with a little delay." )) // NCP
197197 ) {
198198 // save the disconnection time
199- kickedPlayers .put (player , Instant .now ().getEpochSecond ());
199+ kickedPlayers .put (player . getUniqueId () , Instant .now ().getEpochSecond ());
200200
201201 // send message
202202 player .sendMessage (mm ("<gold>You were sent back to the queue for: <red>" ).append (reason ).append (mm ("<reset>" )));
@@ -249,7 +249,7 @@ public void flushQueue() {
249249
250250 // try to find the first player that got not kicked recently
251251 for (Player testPlayer : playerQueue ) {
252- if (kickedPlayers .containsKey (testPlayer ))
252+ if (kickedPlayers .containsKey (testPlayer . getUniqueId () ))
253253 continue ;
254254
255255 currPlayer = testPlayer ;
@@ -284,7 +284,7 @@ public void flushQueue() {
284284 } catch (InterruptedException | ExecutionException e ) {
285285 log .error (mm ("<white>" + p .getUsername () + "s<red> connection to server <aqua>" + Config .target + "<red> failed with an exception: " + e .getMessage ()));
286286 // server down?
287- kickedPlayers .put (finalCurrPlayer , Instant .now ().getEpochSecond ());
287+ kickedPlayers .put (finalCurrPlayer . getUniqueId () , Instant .now ().getEpochSecond ());
288288 }
289289 },
290290 // player is in the queue, but not connected to the queue server
0 commit comments