From a90b1c496aa5ca94f0856bd250281f3f7ed7da4d Mon Sep 17 00:00:00 2001
From: PikaMug <2267126+PikaMug@users.noreply.github.com>
Date: Thu, 5 Nov 2020 15:17:13 -0500
Subject: [PATCH] Finalize updates to quester list, fixes #1441

---
 .../main/java/me/blackvein/quests/Quests.java | 28 +++++++++++++++++--
 .../quests/actions/ActionFactory.java         |  4 +--
 .../quests/conditions/ConditionFactory.java   |  4 +--
 .../quests/listeners/CmdExecutor.java         | 11 ++++----
 .../quests/listeners/PlayerListener.java      | 10 +++----
 5 files changed, 40 insertions(+), 17 deletions(-)

diff --git a/main/src/main/java/me/blackvein/quests/Quests.java b/main/src/main/java/me/blackvein/quests/Quests.java
index 07ebecc05..1b4eb0864 100644
--- a/main/src/main/java/me/blackvein/quests/Quests.java
+++ b/main/src/main/java/me/blackvein/quests/Quests.java
@@ -319,20 +319,42 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
         this.conditions = conditions;
     }
     
-    // TODO Experimental start
+    /**
+     * Gets every Quester that has ever played on this server
+     * 
+     * @return a collection of all Questers
+     */
     public Collection<Quester> getOfflineQuesters() {
         return questers;
     }
     
+    /**
+     * Sets every Quester that has ever played on this server
+     * 
+     * @param questers a collection of Questers
+     */
     public void setOfflineQuesters(final Collection<Quester> questers) {
-        this.questers = questers;
+        this.questers = new ConcurrentSkipListSet<>(questers);
     }
-    // TODO Experimental end
     
+    /**
+     * Gets every Quester that has ever played on this server
+     * 
+     * @deprecated Use {@link #getOfflineQuesters()}
+     * @return a list of all Questers
+     */
+    @Deprecated
     public LinkedList<Quester> getQuesters() {
         return new LinkedList<>(questers);
     }
     
+    /**
+     * Sets every Quester that has ever played on this server
+     * 
+     * @deprecated Use {@link #setOfflineQuesters(Collection)}
+     * @param questers a list of Questers
+     */
+    @Deprecated
     public void setQuesters(final LinkedList<Quester> questers) {
         this.questers = new ConcurrentSkipListSet<>(questers);
     }
diff --git a/main/src/main/java/me/blackvein/quests/actions/ActionFactory.java b/main/src/main/java/me/blackvein/quests/actions/ActionFactory.java
index c52adfcb9..b37b78361 100644
--- a/main/src/main/java/me/blackvein/quests/actions/ActionFactory.java
+++ b/main/src/main/java/me/blackvein/quests/actions/ActionFactory.java
@@ -306,7 +306,7 @@ public class ActionFactory implements ConversationAbandonedListener {
                     "Player " + ((Player)context.getForWhom()).getUniqueId() : "CONSOLE";
             plugin.getLogger().info(identifier + " deleted action " + action);
         }
