11package net .streamline .base .runnables ;
22
3- import lombok .Getter ;
4- import lombok .Setter ;
53import net .md_5 .bungee .api .ServerConnectRequest ;
64import net .md_5 .bungee .api .config .ServerInfo ;
75import net .md_5 .bungee .api .connection .ProxiedPlayer ;
86import net .md_5 .bungee .api .event .ServerConnectEvent ;
7+ import net .streamline .api .base .timers .AbstractPlayerTeleporter ;
98import net .streamline .base .Streamline ;
109import singularity .configs .given .GivenConfigs ;
1110import singularity .data .teleportation .TPTicket ;
11+ import singularity .utils .MessageUtils ;
1212
1313import java .util .Date ;
1414import java .util .UUID ;
1515import java .util .concurrent .ConcurrentSkipListSet ;
16- import java .util .concurrent .atomic . AtomicLong ;
17- import java .util .concurrent .atomic . AtomicReference ;
16+ import java .util .concurrent .ExecutorService ;
17+ import java .util .concurrent .Executors ;
1818
19- public class PlayerTeleporter extends Thread {
20- public static final long TICKING_FREQUENCY = 50L ;
21-
22- @ Getter @ Setter
23- private static PlayerTeleporter instance ;
19+ public class PlayerTeleporter extends AbstractPlayerTeleporter {
20+ // private static final ExecutorService executor = Executors.newFixedThreadPool(4); // Adjust as needed
2421
2522 public static void init () {
26- instance = new PlayerTeleporter ();
27- instance . start ();
23+ setInstance ( new PlayerTeleporter () );
24+ startInstance ();
2825 }
2926
30- public static void stopInstance () {
31- try {
32- if (instance != null ) {
33- instance .interrupt ();
34- instance = null ;
35- }
36- } catch (Exception e ) {
37- // ignore
38- }
39- }
40-
41- @ Getter @ Setter
42- private static AtomicReference <TeleportStage > stage = new AtomicReference <>(TeleportStage .READY );
43- @ Getter @ Setter
44- private static AtomicLong lastRun = new AtomicLong (0 );
45-
46- public enum TeleportStage {
47- COLLECTION ,
48- TELEPORTATION ,
49- READY ,
50- ;
51- }
27+ @ Override
28+ public void tick () {
29+ if (areTicketsPending ()) return ;
5230
53- public static boolean isAbleToRunAgain () {
54- return lastRun .get () + TICKING_FREQUENCY < System .currentTimeMillis ();
55- }
31+ getStage ().set (TeleportStage .COLLECTION );
32+ ConcurrentSkipListSet <TPTicket > tickets = getTicketsPending ().join ();
5633
57- public static void setLastRun () {
58- lastRun . set ( System . currentTimeMillis ( ));
59- }
34+ getStage (). set ( TeleportStage . TELEPORTATION );
35+ // tickets.forEach(ticket -> executor.submit(() -> processTicket(ticket) ));
36+ tickets . forEach ( this :: processTicket );
6037
61- public PlayerTeleporter () {
62- super ( "SL - Player Teleporter" );
38+ unpendTickets ();
39+ getStage (). set ( TeleportStage . READY );
6340 }
6441
65- @ Override
66- public void run () {
67- if (! isAbleToRunAgain ()) return ;
68-
69- setLastRun ();
70-
71- stage .set (TeleportStage .COLLECTION );
72- ConcurrentSkipListSet <TPTicket > tickets = GivenConfigs .getMainDatabase ().pullAllTPTickets ().join ();
73-
74- stage .set (TeleportStage .TELEPORTATION );
75- tickets .forEach (ticket -> {
76- if (ticket .getCreateDate ().before (new Date (System .currentTimeMillis () - 7 * 1000 ))) {
77- ticket .clear ();
42+ private void processTicket (TPTicket ticket ) {
43+ try {
44+ if (ticket .getCreateDate ().before (new Date (System .currentTimeMillis () - (7 * 1000 )))) {
45+ clearTicket (ticket , 1 );
7846 return ;
7947 }
8048
8149 ProxiedPlayer player = Streamline .getInstance ().getProxy ().getPlayer (UUID .fromString (ticket .getIdentifier ()));
8250 if (player == null ) {
83- ticket . clear ( );
51+ clearTicket ( ticket , 2 );
8452 return ;
8553 }
8654
8755 teleportPlayerAsync (player , ticket .getTargetServer ().getIdentifier ());
88- });
89-
90- stage .set (TeleportStage .READY );
56+ // clearTicket(ticket, 3); // Handled by the Spigot side
57+ } catch (Exception e ) {
58+ MessageUtils .logWarning ("Error processing ticket: " + ticket .getIdentifier (), e );
59+ }
9160 }
9261
93- private static void teleportPlayerAsync (ProxiedPlayer player , String server ) {
62+ private void teleportPlayerAsync (ProxiedPlayer player , String server ) {
9463 ServerInfo targetServer = Streamline .getInstance ().getProxy ().getServerInfo (server );
9564 if (targetServer != null ) {
9665 ServerConnectRequest request = ServerConnectRequest .builder ()
@@ -100,4 +69,9 @@ private static void teleportPlayerAsync(ProxiedPlayer player, String server) {
10069 player .connect (request );
10170 }
10271 }
72+
73+ private static void clearTicket (TPTicket ticket , int instance ) {
74+ ticket .clear ();
75+ MessageUtils .logInfo ("Cleared teleportation ticket for player " + ticket .getIdentifier () + ". [" + instance + "]" );
76+ }
10377}
0 commit comments