summaryrefslogtreecommitdiffstats
path: root/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/leonardobishop/quests/Quests.java4
-rw-r--r--src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java5
-rw-r--r--src/main/java/com/leonardobishop/quests/command/QuestsCommand.java10
-rw-r--r--src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java7
-rw-r--r--src/main/java/com/leonardobishop/quests/listener/PlayerLeaveListener.java8
-rw-r--r--src/main/java/com/leonardobishop/quests/player/QPlayerManager.java89
-rw-r--r--src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgress.java14
-rw-r--r--src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java62
-rw-r--r--src/main/java/com/leonardobishop/quests/player/questprogressfile/TaskProgress.java20
-rw-r--r--src/main/java/com/leonardobishop/quests/storage/StorageProvider.java12
-rw-r--r--src/main/java/com/leonardobishop/quests/storage/YamlStorageProvider.java128
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);
+ }
+ }
+}