aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2020-04-15 22:36:15 +0100
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2020-04-15 22:36:15 +0100
commit14e01dd88497b846165af37382a4655f2c5776b5 (patch)
tree094f79c1c91a2374ed3e7a00079aea3f8747fee2 /src/main/java
parentd39a6d4084266c4fd500aecc5f256e9ce8948ded (diff)
Fix ConcurrentModificationException & hopefully reduced method calls in QuestCompleter
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/com/leonardobishop/quests/QuestCompleter.java30
-rw-r--r--src/main/java/com/leonardobishop/quests/Quests.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/player/QPlayerManager.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java25
5 files changed, 34 insertions, 27 deletions
diff --git a/src/main/java/com/leonardobishop/quests/QuestCompleter.java b/src/main/java/com/leonardobishop/quests/QuestCompleter.java
index 5a3f6501..3c02b63e 100644
--- a/src/main/java/com/leonardobishop/quests/QuestCompleter.java
+++ b/src/main/java/com/leonardobishop/quests/QuestCompleter.java
@@ -19,28 +19,28 @@ public class QuestCompleter implements Runnable {
@Override
public void run() {
+ //TODO if it still runs like shit then maybe only process a few players per X ticks rather than the whole server in one go
for (QPlayer qPlayer : plugin.getPlayerManager().getQPlayers()) {
if (qPlayer.isOnlyDataLoaded()) {
continue;
}
QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile();
- for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) {
- Quest quest = entry.getValue();
- QuestProgress questProgress = questProgressFile.getQuestProgress(quest);
- if (questProgressFile.hasStartedQuest(quest)) {
- boolean complete = true;
- for (Task task : quest.getTasks()) {
- TaskProgress taskProgress;
- if ((taskProgress = questProgress.getTaskProgress(task.getId())) == null || !taskProgress.isCompleted()) {
- complete = false;
- break;
- }
- }
- if (complete) {
- questProgressFile.completeQuest(quest);
+ for (QuestProgress questProgress : questProgressFile.getAllQuestProgress()) {
+ Quest quest = plugin.getQuestManager().getQuestById(questProgress.getQuestId());
+ if (!questProgressFile.hasStartedQuest(quest)) continue;
+
+ boolean complete = true;
+ for (Task task : quest.getTasks()) {
+ TaskProgress taskProgress;
+ if ((taskProgress = questProgress.getTaskProgress(task.getId())) == null || !taskProgress.isCompleted()) {
+ complete = false;
+ break;
}
}
+ if (complete) {
+ questProgressFile.completeQuest(quest);
+ }
}
}
}
-}
+} \ No newline at end of file
diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java
index ada6a2e1..f1a65747 100644
--- a/src/main/java/com/leonardobishop/quests/Quests.java
+++ b/src/main/java/com/leonardobishop/quests/Quests.java
@@ -219,7 +219,7 @@ public class Quests extends JavaPlugin {
questAutosaveTask.cancel();
} catch (Exception ignored) { }
}
- questAutosaveTask = Bukkit.getScheduler().runTaskTimerAsynchronously(this, () -> {
+ questAutosaveTask = Bukkit.getScheduler().runTaskTimer(this, () -> {
for (QPlayer qPlayer : qPlayerManager.getQPlayers()) {
if (qPlayer.isOnlyDataLoaded()) {
continue;
diff --git a/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java b/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java
index 7f7f07a2..9992bc22 100644
--- a/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java
+++ b/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java
@@ -19,7 +19,7 @@ public class EventPlayerLeave implements Listener {
@EventHandler
public void onEvent(PlayerQuitEvent event) {
UUID playerUuid = event.getPlayer().getUniqueId();
- Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> plugin.getPlayerManager().removePlayer(playerUuid));
+ plugin.getPlayerManager().removePlayer(playerUuid);
}
}
diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java
index dba881bb..13fa644d 100644
--- a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java
+++ b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java
@@ -52,6 +52,7 @@ public class QPlayerManager {
public void removePlayer(UUID uuid) {
this.getPlayer(uuid).getQuestProgressFile().saveToDisk(false);
+ plugin.getQuestsLogger().debug("Unloading player " + uuid + ".");
qPlayers.remove(uuid);
}
@@ -66,6 +67,7 @@ public class QPlayerManager {
// TODO redo "onlyData" and use a less confusing way
public void loadPlayer(UUID uuid, boolean onlyData) {
+ plugin.getQuestsLogger().debug("Loading player " + uuid + " from disk.");
if (getPlayer(uuid) == null || getPlayer(uuid).isOnlyDataLoaded()) {
QuestProgressFile questProgressFile = new QuestProgressFile(uuid, plugin);
diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java
index b090e7e3..1697401d 100644
--- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java
+++ b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java
@@ -33,8 +33,6 @@ public class QuestProgressFile {
this.plugin = plugin;
}
- //TODO change back to quest id to save performance
-
public boolean completeQuest(Quest quest) {
QuestProgress questProgress = getQuestProgress(quest);
questProgress.setStarted(false);
@@ -240,16 +238,24 @@ public class QuestProgressFile {
return startedQuests;
}
+ /**
+ * Gets all the quest progress that it has ever encountered.
+ * @return {@code Collection<QuestProgress>} all quest progresses
+ */
+ public Collection<QuestProgress> getAllQuestProgress() {
+ return questProgress.values();
+ }
+
public boolean hasQuestProgress(Quest quest) {
return questProgress.containsKey(quest.getId());
}
public boolean hasStartedQuest(Quest quest) {
- if (!Options.QUEST_AUTOSTART.getBooleanValue()) {
- return hasQuestProgress(quest) && getQuestProgress(quest).isStarted();
- } else {
+ if (Options.QUEST_AUTOSTART.getBooleanValue()) {
QuestStartResult response = canStartQuest(quest);
return response == QuestStartResult.QUEST_SUCCESS || response == QuestStartResult.QUEST_ALREADY_STARTED;
+ } else {
+ return hasQuestProgress(quest) && getQuestProgress(quest).isStarted();
}
}
@@ -308,6 +314,7 @@ public class QuestProgressFile {
}
public void saveToDisk(boolean disable) {
+ plugin.getQuestsLogger().debug("Saving player " + playerUUID + " to disk.");
File directory = new File(plugin.getDataFolder() + File.separator + "playerdata");
if (!directory.exists() && !directory.isDirectory()) {
directory.mkdirs();
@@ -348,11 +355,9 @@ public class QuestProgressFile {
}
}
else
- Bukkit.getScheduler().runTask(this.plugin, () -> {
- for (QuestProgress questProgress : questProgress.values()) {
- questProgress.resetModified();
- }
- });
+ for (QuestProgress questProgress : questProgress.values()) {
+ questProgress.resetModified();
+ }
} catch (IOException e) {
e.printStackTrace();
}