diff options
| author | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2020-04-15 22:36:15 +0100 |
|---|---|---|
| committer | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2020-04-15 22:36:15 +0100 |
| commit | 14e01dd88497b846165af37382a4655f2c5776b5 (patch) | |
| tree | 094f79c1c91a2374ed3e7a00079aea3f8747fee2 /src | |
| parent | d39a6d4084266c4fd500aecc5f256e9ce8948ded (diff) | |
Fix ConcurrentModificationException & hopefully reduced method calls in QuestCompleter
Diffstat (limited to 'src')
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(); } |