-        for (final Quester q : plugin.getQuesters()) {
+        for (final Quester q : plugin.getOfflineQuesters()) {
             for (final Quest quest : q.getCurrentQuests().keySet()) {
                 q.checkQuest(quest);
             }
@@ -469,7 +469,7 @@ public class ActionFactory implements ConversationAbandonedListener {
                     "Player " + ((Player)context.getForWhom()).getUniqueId() : "CONSOLE";
             plugin.getLogger().info(identifier + " saved action " + (String) context.getSessionData(CK.E_NAME));
         }
-        for (final Quester q : plugin.getQuesters()) {
+        for (final Quester q : plugin.getOfflineQuesters()) {
             for (final Quest quest : q.getCurrentQuests().keySet()) {
                 q.checkQuest(quest);
             }
diff --git a/main/src/main/java/me/blackvein/quests/conditions/ConditionFactory.java b/main/src/main/java/me/blackvein/quests/conditions/ConditionFactory.java
index 0c7b21519..b1ee4885d 100644
--- a/main/src/main/java/me/blackvein/quests/conditions/ConditionFactory.java
+++ b/main/src/main/java/me/blackvein/quests/conditions/ConditionFactory.java
@@ -183,7 +183,7 @@ public class ConditionFactory implements ConversationAbandonedListener {
                     "Player " + ((Player)context.getForWhom()).getUniqueId() : "CONSOLE";
             plugin.getLogger().info(identifier + " deleted condition " + condition);
         }
-        for (final Quester q : plugin.getQuesters()) {
+        for (final Quester q : plugin.getOfflineQuesters()) {
             for (final Quest quest : q.getCurrentQuests().keySet()) {
                 q.checkQuest(quest);
             }
@@ -274,7 +274,7 @@ public class ConditionFactory implements ConversationAbandonedListener {
                     "Player " + ((Player)context.getForWhom()).getUniqueId() : "CONSOLE";
             plugin.getLogger().info(identifier + " saved condition " + (String) context.getSessionData(CK.C_NAME));
         }
-        for (final Quester q : plugin.getQuesters()) {
+        for (final Quester q : plugin.getOfflineQuesters()) {
             for (final Quest quest : q.getCurrentQuests().keySet()) {
                 q.checkQuest(quest);
             }
diff --git a/main/src/main/java/me/blackvein/quests/listeners/CmdExecutor.java b/main/src/main/java/me/blackvein/quests/listeners/CmdExecutor.java
index 0060ac53a..41eec34f1 100644
--- a/main/src/main/java/me/blackvein/quests/listeners/CmdExecutor.java
+++ b/main/src/main/java/me/blackvein/quests/listeners/CmdExecutor.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentSkipListSet;
 
 import org.bukkit.Bukkit;
 import org.bukkit.ChatColor;
@@ -1142,7 +1143,7 @@ public class CmdExecutor implements CommandExecutor {
             }
             cs.sendMessage(ChatColor.YELLOW + Lang.get("settingAllQuestPoints")
                     .replace("<points>", Lang.get("questPoints")));
-            for (final Quester q : plugin.getQuesters()) {
+            for (final Quester q : plugin.getOfflineQuesters()) {
                 q.setQuestPoints(amount);
             }
             Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@@ -1378,13 +1379,13 @@ public class CmdExecutor implements CommandExecutor {
                 }
             }
             final UUID id = target.getUniqueId();
-            final LinkedList<Quester> temp = plugin.getQuesters();
+            final ConcurrentSkipListSet<Quester> temp = (ConcurrentSkipListSet<Quester>) plugin.getOfflineQuesters();
             for(final Iterator<Quester> itr = temp.iterator(); itr.hasNext();) {
                 if (itr.next().getUUID().equals(id)) {
                     itr.remove();
                 }
             }
-            plugin.setQuesters(temp);
+            plugin.setOfflineQuesters(temp);
             Quester quester = plugin.getQuester(target.getUniqueId());
             try {
                 quester.hardClear();
@@ -1407,9 +1408,9 @@ public class CmdExecutor implements CommandExecutor {
             quester = new Quester(plugin);
             quester.setUUID(id);
             quester.saveData();
-            final LinkedList<Quester> temp2 = plugin.getQuesters();
+            final ConcurrentSkipListSet<Quester> temp2 = (ConcurrentSkipListSet<Quester>) plugin.getOfflineQuesters();
             temp2.add(quester);
-            plugin.setQuesters(temp2);
+            plugin.setOfflineQuesters(temp2);
         } else {
             cs.sendMessage(ChatColor.RED + Lang.get("noPermission"));
         }
diff --git a/main/src/main/java/me/blackvein/quests/listeners/PlayerListener.java b/main/src/main/java/me/blackvein/quests/listeners/PlayerListener.java
index 3296d334f..675ad2afe 100644
--- a/main/src/main/java/me/blackvein/quests/listeners/PlayerListener.java
+++ b/main/src/main/java/me/blackvein/quests/listeners/PlayerListener.java
@@ -15,10 +15,10 @@ package me.blackvein.quests.listeners;
 
 import java.io.File;
 import java.util.Iterator;
-import java.util.LinkedList;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import java.util.concurrent.ConcurrentSkipListSet;
 
 import org.bukkit.Bukkit;
 import org.bukkit.ChatColor;
@@ -797,9 +797,9 @@ public class PlayerListener implements Listener {
             } else if (plugin.getSettings().canGenFilesOnJoin()) {
                 quester.saveData();
             }
-            final LinkedList<Quester> temp = plugin.getQuesters();
+            final ConcurrentSkipListSet<Quester> temp = (ConcurrentSkipListSet<Quester>) plugin.getOfflineQuesters();
             temp.add(quester);
-            plugin.setQuesters(temp);
+            plugin.setOfflineQuesters(temp);
             for (final String s : quester.getCompletedQuests()) {
                 final Quest q = plugin.getQuest(s);
                 if (q != null) {
@@ -867,14 +867,14 @@ public class PlayerListener implements Listener {
                 temp.remove(evt.getPlayer().getUniqueId());
                 plugin.getQuestFactory().setSelectingNpcs(temp);
             }
-            final LinkedList<Quester> temp = plugin.getQuesters();
+            final ConcurrentSkipListSet<Quester> temp = (ConcurrentSkipListSet<Quester>) plugin.getOfflineQuesters();
             for (final Iterator<Quester> iterator = temp.iterator(); iterator.hasNext();) {
                 final Quester q = iterator.next();
                 if (q.getUUID().equals(quester.getUUID())) {
                     iterator.remove();
                 }
             }
-            plugin.setQuesters(temp);
+            plugin.setOfflineQuesters(temp);
         }
     }