55import dev .plex .listener .ChatListener ;
66import dev .plex .listener .JoinListener ;
77import dev .plex .module .PlexModule ;
8- import io .papermc .paper .threadedregions .scheduler .ScheduledTask ;
98import org .bukkit .entity .Player ;
109
1110import java .util .Map ;
1211import java .util .UUID ;
1312import java .util .concurrent .ConcurrentHashMap ;
1413import java .util .concurrent .TimeUnit ;
14+ import java .util .concurrent .Executors ;
15+ import java .util .concurrent .ScheduledExecutorService ;
16+ import java .util .concurrent .ScheduledFuture ;
17+ import java .util .concurrent .atomic .AtomicReference ;
1518
1619public class NUSHModule extends PlexModule
1720{
1821 private ModuleConfiguration config ;
19- private final Map <UUID , ScheduledTask > newPlayers = new ConcurrentHashMap <>();
22+ private final Map <UUID , ScheduledFuture <?>> newPlayers = new ConcurrentHashMap <>();
23+ private ScheduledExecutorService expiryExecutor ;
2024 private boolean enabled ;
2125 private int time ;
2226
@@ -31,6 +35,8 @@ public void load()
3135 @ Override
3236 public void enable ()
3337 {
38+ expiryExecutor = Executors .newSingleThreadScheduledExecutor (
39+ Thread .ofPlatform ().daemon ().name ("Plex-NUSH-Expiry" ).factory ());
3440 config .load ();
3541 enabled = config .getBoolean ("server.enabled" , false );
3642 time = config .getInt ("server.wait_time" , 2 );
@@ -41,6 +47,11 @@ public void enable()
4147 @ Override
4248 public void disable ()
4349 {
50+ if (expiryExecutor != null )
51+ {
52+ expiryExecutor .shutdownNow ();
53+ expiryExecutor = null ;
54+ }
4455 clearNewPlayers ();
4556 }
4657
@@ -71,12 +82,14 @@ public void setTime(int minutes)
7182 public void queueNewPlayer (Player player )
7283 {
7384 UUID uuid = player .getUniqueId ();
74- ScheduledTask task = scheduler ().runAsyncLater (
75- scheduledTask -> newPlayers .remove (uuid , scheduledTask ), time , TimeUnit .MINUTES );
76- ScheduledTask previous = newPlayers .put (uuid , task );
85+ AtomicReference <ScheduledFuture <?>> taskReference = new AtomicReference <>();
86+ ScheduledFuture <?> task = expiryExecutor .schedule (
87+ () -> newPlayers .remove (uuid , taskReference .get ()), time , TimeUnit .MINUTES );
88+ taskReference .set (task );
89+ ScheduledFuture <?> previous = newPlayers .put (uuid , task );
7790 if (previous != null )
7891 {
79- previous .cancel ();
92+ previous .cancel (false );
8093 }
8194 }
8295
@@ -87,16 +100,16 @@ public boolean isNewPlayer(Player player)
87100
88101 public void removePlayer (Player player )
89102 {
90- ScheduledTask task = newPlayers .remove (player .getUniqueId ());
103+ ScheduledFuture <?> task = newPlayers .remove (player .getUniqueId ());
91104 if (task != null )
92105 {
93- task .cancel ();
106+ task .cancel (false );
94107 }
95108 }
96109
97110 public void clearNewPlayers ()
98111 {
99- newPlayers .values ().forEach (ScheduledTask :: cancel );
112+ newPlayers .values ().forEach (task -> task . cancel ( false ) );
100113 newPlayers .clear ();
101114 }
102115}
0 commit comments