@@ -60,9 +60,23 @@ public void onClick(UUID uuid) {
6060
6161 private void endSession (UUID uuid , Session session ) {
6262
63+ // Suppression atomique - empêche le double traitement
64+ // Si la session dans la map n'est pas celle qu'on essaie de terminer, on ne fait rien
65+ Session removedSession = sessions .remove (uuid );
66+ if (removedSession == null || removedSession != session ) {
67+ // Session déjà traitée par un autre thread ou remplacée par une nouvelle session
68+ return ;
69+ }
70+
71+ // Annuler la tâche programmée si elle existe
72+ var task = session .getTask ();
73+ if (task != null ) {
74+ task .cancel ();
75+ session .setTask (null );
76+ }
77+
6378 var player = Bukkit .getPlayer (uuid );
6479 session .setFinishedAt (System .currentTimeMillis ());
65- sessions .remove (uuid );
6680
6781 var storage = this .plugin .getStorageManager ();
6882
@@ -95,11 +109,6 @@ private void endSession(UUID uuid, Session session) {
95109 });
96110 });
97111 }
98-
99- var task = session .getTask ();
100- if (task != null ) task .cancel ();
101- session .setTask (null );
102-
103112 }
104113
105114 /**
@@ -137,8 +146,9 @@ private SessionResult verifySession(ClickSession session) {
137146 public void onQuit (PlayerQuitEvent event ) {
138147
139148 var uuid = event .getPlayer ().getUniqueId ();
140- if (sessions .containsKey (uuid )) {
141- this .endSession (uuid , sessions .get (uuid ));
149+ Session session = sessions .get (uuid );
150+ if (session != null ) {
151+ this .endSession (uuid , session );
142152 }
143153 }
144154
0 commit comments