diff options
Diffstat (limited to 'src')
11 files changed, 233 insertions, 126 deletions
diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java index 5cafa5ad..cab89f6a 100644 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ b/src/main/java/com/leonardobishop/quests/Quests.java @@ -301,7 +301,9 @@ public class Quests extends JavaPlugin { } catch (Exception ignored) { } } for (QPlayer qPlayer : qPlayerManager.getQPlayers()) { - qPlayer.getQuestProgressFile().saveToDisk(false); + try { + qPlayerManager.savePlayer(qPlayer.getPlayerUUID()); + } catch (Exception ignored) { } } if (placeholderAPIHook != null) placeholderAPIHook.unregisterExpansion(); } diff --git a/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java b/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java index 551d2ead..93cc30bc 100644 --- a/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java +++ b/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests; import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -36,8 +37,8 @@ public class QuestsAutosaveRunnable extends BukkitRunnable { } if (Bukkit.getPlayer(player) != null) { - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player); - qPlayer.getQuestProgressFile().saveToDisk(Options.QUEST_AUTOSAVE_ASYNC.getBooleanValue()); + QuestProgressFile clonedProgressFile = new QuestProgressFile(plugin.getPlayerManager().getPlayer(player).getQuestProgressFile()); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> plugin.getPlayerManager().removePlayer(player, clonedProgressFile)); } } diff --git a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java b/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java index e821d8ea..47aa050e 100644 --- a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java +++ b/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java @@ -173,7 +173,7 @@ public class QuestsCommand implements TabExecutor { plugin.getPlayerManager().loadPlayer(uuid); QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); qPlayer.getQuestProgressFile().clean(); - qPlayer.getQuestProgressFile().saveToDisk(false); + plugin.getPlayerManager().savePlayer(uuid, qPlayer.getQuestProgressFile()); if (Bukkit.getPlayer(uuid) == null) { plugin.getPlayerManager().dropPlayer(uuid); } @@ -285,7 +285,7 @@ public class QuestsCommand implements TabExecutor { } QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); questProgressFile.clear(); - questProgressFile.saveToDisk(false); + plugin.getPlayerManager().savePlayer(uuid, questProgressFile); if (Bukkit.getPlayer(uuid) == null) { plugin.getPlayerManager().dropPlayer(uuid); } @@ -355,7 +355,7 @@ public class QuestsCommand implements TabExecutor { } if (args[2].equalsIgnoreCase("reset")) { questProgressFile.generateBlankQuestProgress(quest); - questProgressFile.saveToDisk(false); + plugin.getPlayerManager().savePlayer(uuid, questProgressFile); sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_RESET_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); success = true; } else if (args[2].equalsIgnoreCase("start")) { @@ -382,12 +382,12 @@ public class QuestsCommand implements TabExecutor { sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); return true; } - questProgressFile.saveToDisk(false); + plugin.getPlayerManager().savePlayer(uuid, questProgressFile); sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); success = true; } else if (args[2].equalsIgnoreCase("complete")) { qPlayer.completeQuest(quest); - questProgressFile.saveToDisk(false); + plugin.getPlayerManager().savePlayer(uuid, questProgressFile); sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); success = true; } diff --git a/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java b/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java index b3035218..fcee6b40 100644 --- a/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java +++ b/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.listener; import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.util.Messages; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; @@ -22,7 +23,6 @@ public class PlayerJoinListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onAsyncJoin(AsyncPlayerPreLoginEvent event) { - if (!Options.QUEST_JOIN_ASYNC.getBooleanValue()) return; plugin.getPlayerManager().loadPlayer(event.getUniqueId()); } @@ -31,9 +31,10 @@ public class PlayerJoinListener implements Listener { UUID playerUuid = event.getPlayer().getUniqueId(); plugin.getPlayerManager().loadPlayer(playerUuid); if (Options.SOFT_CLEAN_QUESTSPROGRESSFILE_ON_JOIN.getBooleanValue()) { - plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile().clean(); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(playerUuid); + qPlayer.getQuestProgressFile().clean(); if (Options.PUSH_SOFT_CLEAN_TO_DISK.getBooleanValue()) { - plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile().saveToDisk(false); + plugin.getPlayerManager().savePlayer(playerUuid, qPlayer.getQuestProgressFile()); } } if (plugin.getDescription().getVersion().contains("beta") && event.getPlayer().hasPermission("quests.admin")) { diff --git a/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java b/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java index 5a5559ae..99cad4e2 100644 --- a/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java +++ b/src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java @@ -1,6 +1,9 @@ package com.leonardobishop.quests.listener; import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; @@ -15,7 +18,10 @@ public class PlayerLeaveListener implements Listener { @EventHandler public void onEvent(PlayerQuitEvent event) { - plugin.getPlayerManager().removePlayer(event.getPlayer().getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) return; + QuestProgressFile clonedProgressFile = new QuestProgressFile(qPlayer.getQuestProgressFile()); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> plugin.getPlayerManager().removePlayer(qPlayer.getPlayerUUID(), clonedProgressFile)); } } diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java index 3801b2df..f521d2de 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java @@ -6,6 +6,8 @@ import com.leonardobishop.quests.player.questprogressfile.QPlayerPreferences; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import com.leonardobishop.quests.storage.StorageProvider; +import com.leonardobishop.quests.storage.YamlStorageProvider; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; @@ -19,8 +21,10 @@ import java.util.concurrent.ConcurrentHashMap; public class QPlayerManager { private final Quests plugin; + private StorageProvider storageProvider; public QPlayerManager(Quests plugin) { + this.storageProvider = new YamlStorageProvider(plugin); this.plugin = plugin; } @@ -44,14 +48,37 @@ public class QPlayerManager { } /** - * Unloads and saves the player to disk. Must be invoked from the main thread. + * Unloads and saves the player to disk. * * @param uuid the uuid of the player + * @param questProgressFile the quest progress file to save */ - public void removePlayer(UUID uuid) { - plugin.getQuestsLogger().debug("Unloading and saving player " + uuid + "."); - this.getPlayer(uuid).getQuestProgressFile().saveToDisk(Options.QUEST_LEAVE_ASYNC.getBooleanValue()); - qPlayers.remove(uuid); + public void removePlayer(UUID uuid, QuestProgressFile questProgressFile) { + plugin.getQuestsLogger().debug("Unloading and saving player " + uuid + ". Main thread: " + Bukkit.isPrimaryThread()); + qPlayers.computeIfPresent(uuid, (mapUUID, qPlayer) -> { + storageProvider.saveProgressFile(uuid, questProgressFile); + return null; + }); + } + + /** + * Saves the player to disk with a specified {@link QuestProgressFile}. + * + * @param uuid the uuid of the player + * @param questProgressFile the quest progress file to associate with and save + */ + public void savePlayer(UUID uuid, QuestProgressFile questProgressFile) { + plugin.getQuestsLogger().debug("Saving player " + uuid + ". Main thread: " + Bukkit.isPrimaryThread()); + storageProvider.saveProgressFile(uuid, questProgressFile); + } + + /** + * Saves the player to disk using the {@link QuestProgressFile} associated by the {@link QPlayerManager} + * + * @param uuid the uuid of the player + */ + public void savePlayer(UUID uuid) { + savePlayer(uuid, getPlayer(uuid).getQuestProgressFile()); } /** @@ -68,11 +95,6 @@ public class QPlayerManager { return qPlayers.values(); } - //Better to use the second method, so we know if we only load the data - //public void loadPlayer(UUID uuid) { - // loadPlayer(uuid, false); - //} - /** * Load the player from disk if they exist, otherwise create a new {@link QuestProgressFile}. * This will have no effect if player is already loaded. Can be invoked asynchronously. @@ -80,53 +102,10 @@ public class QPlayerManager { * @param uuid the uuid of the player */ public void loadPlayer(UUID uuid) { - plugin.getQuestsLogger().debug("Loading player " + uuid + " from disk. Main thread: " + Bukkit.isPrimaryThread()); + plugin.getQuestsLogger().debug("Loading player " + uuid + ". Main thread: " + Bukkit.isPrimaryThread()); qPlayers.computeIfAbsent(uuid, s -> { - QuestProgressFile questProgressFile = new QuestProgressFile(uuid, plugin); - - try { - File directory = new File(plugin.getDataFolder() + File.separator + "playerdata"); - if (directory.exists() && directory.isDirectory()) { - File file = new File(plugin.getDataFolder() + File.separator + "playerdata" + File.separator + uuid.toString() + ".yml"); - if (file.exists()) { - YamlConfiguration data = YamlConfiguration.loadConfiguration(file); - plugin.getQuestsLogger().debug("Player " + uuid + " has a valid quest progress file."); - if (data.isConfigurationSection("quest-progress")) { //Same job as "isSet" + it checks if is CfgSection - for (String id : data.getConfigurationSection("quest-progress").getKeys(false)) { - boolean started = data.getBoolean("quest-progress." + id + ".started"); - boolean completed = data.getBoolean("quest-progress." + id + ".completed"); - boolean completedBefore = data.getBoolean("quest-progress." + id + ".completed-before"); - long completionDate = data.getLong("quest-progress." + id + ".completion-date"); - - QuestProgress questProgress = new QuestProgress(plugin, id, completed, completedBefore, completionDate, uuid, started, true); - - if (data.isConfigurationSection("quest-progress." + id + ".task-progress")) { - for (String taskid : data.getConfigurationSection("quest-progress." + id + ".task-progress").getKeys(false)) { - boolean taskCompleted = data.getBoolean("quest-progress." + id + ".task-progress." + taskid + ".completed"); - Object taskProgression = data.get("quest-progress." + id + ".task-progress." + taskid + ".progress"); - - TaskProgress taskProgress = new TaskProgress(questProgress, taskid, taskProgression, uuid, taskCompleted, false); - questProgress.addTaskProgress(taskProgress); - } - } - - questProgressFile.addQuestProgress(questProgress); - } - } - } else { - plugin.getQuestsLogger().debug("Player " + uuid + " does not have a quest progress file."); - } - } - } catch (Exception ex) { - plugin.getQuestsLogger().severe("Failed to load player: " + uuid + "! This WILL cause errors."); - ex.printStackTrace(); - // fuck - } - + QuestProgressFile questProgressFile = storageProvider.loadProgressFile(uuid); return new QPlayer(uuid, questProgressFile, new QPlayerPreferences(null), plugin); }); -// else { -// plugin.getQuestsLogger().debug("Player " + uuid + " is already loaded."); -// } } } diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgress.java b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgress.java index 442b802c..7d795fed 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgress.java +++ b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgress.java @@ -36,6 +36,20 @@ public class QuestProgress { this.modified = modified; } + public QuestProgress(QuestProgress questProgress) { + this.plugin = questProgress.plugin; + for (Map.Entry<String, TaskProgress> progressEntry : questProgress.taskProgress.entrySet()) { + taskProgress.put(progressEntry.getKey(), new TaskProgress(progressEntry.getValue())); + } + this.questid = questProgress.questid; + this.player = questProgress.player; + this.started = questProgress.started; + this.completed = questProgress.completed; + this.completedBefore = questProgress.completedBefore; + this.completionDate = questProgress.completionDate; + this.modified = questProgress.modified; + } + public String getQuestId() { return questid; } 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 da5fd223..0ddf3525 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java +++ b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java @@ -31,6 +31,14 @@ public class QuestProgressFile { this.plugin = plugin; } + public QuestProgressFile(QuestProgressFile questProgressFile) { + for (Map.Entry<String, QuestProgress> progressEntry : questProgressFile.questProgress.entrySet()) { + questProgress.put(progressEntry.getKey(), new QuestProgress(progressEntry.getValue())); + } + this.playerUUID = questProgressFile.playerUUID; + this.plugin = questProgressFile.plugin; + } + public void addQuestProgress(QuestProgress questProgress) { this.questProgress.put(questProgress.getQuestId(), questProgress); } @@ -202,59 +210,6 @@ public class QuestProgressFile { addQuestProgress(questProgress); } - /** - * Save the quest progress file to disk at /playerdata/[uuid]. Must be invoked from the main thread. - * - * @param async save the file asynchronously - */ - public void saveToDisk(boolean async) { - plugin.getQuestsLogger().debug("Saving player " + playerUUID + " to disk. Main thread: " + async); - List<QuestProgress> questProgressValues = new ArrayList<>(questProgress.values()); - File directory = new File(plugin.getDataFolder() + File.separator + "playerdata"); - if (!directory.exists() && !directory.isDirectory()) { - directory.mkdirs(); - } - - if (async) { - Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> { - save(questProgressValues); - }); - } else { - save(questProgressValues); - } - } - - private void save(List<QuestProgress> questProgressValues) { - File file = new File(plugin.getDataFolder() + File.separator + "playerdata" + File.separator + playerUUID.toString() + ".yml"); - if (!file.exists()) { - try { - file.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - YamlConfiguration data = YamlConfiguration.loadConfiguration(file); - data.set("quest-progress", null); - for (QuestProgress questProgress : questProgressValues) { - data.set("quest-progress." + questProgress.getQuestId() + ".started", questProgress.isStarted()); - data.set("quest-progress." + questProgress.getQuestId() + ".completed", questProgress.isCompleted()); - data.set("quest-progress." + questProgress.getQuestId() + ".completed-before", questProgress.isCompletedBefore()); - data.set("quest-progress." + questProgress.getQuestId() + ".completion-date", questProgress.getCompletionDate()); - for (TaskProgress taskProgress : questProgress.getTaskProgress()) { - data.set("quest-progress." + questProgress.getQuestId() + ".task-progress." + taskProgress.getTaskId() + ".completed", taskProgress - .isCompleted()); - data.set("quest-progress." + questProgress.getQuestId() + ".task-progress." + taskProgress.getTaskId() + ".progress", taskProgress - .getProgress()); - } - } - try { - data.save(file); - } catch (IOException e) { - e.printStackTrace(); - } - } - public void clear() { questProgress.clear(); } @@ -262,6 +217,7 @@ public class QuestProgressFile { /** * Removes any references to quests or tasks which are no longer defined in the config. */ + @Deprecated public void clean() { plugin.getQuestsLogger().debug("Cleaning file " + playerUUID + "."); if (!plugin.getTaskTypeManager().areRegistrationsAccepted()) { diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/TaskProgress.java b/src/main/java/com/leonardobishop/quests/player/questprogressfile/TaskProgress.java index fa361a7a..14e1bea0 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/TaskProgress.java +++ b/src/main/java/com/leonardobishop/quests/player/questprogressfile/TaskProgress.java @@ -4,27 +4,35 @@ import java.util.UUID; public class TaskProgress { - private final QuestProgress questProgress; private final String taskid; private final UUID player; + private QuestProgress linkedQuestProgress; private boolean modified; private Object progress; private boolean completed; - public TaskProgress(QuestProgress questProgress, String taskid, Object progress, UUID player, boolean completed) { - this.questProgress = questProgress; + public TaskProgress(QuestProgress linkedQuestProgress, String taskid, Object progress, UUID player, boolean completed) { + this.linkedQuestProgress = linkedQuestProgress; this.taskid = taskid; this.progress = progress; this.player = player; this.completed = completed; } - public TaskProgress(QuestProgress questProgress, String taskid, Object progress, UUID player, boolean completed, boolean modified) { - this(questProgress, taskid, progress, player, completed); + public TaskProgress(QuestProgress linkedQuestProgress, String taskid, Object progress, UUID player, boolean completed, boolean modified) { + this(linkedQuestProgress, taskid, progress, player, completed); this.modified = modified; } + public TaskProgress(TaskProgress taskProgress) { + this.taskid = taskProgress.taskid; + this.player = taskProgress.player; + this.modified = taskProgress.modified; + this.progress = taskProgress.progress; + this.completed = taskProgress.completed; + } + public String getTaskId() { return taskid; } @@ -51,7 +59,7 @@ public class TaskProgress { this.modified = true; if (complete) { - questProgress.queueForCompletionTest(); + linkedQuestProgress.queueForCompletionTest(); } } diff --git a/src/main/java/com/leonardobishop/quests/storage/StorageProvider.java b/src/main/java/com/leonardobishop/quests/storage/StorageProvider.java new file mode 100644 index 00000000..65e4e091 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/storage/StorageProvider.java @@ -0,0 +1,12 @@ +package com.leonardobishop.quests.storage; + +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; + +import java.util.UUID; + +public interface StorageProvider { + + QuestProgressFile loadProgressFile(UUID uuid); + void saveProgressFile(UUID uuid, QuestProgressFile questProgressFile); + +} diff --git a/src/main/java/com/leonardobishop/quests/storage/YamlStorageProvider.java b/src/main/java/com/leonardobishop/quests/storage/YamlStorageProvider.java new file mode 100644 index 00000000..498a413f --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/storage/YamlStorageProvider.java @@ -0,0 +1,128 @@ +package com.leonardobishop.quests.storage; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.player.questprogressfile.TaskProgress; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.locks.ReentrantLock; + +public class YamlStorageProvider implements StorageProvider { + + private final Map<UUID, ReentrantLock> locks = new ConcurrentHashMap<>(); + private Quests plugin; + + public YamlStorageProvider(Quests plugin) { + this.plugin = plugin; + } + + private void lock(UUID uuid) { + locks.putIfAbsent(uuid, new ReentrantLock()); + locks.get(uuid).lock(); + } + + private void unlock(UUID uuid) { + ReentrantLock lock = locks.get(uuid); + if (lock != null) lock.unlock(); + } + + public QuestProgressFile loadProgressFile(UUID uuid) { + lock(uuid); + QuestProgressFile questProgressFile = new QuestProgressFile(uuid, plugin); + try { + File directory = new File(plugin.getDataFolder() + File.separator + "playerdata"); + if (directory.exists() && directory.isDirectory()) { + File file = new File(plugin.getDataFolder() + File.separator + "playerdata" + File.separator + uuid.toString() + ".yml"); + if (file.exists()) { + YamlConfiguration data = YamlConfiguration.loadConfiguration(file); + plugin.getQuestsLogger().debug("Player " + uuid + " has a valid quest progress file."); + if (data.isConfigurationSection("quest-progress")) { //Same job as "isSet" + it checks if is CfgSection + for (String id : data.getConfigurationSection("quest-progress").getKeys(false)) { + boolean started = data.getBoolean("quest-progress." + id + ".started"); + boolean completed = data.getBoolean("quest-progress." + id + ".completed"); + boolean completedBefore = data.getBoolean("quest-progress." + id + ".completed-before"); + long completionDate = data.getLong("quest-progress." + id + ".completion-date"); + + QuestProgress questProgress = new QuestProgress(plugin, id, completed, completedBefore, completionDate, uuid, started, true); + + if (data.isConfigurationSection("quest-progress." + id + ".task-progress")) { + for (String taskid : data.getConfigurationSection("quest-progress." + id + ".task-progress").getKeys(false)) { + boolean taskCompleted = data.getBoolean("quest-progress." + id + ".task-progress." + taskid + ".completed"); + Object taskProgression = data.get("quest-progress." + id + ".task-progress." + taskid + ".progress"); + + TaskProgress taskProgress = new TaskProgress(questProgress, taskid, taskProgression, uuid, taskCompleted, false); + questProgress.addTaskProgress(taskProgress); + } + } + + questProgressFile.addQuestProgress(questProgress); + } + } + } else { + plugin.getQuestsLogger().debug("Player " + uuid + " does not have a quest progress file."); + } + } + } catch (Exception ex) { + plugin.getQuestsLogger().severe("Failed to load player: " + uuid + "! This WILL cause errors."); + ex.printStackTrace(); + // fuck + } finally { + unlock(uuid); + } + + return questProgressFile; + } + + public void saveProgressFile(UUID uuid, QuestProgressFile questProgressFile) { + lock(uuid); + try { + List<QuestProgress> questProgressValues = new ArrayList<>(questProgressFile.getAllQuestProgress()); + File directory = new File(plugin.getDataFolder() + File.separator + "playerdata"); + if (!directory.exists() && !directory.isDirectory()) { + directory.mkdirs(); + } + + File file = new File(plugin.getDataFolder() + File.separator + "playerdata" + File.separator + uuid.toString() + ".yml"); + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + YamlConfiguration data = YamlConfiguration.loadConfiguration(file); + data.set("quest-progress", null); + for (QuestProgress questProgress : questProgressValues) { + data.set("quest-progress." + questProgress.getQuestId() + ".started", questProgress.isStarted()); + data.set("quest-progress." + questProgress.getQuestId() + ".completed", questProgress.isCompleted()); + data.set("quest-progress." + questProgress.getQuestId() + ".completed-before", questProgress.isCompletedBefore()); + data.set("quest-progress." + questProgress.getQuestId() + ".completion-date", questProgress.getCompletionDate()); + for (TaskProgress taskProgress : questProgress.getTaskProgress()) { + data.set("quest-progress." + questProgress.getQuestId() + ".task-progress." + taskProgress.getTaskId() + ".completed", taskProgress + .isCompleted()); + data.set("quest-progress." + questProgress.getQuestId() + ".task-progress." + taskProgress.getTaskId() + ".progress", taskProgress + .getProgress()); + } + } + + plugin.getQuestsLogger().debug("Writing player " + uuid + " to disk."); + try { + data.save(file); + } catch (IOException e) { + e.printStackTrace(); + } + plugin.getQuestsLogger().debug("Write of player " + uuid + " to disk complete."); + } finally { + unlock(uuid); + } + } +} |
