aboutsummaryrefslogtreecommitdiffstats
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.java27
-rw-r--r--src/main/java/com/leonardobishop/quests/command/QuestsCommand.java12
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java204
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java8
-rw-r--r--src/main/java/com/leonardobishop/quests/player/QPlayer.java274
-rw-r--r--src/main/java/com/leonardobishop/quests/player/QPlayerManager.java29
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/controller/DailyQuestController.java186
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/controller/NormalQuestController.java239
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/controller/QuestController.java15
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java4
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java2
-rw-r--r--src/main/java/com/leonardobishop/quests/util/QuestCompleter.java (renamed from src/main/java/com/leonardobishop/quests/QuestCompleter.java)3
-rw-r--r--src/main/java/com/leonardobishop/quests/util/QuestMode.java8
-rw-r--r--src/main/java/com/leonardobishop/quests/util/QuestsAutosaveRunnable.java (renamed from src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java)3
-rw-r--r--src/main/java/com/leonardobishop/quests/util/QuestsConfigLoader.java (renamed from src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java)18
-rw-r--r--src/main/java/com/leonardobishop/quests/util/QuestsLogger.java (renamed from src/main/java/com/leonardobishop/quests/QuestsLogger.java)4
50 files changed, 709 insertions, 395 deletions
diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java
index 6308f9de..074e6e9b 100644
--- a/src/main/java/com/leonardobishop/quests/Quests.java
+++ b/src/main/java/com/leonardobishop/quests/Quests.java
@@ -20,6 +20,7 @@ import com.leonardobishop.quests.hook.title.Title_Other;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.QPlayerManager;
import com.leonardobishop.quests.quest.QuestManager;
+import com.leonardobishop.quests.quest.controller.NormalQuestController;
import com.leonardobishop.quests.quest.tasktype.TaskType;
import com.leonardobishop.quests.quest.tasktype.TaskTypeManager;
import com.leonardobishop.quests.quest.tasktype.type.BreedingTaskType;
@@ -59,6 +60,11 @@ import com.leonardobishop.quests.quest.tasktype.type.dependent.ShopGUIPlusSellCe
import com.leonardobishop.quests.quest.tasktype.type.dependent.uSkyBlockLevelType;
import com.leonardobishop.quests.updater.Updater;
import com.leonardobishop.quests.util.Messages;
+import com.leonardobishop.quests.util.QuestCompleter;
+import com.leonardobishop.quests.util.QuestMode;
+import com.leonardobishop.quests.util.QuestsAutosaveRunnable;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsLogger;
import org.bstats.bukkit.MetricsLite;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
@@ -107,6 +113,7 @@ public class Quests extends JavaPlugin {
private boolean brokenConfig = false;
private BukkitTask questAutosaveTask;
private BukkitTask questQueuePollTask;
+ private QuestMode questMode;
public static Quests get() {
return instance;
@@ -148,6 +155,14 @@ public class Quests extends JavaPlugin {
return menuController;
}
+ public QuestMode getQuestMode() {
+ return questMode;
+ }
+
+ protected void setQuestMode(QuestMode questMode) {
+ this.questMode = questMode;
+ }
+
public String convertToFormat(long m) { //seconds please
long hours = m / 3600;
long minutes = (m % 3600) / 60;
@@ -162,6 +177,7 @@ public class Quests extends JavaPlugin {
@Override
public void onEnable() {
instance = this;
+ questMode = QuestMode.NORMAL;
questsLogger = new QuestsLogger(this, QuestsLogger.LoggingLevel.INFO);
questCompleter = new QuestCompleter(this);
@@ -312,6 +328,17 @@ public class Quests extends JavaPlugin {
questsConfigLoader.loadConfig();
+ switch (this.questMode) {
+// TODO
+// case DAILY:
+// qPlayerManager.setActiveQuestController(new DailyQuestController(this));
+// break;
+ default:
+ case NORMAL:
+ qPlayerManager.setActiveQuestController(new NormalQuestController(this));
+ break;
+ }
+
long autosaveInterval = 12000;
if (!isBrokenConfig()) {
autosaveInterval = this.getConfig().getLong("options.performance-tweaking.quest-autosave-interval", 12000);
diff --git a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java b/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java
index 8113fe05..0906b3c9 100644
--- a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java
+++ b/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java
@@ -1,7 +1,7 @@
package com.leonardobishop.quests.command;
import com.leonardobishop.quests.Quests;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.enums.QuestStartResult;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile;
@@ -22,15 +22,6 @@ import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.FileVisitResult;
-import java.nio.file.FileVisitor;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.SimpleFileVisitor;
-import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -126,6 +117,7 @@ public class QuestsCommand implements TabExecutor {
sender.sendMessage(ChatColor.DARK_GRAY + "View info using /q a types [type].");
return true;
} else if (args[1].equalsIgnoreCase("info")) {
+ sender.sendMessage(ChatColor.RED + "Quest mode: " + plugin.getQuestMode().toString());
sender.sendMessage(ChatColor.GRAY + "Loaded quests:");
for (Quest quest : plugin.getQuestManager().getQuests().values()) {
sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + quest.getId() + ChatColor.GRAY + " [" + quest.getTasks().size() + " tasks]");
diff --git a/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java b/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java
index a89765e4..0d6080cd 100644
--- a/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java
+++ b/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java
@@ -1,106 +1,98 @@
-//package com.leonardobishop.quests.menu;
-//
-//import com.leonardobishop.quests.util.Options;
-//import com.leonardobishop.quests.player.QPlayer;
-//import com.leonardobishop.quests.quests.Quest;
-//import org.bukkit.Bukkit;
-//import org.bukkit.inventory.Inventory;
-//
-//import java.util.HashMap;
-//import java.util.List;
-//
-//public class QMenuDaily implements QMenu {
-//
-// private final HashMap<Integer, String> slotsToQuestIds = new HashMap<>();
-// private int backButtonLocation = -1;
-// private boolean backButtonEnabled = true;
-// private final QMenuCategory superMenu;
-// private String categoryName;
-// private final int pageSize = 45;
-// private final QPlayer owner;
-//
-// public QMenuDaily(QPlayer owner, QMenuCategory superMenu) {
-// this.owner = owner;
-// this.superMenu = superMenu;
-// }
-//
-// public void populate(List<Quest> quests) {
-// int slot = 11;
-// for (Quest quest : quests) {
-// slotsToQuestIds.put(slot, quest.getId());
-// slot++;
-// if (slot == 16) {
-// break;
-// }
-// }
-// }
-//
-// @Override
-// public HashMap<Integer, String> getSlotsToMenu() {
-// return slotsToQuestIds;
-// }
-//
-// @Override
-// public QPlayer getOwner() {
-// return owner;
-// }
-//
-// public String getCategoryName() {
-// return categoryName;
-// }
-//
-// public Inventory toInventory(int page) {
-// int pageMin = pageSize * (page - 1);
-// int pageMax = pageSize * page;
-// String title = Options.GUITITLE_DAILY_QUESTS.toString();
-//
-// // Inventory inventory = Bukkit.createInventory(null, 27, title);
-//
-// //TODO daily quests
-//
-//// int invSlot = 11;
-//// for (int pointer = pageMin; pointer < pageMax; pointer++) {
-//// if (slotsToQuestIds.containsKey(pointer)) {
-//// Quest quest = Quests.getQuestManager().getQuestById(slotsToQuestIds.get(pointer));
-//// QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest);
-//// long cooldown = owner.getQuestProgressFile().getCooldownFor(quest);
-//// if (!owner.getQuestProgressFile().hasMetRequirements(quest)) {
-//// List<String> quests = new ArrayList<>();
-//// for (String requirement : quest.getRequirements()) {
-//// quests.add(Quests.getQuestManager().getQuestById(requirement).getDisplayNameStripped());
-//// }
-//// Map<String, String> placeholders = new HashMap<>();
-//// placeholders.put("{quest}", quest.getDisplayNameStripped());
-//// placeholders.put("{requirements}", String.join(", ", quests));
-//// ItemStack is = replaceItemStack(Items.QUEST_LOCKED.getItem(), placeholders);
-//// inventory.setItem(invSlot, is);
-//// } else if (!quest.isRepeatable() && questProgress.isCompletedBefore()) {
-//// Map<String, String> placeholders = new HashMap<>();
-//// placeholders.put("{quest}", quest.getDisplayNameStripped());
-//// ItemStack is = replaceItemStack(Items.QUEST_COMPLETED.getItem(), placeholders);
-//// inventory.setItem(invSlot, is);
-//// } else if (cooldown > 0) {
-//// Map<String, String> placeholders = new HashMap<>();
-//// placeholders.put("{time}", Quests.convertToFormat(TimeUnit.MINUTES.convert(cooldown, TimeUnit.MILLISECONDS)));
-//// placeholders.put("{quest}", quest.getDisplayNameStripped());
-//// ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders);
-//// inventory.setItem(invSlot, is);
-//// } else {
-//// inventory.setItem(invSlot, Quests.getQuestManager().getQuestById(quest.getId()).getDisplayItem().toItemStack(questProgress));
-//// }
-//// }
-//// invSlot++;
-//// }
-//// return inventory;
-// return Bukkit.createInventory(null, 27, title);
-// }
-//
-// //Implement too
-// public QMenuCategory getSuperMenu() {
-// return this.superMenu;
-// }
-//
-// public int getPageSize() {
-// return this.pageSize;
-// }
-//}
+package com.leonardobishop.quests.menu;
+
+import com.leonardobishop.quests.Quests;
+import com.leonardobishop.quests.api.enums.QuestStartResult;
+import com.leonardobishop.quests.listener.MenuController;
+import com.leonardobishop.quests.menu.element.MenuElement;
+import com.leonardobishop.quests.menu.element.QuestMenuElement;
+import com.leonardobishop.quests.player.QPlayer;
+import com.leonardobishop.quests.quest.Quest;
+import com.leonardobishop.quests.quest.controller.DailyQuestController;
+import com.leonardobishop.quests.quest.controller.QuestController;
+import com.leonardobishop.quests.util.Items;
+import com.leonardobishop.quests.util.Options;
+import org.bukkit.Bukkit;
+import org.bukkit.event.inventory.ClickType;
+import org.bukkit.event.inventory.InventoryClickEvent;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Represents a cancellation confirmation menu for a specific quest.
+ */
+public class DailyQMenu implements QMenu {
+
+ private final Map<Integer, MenuElement> menuElements = new HashMap<>();
+ private final Quests plugin;
+ private final QPlayer owner;
+
+ public DailyQMenu(Quests plugin, QPlayer owner) {
+ this.plugin = plugin;
+ this.owner = owner;
+ }
+
+ @Override
+ public QPlayer getOwner() {
+ return owner;
+ }
+
+ public void populate() {
+ if (!(owner.getQuestController() instanceof DailyQuestController)) {
+ return;
+ }
+ DailyQuestController dailyQuestController = (DailyQuestController) owner.getQuestController();
+ List<String> quests = dailyQuestController.getQuests();
+ for (int i = 0; i < quests.size(); i++) {
+ menuElements.put(11 + i, new QuestMenuElement(plugin, owner, quests.get(i)));
+ }
+ }
+
+ public Inventory toInventory(int page) {
+ String title = Options.color(Options.GUITITLE_DAILY_QUESTS.getStringValue());
+
+ ItemStack background = Items.QUEST_CANCEL_BACKGROUND.getItem();
+ ItemMeta backgroundMeta = background.getItemMeta();
+ backgroundMeta.setDisplayName(" ");
+ background.setItemMeta(backgroundMeta);
+
+ Inventory inventory = Bukkit.createInventory(null, 27, title);
+
+ for (int i = 0; i < inventory.getSize(); i++) {
+ inventory.setItem(i, background);
+ }
+
+ for (int pointer = 0; pointer < 27; pointer++) {
+ if (menuElements.containsKey(pointer)) {
+ inventory.setItem(pointer, menuElements.get(pointer).asItemStack());
+ }
+ }
+
+ return inventory;
+ }
+
+ @Override
+ public void handleClick(InventoryClickEvent event, MenuController controller) {
+ if (menuElements.containsKey(event.getSlot())) {
+ MenuElement menuElement = menuElements.get(event.getSlot());
+ if (menuElement instanceof QuestMenuElement) {
+ QuestMenuElement questMenuElement = (QuestMenuElement) menuElement;
+ Quest quest = plugin.getQuestManager().getQuestById(questMenuElement.getQuestId());
+ if (event.getClick() == ClickType.LEFT) {
+ if (Options.QUEST_AUTOSTART.getBooleanValue()) return;
+ if (owner.startQuest(quest) == QuestStartResult.QUEST_SUCCESS) {
+ event.getWhoClicked().closeInventory(); //TODO Option to keep the menu open
+ }
+ } else if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) {
+ MenuUtil.handleMiddleClick(this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller);
+ }
+ }
+ }
+ }
+
+
+}
diff --git a/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java
index 96c358a4..6d13c0c5 100644
--- a/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java
+++ b/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java
@@ -1,6 +1,7 @@
package com.leonardobishop.quests.menu.element;
import com.leonardobishop.quests.Quests;
+import com.leonardobishop.quests.api.enums.QuestStartResult;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
import com.leonardobishop.quests.quest.Quest;
@@ -42,8 +43,9 @@ public class QuestMenuElement extends MenuElement {
public ItemStack asItemStack() {
Quest quest = plugin.getQuestManager().getQuestById(questId);
QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest);
+ QuestStartResult status = owner.canStartQuest(quest);
long cooldown = owner.getQuestProgressFile().getCooldownFor(quest);
- if (!owner.getQuestProgressFile().hasMetRequirements(quest)) {
+ if (status == QuestStartResult.QUEST_LOCKED) {
List<String> quests = new ArrayList<>();
for (String requirement : quest.getRequirements()) {
Quest requirementQuest = Quests.get().getQuestManager().getQuestById(requirement);
@@ -57,12 +59,12 @@ public class QuestMenuElement extends MenuElement {
placeholders.put("{requirements}", String.join(", ", quests));
ItemStack is = replaceItemStack(Items.QUEST_LOCKED.getItem(), placeholders);
return is;
- } else if (!quest.isRepeatable() && questProgress.isCompletedBefore()) {
+ } else if (status == QuestStartResult.QUEST_ALREADY_COMPLETED) {
Map<String, String> placeholders = new HashMap<>();
placeholders.put("{quest}", quest.getDisplayNameStripped());
ItemStack is = replaceItemStack(Items.QUEST_COMPLETED.getItem(), placeholders);
return is;
- } else if (quest.isPermissionRequired() && !Bukkit.getPlayer(owner.getPlayerUUID()).hasPermission("quests.quest." + quest.getId())) {
+ } else if (status == QuestStartResult.QUEST_NO_PERMISSION) {
Map<String, String> placeholders = new HashMap<>();
placeholders.put("{quest}", quest.getDisplayNameStripped());
ItemStack is = replaceItemStack(Items.QUEST_PERMISSION.getItem(), placeholders);
diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayer.java b/src/main/java/com/leonardobishop/quests/player/QPlayer.java
index 44472217..e8dc3306 100644
--- a/src/main/java/com/leonardobishop/quests/player/QPlayer.java
+++ b/src/main/java/com/leonardobishop/quests/player/QPlayer.java
@@ -1,52 +1,48 @@
package com.leonardobishop.quests.player;
+import com.leonardobishop.quests.util.QuestMode;
import com.leonardobishop.quests.Quests;
-import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.api.enums.QuestStartResult;
-import com.leonardobishop.quests.api.events.PlayerCancelQuestEvent;
import com.leonardobishop.quests.api.events.PlayerFinishQuestEvent;
-import com.leonardobishop.quests.api.events.PlayerStartQuestEvent;
import com.leonardobishop.quests.api.events.PlayerStartTrackQuestEvent;
import com.leonardobishop.quests.api.events.PlayerStopTrackQuestEvent;
-import com.leonardobishop.quests.api.events.PreStartQuestEvent;
import com.leonardobishop.quests.menu.CategoryQMenu;
+import com.leonardobishop.quests.menu.DailyQMenu;
import com.leonardobishop.quests.menu.QuestQMenu;
import com.leonardobishop.quests.menu.QuestSortWrapper;
import com.leonardobishop.quests.menu.StartedQMenu;
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.quest.Category;
import com.leonardobishop.quests.quest.Quest;
-import com.leonardobishop.quests.quest.Task;
+import com.leonardobishop.quests.quest.controller.QuestController;
import com.leonardobishop.quests.util.Messages;
import com.leonardobishop.quests.util.Options;
import org.bukkit.Bukkit;
-import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import java.util.concurrent.TimeUnit;
/**
* Represents a player.
*/
public class QPlayer {
+ private final Quests plugin;
private final UUID uuid;
private final QPlayerPreferences playerPreferences;
private final QuestProgressFile questProgressFile;
- private final Quests plugin;
+ private QuestController questController;
- public QPlayer(UUID uuid, QuestProgressFile questProgressFile, QPlayerPreferences playerPreferences, Quests plugin) {
+ public QPlayer(Quests plugin, UUID uuid, QPlayerPreferences playerPreferences, QuestProgressFile questProgressFile, QuestController questController) {
+ this.plugin = plugin;
this.uuid = uuid;
this.playerPreferences = playerPreferences;
this.questProgressFile = questProgressFile;
- this.plugin = plugin;
+ this.questController = questController;
}
public UUID getPlayerUUID() {
@@ -64,50 +60,7 @@ public class QPlayer {
* @return true (always)
*/
public boolean completeQuest(Quest quest) {
- QuestProgress questProgress = questProgressFile.getQuestProgress(quest);
- questProgress.setStarted(false);
- for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
- taskProgress.setCompleted(false);
- taskProgress.setProgress(null);
- }
- questProgress.setCompleted(true);
- questProgress.setCompletedBefore(true);
- questProgress.setCompletionDate(System.currentTimeMillis());
- if (Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue() && !(quest.isRepeatable() && !quest.isCooldownEnabled())) {
- trackQuest(null);
- }
- Player player = Bukkit.getPlayer(uuid);
- if (player != null) {
- String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", quest.getDisplayNameStripped());
- // PlayerFinishQuestEvent -- start
- PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, this, questProgress, questFinishMessage);
- Bukkit.getPluginManager().callEvent(questFinishEvent);
- // PlayerFinishQuestEvent -- end
- Bukkit.getServer().getScheduler().runTask(plugin, () -> {
- for (String s : quest.getRewards()) {
- Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s.replace("{player}", player.getName())); //TODO PlaceholderAPI support
- }
- });
- if (questFinishEvent.getQuestFinishMessage() != null)
- player.sendMessage(questFinishEvent.getQuestFinishMessage());
- if (Options.TITLES_ENABLED.getBooleanValue()) {
- plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest
- .getDisplayNameStripped()), Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", quest
- .getDisplayNameStripped()));
- }
- for (String s : quest.getRewardString()) {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', s));
- }
- }
- if ((Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue() && !(quest.isRepeatable() && !quest.isCooldownEnabled()))
- || (!Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue())) {
- Quest nextQuest;
- if (questProgressFile.getStartedQuests().size() > 0) {
- nextQuest = questProgressFile.getStartedQuests().get(0);
- trackQuest(nextQuest);
- }
- }
- return true;
+ return questController.completeQuestForPlayer(this, quest);
}
/**
@@ -145,12 +98,7 @@ public class QPlayer {
* @return true if the quest is started or quest autostart is enabled and the quest is ready to start, false otherwise
*/
public boolean hasStartedQuest(Quest quest) {
- if (Options.QUEST_AUTOSTART.getBooleanValue()) {
- QuestStartResult response = canStartQuest(quest);
- return response == QuestStartResult.QUEST_SUCCESS || response == QuestStartResult.QUEST_ALREADY_STARTED;
- } else {
- return questProgressFile.hasQuestProgress(quest) && questProgressFile.getQuestProgress(quest).isStarted();
- }
+ return questController.hasPlayerStartedQuest(this, quest);
}
/**
@@ -163,82 +111,7 @@ public class QPlayer {
*/
// TODO PlaceholderAPI support
public QuestStartResult startQuest(Quest quest) {
- Player player = Bukkit.getPlayer(uuid);
- QuestStartResult code = canStartQuest(quest);
- if (player != null) {
- String questResultMessage = null;
- switch (code) {
- case QUEST_SUCCESS:
- // This one is hacky
- break;
- case QUEST_LIMIT_REACHED:
- questResultMessage = Messages.QUEST_START_LIMIT.getMessage().replace("{limit}", String.valueOf(Options.QUESTS_START_LIMIT.getIntValue()));
- break;
- case QUEST_ALREADY_COMPLETED:
- questResultMessage = Messages.QUEST_START_DISABLED.getMessage();
- break;
- case QUEST_COOLDOWN:
- long cooldown = questProgressFile.getCooldownFor(quest);
- questResultMessage = Messages.QUEST_START_COOLDOWN.getMessage().replace("{time}", String.valueOf(plugin.convertToFormat(TimeUnit.SECONDS.convert
- (cooldown, TimeUnit.MILLISECONDS))));
- break;
- case QUEST_LOCKED:
- questResultMessage = Messages.QUEST_START_LOCKED.getMessage();
- break;
- case QUEST_ALREADY_STARTED:
- questResultMessage = Messages.QUEST_START_STARTED.getMessage();
- break;
- case QUEST_NO_PERMISSION:
- questResultMessage = Messages.QUEST_START_PERMISSION.getMessage();
- break;
- case NO_PERMISSION_FOR_CATEGORY:
- questResultMessage = Messages.QUEST_CATEGORY_QUEST_PERMISSION.getMessage();
- break;
- }
- // PreStartQuestEvent -- start
- PreStartQuestEvent preStartQuestEvent = new PreStartQuestEvent(player, this, questResultMessage, code);
- Bukkit.getPluginManager().callEvent(preStartQuestEvent);
- // PreStartQuestEvent -- end
- if (preStartQuestEvent.getQuestResultMessage() != null && code != QuestStartResult.QUEST_SUCCESS)
- player.sendMessage(preStartQuestEvent.getQuestResultMessage());
- }
- if (code == QuestStartResult.QUEST_SUCCESS) {
- QuestProgress questProgress = questProgressFile.getQuestProgress(quest);
- questProgress.setStarted(true);
- for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
- taskProgress.setCompleted(false);
- taskProgress.setProgress(null);
- }
- if (Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue()) {
- trackQuest(quest);
- }
- questProgress.setCompleted(false);
- if (player != null) {
- String questStartMessage = Messages.QUEST_START.getMessage().replace("{quest}", quest.getDisplayNameStripped());
- // PlayerStartQuestEvent -- start
- PlayerStartQuestEvent questStartEvent = new PlayerStartQuestEvent(player, this, questProgress, questStartMessage);
- Bukkit.getPluginManager().callEvent(questStartEvent);
- // PlayerStartQuestEvent -- end
- if (questStartEvent.getQuestStartMessage() != null)
- player.sendMessage(questStartEvent.getQuestStartMessage()); //Don't send a message if the event message is null
- if (Options.TITLES_ENABLED.getBooleanValue()) {
- plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", quest
- .getDisplayNameStripped()), Messages.TITLE_QUEST_START_SUBTITLE.getMessage().replace("{quest}", quest
- .getDisplayNameStripped()));
- }
- for (String s : quest.getStartString()) {
- player.sendMessage(ChatColor.translateAlternateColorCodes('&', s));
- }
- }
- for (Task task : quest.getTasks()) {
- try {
- plugin.getTaskTypeManager().getTaskType(task.getType()).onStart(quest, task, uuid);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- return code;
+ return questController.startQuestForPlayer(this, quest);
}
/**
@@ -248,28 +121,7 @@ public class QPlayer {
* @return true if the quest was cancelled, false otherwise
*/
public boolean cancelQuest(Quest quest) {
- QuestProgress questProgress = questProgressFile.getQuestProgress(quest);
- Player player = Bukkit.getPlayer(uuid);
- if (!questProgress.isStarted()) {
- if (player != null) {
- player.sendMessage(Messages.QUEST_CANCEL_NOTSTARTED.getMessage());
- }
- return false;
- }
- questProgress.setStarted(false);
- for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
- taskProgress.setProgress(null);
- }
- if (player != null) {
- String questCancelMessage = Messages.QUEST_CANCEL.getMessage().replace("{quest}", quest.getDisplayNameStripped());
- // PlayerCancelQuestEvent -- start
- PlayerCancelQuestEvent questCancelEvent = new PlayerCancelQuestEvent(player, this, questProgress, questCancelMessage);
- Bukkit.getPluginManager().callEvent(questCancelEvent);
- // PlayerCancelQuestEvent -- end
- if (questCancelEvent.getQuestCancelMessage() != null)
- player.sendMessage(questCancelEvent.getQuestCancelMessage());
- }
- return true;
+ return questController.cancelQuestForPlayer(this, quest);
}
/**
@@ -281,47 +133,7 @@ public class QPlayer {
* @return the quest start result
*/
public QuestStartResult canStartQuest(Quest quest) {
- Player p = Bukkit.getPlayer(uuid);
- if (questProgressFile.getStartedQuests().size() >= Options.QUESTS_START_LIMIT.getIntValue() && !Options.QUEST_AUTOSTART.getBooleanValue()) {
- return QuestStartResult.QUEST_LIMIT_REACHED;
- }
- QuestProgress questProgress = questProgressFile.getQuestProgress(quest);
- if (!quest.isRepeatable() && questProgress.isCompletedBefore()) {
- //if (playerUUID != null) {
- // ???
- //}
- return QuestStartResult.QUEST_ALREADY_COMPLETED;
- }
- long cooldown = questProgressFile.getCooldownFor(quest);
- if (cooldown > 0) {
- return QuestStartResult.QUEST_COOLDOWN;
- }
- if (!questProgressFile.hasMetRequirements(quest)) {
- return QuestStartResult.QUEST_LOCKED;
- }
- if (questProgress.isStarted()) {
- return QuestStartResult.QUEST_ALREADY_STARTED;
- }
- if (quest.isPermissionRequired()) {
- if (p != null) {
- if (!p.hasPermission("quests.quest." + quest.getId())) {
- return QuestStartResult.QUEST_NO_PERMISSION;
- }
- } else {
- return QuestStartResult.QUEST_NO_PERMISSION;
- }
- }
- if (quest.getCategoryId() != null && plugin.getQuestManager().getCategoryById(quest.getCategoryId()) != null && plugin.getQuestManager()
- .getCategoryById(quest.getCategoryId()).isPermissionRequired()) {
- if (p != null) {
- if (!p.hasPermission("quests.category." + quest.getCategoryId())) {
- return QuestStartResult.NO_PERMISSION_FOR_CATEGORY;
- }
- } else {
- return QuestStartResult.NO_PERMISSION_FOR_CATEGORY;
- }
- }
- return QuestStartResult.QUEST_SUCCESS;
+ return questController.canPlayerStartQuest(this, quest);
}
/**
@@ -381,34 +193,40 @@ public class QPlayer {
return;
}
- if (Options.CATEGORIES_ENABLED.getBooleanValue()) {
- CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, this);
- List<QuestQMenu> questMenus = new ArrayList<>();
- for (Category category : plugin.getQuestManager().getCategories()) {
- QuestQMenu questQMenu = new QuestQMenu(plugin, this, category.getId(), categoryQMenu);
- List<Quest> quests = new ArrayList<>();
- for (String questid : category.getRegisteredQuestIds()) {
- Quest quest = plugin.getQuestManager().getQuestById(questid);
- if (quest != null) {
- quests.add(quest);
+ if (plugin.getQuestMode() == QuestMode.NORMAL) {
+ if (Options.CATEGORIES_ENABLED.getBooleanValue()) {
+ CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, this);
+ List<QuestQMenu> questMenus = new ArrayList<>();
+ for (Category category : plugin.getQuestManager().getCategories()) {
+ QuestQMenu questQMenu = new QuestQMenu(plugin, this, category.getId(), categoryQMenu);
+ List<Quest> quests = new ArrayList<>();
+ for (String questid : category.getRegisteredQuestIds()) {
+ Quest quest = plugin.getQuestManager().getQuestById(questid);
+ if (quest != null) {
+ quests.add(quest);
+ }
}
+ questQMenu.populate(quests);
+ questMenus.add(questQMenu);
+ }
+ categoryQMenu.populate(questMenus);
+
+ plugin.getMenuController().openMenu(player, categoryQMenu, 1);
+ } else {
+ QuestQMenu questQMenu = new QuestQMenu(plugin, this, "", null);
+ List<Quest> quests = new ArrayList<>();
+ for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) {
+ quests.add(entry.getValue());
}
questQMenu.populate(quests);
- questMenus.add(questQMenu);
- }
- categoryQMenu.populate(questMenus);
+ questQMenu.setBackButtonEnabled(false);
- plugin.getMenuController().openMenu(player, categoryQMenu, 1);
- } else {
- QuestQMenu questQMenu = new QuestQMenu(plugin, this, "", null);
- List<Quest> quests = new ArrayList<>();
- for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) {
- quests.add(entry.getValue());
+ plugin.getMenuController().openMenu(player, questQMenu, 1);
}
- questQMenu.populate(quests);
- questQMenu.setBackButtonEnabled(false);
-
- plugin.getMenuController().openMenu(player, questQMenu, 1);
+ } else {
+ DailyQMenu dailyQMenu = new DailyQMenu(plugin, this);
+ dailyQMenu.populate();
+ plugin.getMenuController().openMenu(player, dailyQMenu, 1);
}
}
@@ -439,6 +257,14 @@ public class QPlayer {
return playerPreferences;
}
+ public QuestController getQuestController() {
+ return questController;
+ }
+
+ public void setQuestController(QuestController questController) {
+ this.questController = questController;
+ }
+
@Override //Used by java GC
public boolean equals(Object o) {
if (!(o instanceof QPlayer)) return false;
diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java
index 41c704e3..182b5666 100644
--- a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java
+++ b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java
@@ -1,19 +1,16 @@
package com.leonardobishop.quests.player;
import com.leonardobishop.quests.Quests;
-import com.leonardobishop.quests.QuestsLogger;
+import com.leonardobishop.quests.util.QuestsLogger;
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.quest.controller.NormalQuestController;
+import com.leonardobishop.quests.quest.controller.QuestController;
import com.leonardobishop.quests.storage.MySqlStorageProvider;
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;
-import java.io.File;
import java.util.Collection;
import java.util.Map;
import java.util.UUID;
@@ -21,8 +18,11 @@ import java.util.concurrent.ConcurrentHashMap;
public class QPlayerManager {
+ private final Map<UUID, QPlayer> qPlayers = new ConcurrentHashMap<>();
private final Quests plugin;
private StorageProvider storageProvider;
+ private QuestController activeQuestController;
+
public QPlayerManager(Quests plugin) {
this.plugin = plugin;
@@ -41,9 +41,9 @@ public class QPlayerManager {
} catch (Exception ignored) {
plugin.getQuestsLogger().severe("An error occurred initialising the storage provider.");
}
- }
- private final Map<UUID, QPlayer> qPlayers = new ConcurrentHashMap<>();
+ this.activeQuestController = new NormalQuestController(plugin);
+ }
/**
* Gets the QPlayer from a given UUID.
@@ -153,7 +153,7 @@ public class QPlayerManager {
qPlayers.computeIfAbsent(uuid, s -> {
QuestProgressFile questProgressFile = storageProvider.loadProgressFile(uuid);
if (questProgressFile == null) return null;
- return new QPlayer(uuid, questProgressFile, new QPlayerPreferences(null), plugin);
+ return new QPlayer(plugin, uuid, new QPlayerPreferences(null), questProgressFile, activeQuestController);
});
}
@@ -165,4 +165,15 @@ public class QPlayerManager {
public StorageProvider getStorageProvider() {
return storageProvider;
}
+
+ public QuestController getActiveQuestController() {
+ return activeQuestController;
+ }
+
+ public void setActiveQuestController(QuestController activeQuestController) {
+ this.activeQuestController = activeQuestController;
+ for (QPlayer qPlayer : qPlayers.values()) {
+ qPlayer.setQuestController(activeQuestController);
+ }
+ }
}
diff --git a/src/main/java/com/leonardobishop/quests/quest/controller/DailyQuestController.java b/src/main/java/com/leonardobishop/quests/quest/controller/DailyQuestController.java
new file mode 100644
index 00000000..d2ffd192
--- /dev/null
+++ b/src/main/java/com/leonardobishop/quests/quest/controller/DailyQuestController.java
@@ -0,0 +1,186 @@
+package com.leonardobishop.quests.quest.controller;
+
+import com.leonardobishop.quests.Quests;
+import com.leonardobishop.quests.api.enums.QuestStartResult;
+import com.leonardobishop.quests.api.events.PlayerFinishQuestEvent;
+import com.leonardobishop.quests.player.QPlayer;
+import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
+import com.leonardobishop.quests.player.questprogressfile.TaskProgress;
+import com.leonardobishop.quests.quest.Quest;
+import com.leonardobishop.quests.util.Messages;
+import com.leonardobishop.quests.util.Options;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+import org.bukkit.scheduler.BukkitRunnable;
+import org.bukkit.scheduler.BukkitTask;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.stream.Collectors;
+
+//TODO finish this
+public class DailyQuestController implements QuestController {
+
+ private int refreshTaskId = -1;
+ private long refreshTime;
+ private long startTime;
+ private Quests plugin;
+ private Random random;
+ private List<String> quests;
+
+ public DailyQuestController(Quests plugin) {
+ this.plugin = plugin;
+ refreshDailyQuests();
+ scheduleNewTask();
+ }
+
+ public void cancel() {
+ Bukkit.getScheduler().cancelTask(refreshTaskId);
+ }
+
+ public List<String> getQuests() {
+ return quests;
+ }
+
+ private void scheduleNewTask() {
+ long diff = refreshTime - System.currentTimeMillis();
+ BukkitTask refreshTask;
+ if (diff <= 10000) { //10 sec
+ refreshTask = new DailyQuestRefreshTask(true).runTaskTimer(plugin, 1L, 1L);
+ plugin.getQuestsLogger().debug("DailyQuestRefreshTask set repeating (diff=" + diff + ")");
+ } else {
+ long sleepTime = diff >> 6;
+ plugin.getQuestsLogger().debug("DailyQuestRefreshTask slept for " + sleepTime + " ticks (diff=" + diff + ")");
+ refreshTask = new DailyQuestRefreshTask(false).runTaskLater(plugin, sleepTime);
+ }
+ refreshTaskId = refreshTask.getTaskId();
+ }
+
+ private void refreshDailyQuests() {
+// refreshTime = ((System.currentTimeMillis() / (86400000)) + 1) * 86400000;
+ refreshTime = ((System.currentTimeMillis() / (300000)) + 1) * 300000;
+ startTime = (System.currentTimeMillis() / (300000)) * 300000;
+ random = new Random(refreshTime);
+ quests = new ArrayList<>();
+
+ List<String> questIds = new ArrayList<>(plugin.getQuestManager().getQuests().keySet());
+ for (int i = 0; i < 5; i++) {
+ int randInt = random.nextInt(questIds.size());
+ quests.add(questIds.get(randInt));
+ questIds = questIds.stream().filter(s -> !quests.contains(s)).collect(Collectors.toList());
+ }
+ }
+
+ @Override
+ public QuestStartResult startQuestForPlayer(QPlayer qPlayer, Quest quest) {
+ if (quests.contains(quest.getId())) {
+ return QuestStartResult.QUEST_ALREADY_STARTED;
+ } else {
+ return QuestStartResult.QUEST_LIMIT_REACHED;
+ }
+ }
+
+ @Override
+ public QuestStartResult canPlayerStartQuest(QPlayer qPlayer, Quest quest) {
+ if (!quests.contains(quest.getId())) return QuestStartResult.OTHER;
+ long completionDate = qPlayer.getQuestProgressFile().getQuestProgress(quest).getCompletionDate();
+ if (Options.QUEST_AUTOSTART.getBooleanValue()) {
+ if (completionDate > startTime && completionDate <= refreshTime) {
+ return QuestStartResult.QUEST_ALREADY_COMPLETED;
+ }
+ } else {
+ if (qPlayer.getQuestProgressFile().hasQuestProgress(quest)) {
+ QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest);
+ if (questProgress.isStarted() && completionDate > startTime && completionDate <= refreshTime) {
+ return QuestStartResult.QUEST_ALREADY_STARTED;
+ }
+ }
+ }
+ return QuestStartResult.QUEST_SUCCESS;
+ }
+
+ @Override
+ public boolean completeQuestForPlayer(QPlayer qPlayer, Quest quest) {
+ QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest);
+ questProgress.setStarted(false);
+ for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
+ taskProgress.setCompleted(false);
+ taskProgress.setProgress(null);
+ }
+ questProgress.setCompleted(true);
+ questProgress.setCompletedBefore(true);
+ questProgress.setCompletionDate(System.currentTimeMillis());
+
+ boolean trackedReset = quest.getId().equals(qPlayer.getPlayerPreferences().getTrackedQuestId());
+ if (trackedReset) {
+ qPlayer.trackQuest(null);
+ }
+
+ Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID());
+ if (player != null) {
+ String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", quest.getDisplayNameStripped());
+ // PlayerFinishQuestEvent -- start
+ PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, qPlayer, questProgress, questFinishMessage);
+ Bukkit.getPluginManager().callEvent(questFinishEvent);
+ // PlayerFinishQuestEvent -- end
+ Bukkit.getServer().getScheduler().runTask(plugin, () -> {
+ for (String s : quest.getRewards()) {
+ Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s.replace("{player}", player.getName())); //TODO PlaceholderAPI support
+ }
+ });
+ if (questFinishEvent.getQuestFinishMessage() != null)
+ player.sendMessage(questFinishEvent.getQuestFinishMessage());
+ if (Options.TITLES_ENABLED.getBooleanValue()) {
+ plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest
+ .getDisplayNameStripped()), Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", quest
+ .getDisplayNameStripped()));
+ }
+ for (String s : quest.getRewardString()) {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', s));
+ }
+ }
+ if (Options.QUEST_AUTOTRACK.getBooleanValue() && trackedReset) {
+ for (String s : quests) {
+ Quest nextQuest = plugin.getQuestManager().getQuestById(s);
+ if (nextQuest != null && canPlayerStartQuest(qPlayer, nextQuest) == QuestStartResult.QUEST_SUCCESS) {
+ qPlayer.trackQuest(nextQuest);
+ break;
+ }
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean hasPlayerStartedQuest(QPlayer qPlayer, Quest quest) {
+ return canPlayerStartQuest(qPlayer, quest) == QuestStartResult.QUEST_SUCCESS;
+ }
+
+ @Override
+ public boolean cancelQuestForPlayer(QPlayer qPlayer, Quest quest) {
+ return false;
+ }
+
+ public class DailyQuestRefreshTask extends BukkitRunnable {
+
+ private final boolean repeating;
+
+ public DailyQuestRefreshTask(boolean repeating) {
+ this.repeating = repeating;
+ }
+
+ @Override
+ public void run() {
+ if (System.currentTimeMillis() >= refreshTime) {
+ this.cancel();
+ refreshDailyQuests();
+ } else {
+ if (repeating) return;
+ this.cancel();
+ }
+ scheduleNewTask();
+ }
+ }
+}
diff --git a/src/main/java/com/leonardobishop/quests/quest/controller/NormalQuestController.java b/src/main/java/com/leonardobishop/quests/quest/controller/NormalQuestController.java
new file mode 100644
index 00000000..055bbf97
--- /dev/null
+++ b/src/main/java/com/leonardobishop/quests/quest/controller/NormalQuestController.java
@@ -0,0 +1,239 @@
+package com.leonardobishop.quests.quest.controller;
+
+import com.leonardobishop.quests.Quests;
+import com.leonardobishop.quests.api.enums.QuestStartResult;
+import com.leonardobishop.quests.api.events.PlayerCancelQuestEvent;
+import com.leonardobishop.quests.api.events.PlayerFinishQuestEvent;
+import com.leonardobishop.quests.api.events.PlayerStartQuestEvent;
+import com.leonardobishop.quests.api.events.PreStartQuestEvent;
+import com.leonardobishop.quests.player.QPlayer;
+import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
+import com.leonardobishop.quests.player.questprogressfile.TaskProgress;
+import com.leonardobishop.quests.quest.Quest;
+import com.leonardobishop.quests.quest.Task;
+import com.leonardobishop.quests.util.Messages;
+import com.leonardobishop.quests.util.Options;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.entity.Player;
+
+import java.util.concurrent.TimeUnit;
+
+public class NormalQuestController implements QuestController {
+
+ private final Quests plugin;
+
+ public NormalQuestController(Quests plugin) {
+ this.plugin = plugin;
+ }
+
+ @Override
+ public QuestStartResult startQuestForPlayer(QPlayer qPlayer, Quest quest) {
+ Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID());
+ QuestStartResult code = canPlayerStartQuest(qPlayer, quest);
+ if (player != null) {
+ String questResultMessage = null;
+ switch (code) {
+ case QUEST_SUCCESS:
+ // This one is hacky
+ break;
+ case QUEST_LIMIT_REACHED:
+ questResultMessage = Messages.QUEST_START_LIMIT.getMessage().replace("{limit}", String.valueOf(Options.QUESTS_START_LIMIT.getIntValue()));
+ break;
+ case QUEST_ALREADY_COMPLETED:
+ questResultMessage = Messages.QUEST_START_DISABLED.getMessage();
+ break;
+ case QUEST_COOLDOWN:
+ long cooldown = qPlayer.getQuestProgressFile().getCooldownFor(quest);
+ questResultMessage = Messages.QUEST_START_COOLDOWN.getMessage().replace("{time}", String.valueOf(plugin.convertToFormat(TimeUnit.SECONDS.convert
+ (cooldown, TimeUnit.MILLISECONDS))));
+ break;
+ case QUEST_LOCKED:
+ questResultMessage = Messages.QUEST_START_LOCKED.getMessage();
+ break;
+ case QUEST_ALREADY_STARTED:
+ questResultMessage = Messages.QUEST_START_STARTED.getMessage();
+ break;
+ case QUEST_NO_PERMISSION:
+ questResultMessage = Messages.QUEST_START_PERMISSION.getMessage();
+ break;
+ case NO_PERMISSION_FOR_CATEGORY:
+ questResultMessage = Messages.QUEST_CATEGORY_QUEST_PERMISSION.getMessage();
+ break;
+ }
+ // PreStartQuestEvent -- start
+ PreStartQuestEvent preStartQuestEvent = new PreStartQuestEvent(player, qPlayer, questResultMessage, code);
+ Bukkit.getPluginManager().callEvent(preStartQuestEvent);
+ // PreStartQuestEvent -- end
+ if (preStartQuestEvent.getQuestResultMessage() != null && code != QuestStartResult.QUEST_SUCCESS)
+ player.sendMessage(preStartQuestEvent.getQuestResultMessage());
+ }
+ if (code == QuestStartResult.QUEST_SUCCESS) {
+ QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest);
+ questProgress.setStarted(true);
+ for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
+ taskProgress.setCompleted(false);
+ taskProgress.setProgress(null);
+ }
+ if (Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue()) {
+ qPlayer.trackQuest(quest);
+ }
+ questProgress.setCompleted(false);
+ if (player != null) {
+ String questStartMessage = Messages.QUEST_START.getMessage().replace("{quest}", quest.getDisplayNameStripped());
+ // PlayerStartQuestEvent -- start
+ PlayerStartQuestEvent questStartEvent = new PlayerStartQuestEvent(player, qPlayer, questProgress, questStartMessage);
+ Bukkit.getPluginManager().callEvent(questStartEvent);
+ // PlayerStartQuestEvent -- end
+ if (questStartEvent.getQuestStartMessage() != null)
+ player.sendMessage(questStartEvent.getQuestStartMessage()); //Don't send a message if the event message is null
+ if (Options.TITLES_ENABLED.getBooleanValue()) {
+ plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", quest
+ .getDisplayNameStripped()), Messages.TITLE_QUEST_START_SUBTITLE.getMessage().replace("{quest}", quest
+ .getDisplayNameStripped()));
+ }
+ for (String s : quest.getStartString()) {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', s));
+ }
+ }
+ for (Task task : quest.getTasks()) {
+ try {
+ plugin.getTaskTypeManager().getTaskType(task.getType()).onStart(quest, task, qPlayer.getPlayerUUID());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return code;
+ }
+
+ @Override
+ public QuestStartResult canPlayerStartQuest(QPlayer qPlayer, Quest quest) {
+ Player p = Bukkit.getPlayer(qPlayer.getPlayerUUID());
+ if (qPlayer.getQuestProgressFile().getStartedQuests().size() >= Options.QUESTS_START_LIMIT.getIntValue() && !Options.QUEST_AUTOSTART.getBooleanValue()) {
+ return QuestStartResult.QUEST_LIMIT_REACHED;
+ }
+ QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest);
+ if (!quest.isRepeatable() && questProgress.isCompletedBefore()) {
+ //if (playerUUID != null) {
+ // ???
+ //}
+ return QuestStartResult.QUEST_ALREADY_COMPLETED;
+ }
+ long cooldown = qPlayer.getQuestProgressFile().getCooldownFor(quest);
+ if (cooldown > 0) {
+ return QuestStartResult.QUEST_COOLDOWN;
+ }
+ if (!qPlayer.getQuestProgressFile().hasMetRequirements(quest)) {
+ return QuestStartResult.QUEST_LOCKED;
+ }
+ if (questProgress.isStarted()) {
+ return QuestStartResult.QUEST_ALREADY_STARTED;
+ }
+ if (quest.isPermissionRequired()) {
+ if (p != null) {
+ if (!p.hasPermission("quests.quest." + quest.getId())) {
+ return QuestStartResult.QUEST_NO_PERMISSION;
+ }
+ } else {
+ return QuestStartResult.QUEST_NO_PERMISSION;
+ }
+ }
+ if (quest.getCategoryId() != null && plugin.getQuestManager().getCategoryById(quest.getCategoryId()) != null && plugin.getQuestManager()
+ .getCategoryById(quest.getCategoryId()).isPermissionRequired()) {
+ if (p != null) {
+ if (!p.hasPermission("quests.category." + quest.getCategoryId())) {
+ return QuestStartResult.NO_PERMISSION_FOR_CATEGORY;
+ }
+ } else {
+ return QuestStartResult.NO_PERMISSION_FOR_CATEGORY;
+ }
+ }
+ return QuestStartResult.QUEST_SUCCESS;
+ }
+
+ @Override
+ public boolean completeQuestForPlayer(QPlayer qPlayer, Quest quest) {
+ QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest);
+ questProgress.setStarted(false);
+ for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
+ taskProgress.setCompleted(false);
+ taskProgress.setProgress(null);
+ }
+ questProgress.setCompleted(true);
+ questProgress.setCompletedBefore(true);
+ questProgress.setCompletionDate(System.currentTimeMillis());
+ if (Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue() && !(quest.isRepeatable() && !quest.isCooldownEnabled())) {
+ qPlayer.trackQuest(null);
+ }
+ Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID());
+ if (player != null) {
+ String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", quest.getDisplayNameStripped());
+ // PlayerFinishQuestEvent -- start
+ PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, qPlayer, questProgress, questFinishMessage);
+ Bukkit.getPluginManager().callEvent(questFinishEvent);
+ // PlayerFinishQuestEvent -- end
+ Bukkit.getServer().getScheduler().runTask(plugin, () -> {
+ for (String s : quest.getRewards()) {
+ Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s.replace("{player}", player.getName())); //TODO PlaceholderAPI support
+ }
+ });
+ if (questFinishEvent.getQuestFinishMessage() != null)
+ player.sendMessage(questFinishEvent.getQuestFinishMessage());
+ if (Options.TITLES_ENABLED.getBooleanValue()) {
+ plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest
+ .getDisplayNameStripped()), Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", quest
+ .getDisplayNameStripped()));
+ }
+ for (String s : quest.getRewardString()) {
+ player.sendMessage(ChatColor.translateAlternateColorCodes('&', s));
+ }
+ }
+ if ((Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue() && !(quest.isRepeatable() && !quest.isCooldownEnabled()))
+ || (!Options.ALLOW_QUEST_TRACK.getBooleanValue() && Options.QUEST_AUTOTRACK.getBooleanValue())) {
+ Quest nextQuest;
+ if (qPlayer.getQuestProgressFile().getStartedQuests().size() > 0) {
+ nextQuest = qPlayer.getQuestProgressFile().getStartedQuests().get(0);
+ qPlayer.trackQuest(nextQuest);
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public boolean hasPlayerStartedQuest(QPlayer qPlayer, Quest quest) {
+ if (Options.QUEST_AUTOSTART.getBooleanValue()) {
+ QuestStartResult response = canPlayerStartQuest(qPlayer, quest);
+ return response == QuestStartResult.QUEST_SUCCESS || response == QuestStartResult.QUEST_ALREADY_STARTED;
+ } else {
+ return qPlayer.getQuestProgressFile().hasQuestProgress(quest) && qPlayer.getQuestProgressFile().getQuestProgress(quest).isStarted();
+ }
+ }
+
+ @Override
+ public boolean cancelQuestForPlayer(QPlayer qPlayer, Quest quest) {
+ QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest);
+ Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID());
+ if (!questProgress.isStarted()) {
+ if (player != null) {
+ player.sendMessage(Messages.QUEST_CANCEL_NOTSTARTED.getMessage());
+ }
+ return false;
+ }
+ questProgress.setStarted(false);
+ for (TaskProgress taskProgress : questProgress.getTaskProgress()) {
+ taskProgress.setProgress(null);
+ }
+ if (player != null) {
+ String questCancelMessage = Messages.QUEST_CANCEL.getMessage().replace("{quest}", quest.getDisplayNameStripped());
+ // PlayerCancelQuestEvent -- start
+ PlayerCancelQuestEvent questCancelEvent = new PlayerCancelQuestEvent(player, qPlayer, questProgress, questCancelMessage);
+ Bukkit.getPluginManager().callEvent(questCancelEvent);
+ // PlayerCancelQuestEvent -- end
+ if (questCancelEvent.getQuestCancelMessage() != null)
+ player.sendMessage(questCancelEvent.getQuestCancelMessage());
+ }
+ return true;
+ }
+
+}
diff --git a/src/main/java/com/leonardobishop/quests/quest/controller/QuestController.java b/src/main/java/com/leonardobishop/quests/quest/controller/QuestController.java
new file mode 100644
index 00000000..b4b76baa
--- /dev/null
+++ b/src/main/java/com/leonardobishop/quests/quest/controller/QuestController.java
@@ -0,0 +1,15 @@
+package com.leonardobishop.quests.quest.controller;
+
+import com.leonardobishop.quests.api.enums.QuestStartResult;
+import com.leonardobishop.quests.player.QPlayer;
+import com.leonardobishop.quests.quest.Quest;
+
+public interface QuestController {
+
+ QuestStartResult startQuestForPlayer(QPlayer qPlayer, Quest quest);
+ QuestStartResult canPlayerStartQuest(QPlayer qPlayer, Quest quest);
+ boolean completeQuestForPlayer(QPlayer qPlayer, Quest quest);
+ boolean hasPlayerStartedQuest(QPlayer qPlayer, Quest quest);
+ boolean cancelQuestForPlayer(QPlayer qPlayer, Quest quest);
+
+}
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java
index 0a6147e7..fb7b8b61 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.quest.Quest;
import com.leonardobishop.quests.quest.Task;
import org.bukkit.event.Listener;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java
index b2dadb63..405db7ff 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/TaskUtils.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.quest.Task;
import org.bukkit.entity.Player;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java
index 1531df37..501a6aa1 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BreedingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java
index f05f8a5b..7a0da7de 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BrewingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java
index 6d44ab9d..1e97de3f 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingCertainTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java
index 1ca89cea..851c152e 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/BuildingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java
index 6823e5af..5e1522fe 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/CommandTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java
index f695b5fb..6affa258 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DealDamageTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java
index bd96760f..604ea556 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/DistancefromTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java
index 04754176..fc0b2421 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/EnchantingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java
index 61147faf..d99688c8 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ExpEarnTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java
index fa6d7780..c35044af 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/FishingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java
index 4e12ab3c..4ee6e605 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/InventoryTaskType.java
@@ -1,7 +1,7 @@
package com.leonardobishop.quests.quest.tasktype.type;
import com.leonardobishop.quests.Quests;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java
index 8f8232ed..0d883ac2 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MilkingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java
index 125bfecc..7639ad95 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java
@@ -1,7 +1,7 @@
package com.leonardobishop.quests.quest.tasktype.type;
import com.leonardobishop.quests.Quests;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java
index 2007f301..e25adcff 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java
index da7bd5cb..86bd7fea 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingCertainTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
@@ -11,8 +11,6 @@ import com.leonardobishop.quests.quest.tasktype.ConfigValue;
import com.leonardobishop.quests.quest.tasktype.TaskType;
import com.leonardobishop.quests.quest.tasktype.TaskUtils;
import org.bukkit.ChatColor;
-import org.bukkit.Material;
-import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java
index 08cd18c4..dd43bd60 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MobkillingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java
index c577ac01..60bb1321 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlayerkillingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java
index 3b113d01..450365cb 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PlaytimeTaskType.java
@@ -1,7 +1,7 @@
package com.leonardobishop.quests.quest.tasktype.type;
import com.leonardobishop.quests.Quests;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java
index ffed1476..546cdb10 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/PositionTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java
index cbf3c175..ca4856a4 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/ShearingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java
index 9f3963e4..663ca403 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/TamingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java
index 05f10a89..4faebdb0 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/WalkingTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java
index 8e621288..bd0aba60 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ASkyBlockLevelType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java
index 5e5c53ef..00f4e12f 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/BentoBoxLevelTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java
index fa64741e..5110d51d 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensDeliverTaskType.java
@@ -1,7 +1,7 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
import com.leonardobishop.quests.Quests;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
import com.leonardobishop.quests.player.questprogressfile.TaskProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java
index 3e6592b5..08440b05 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/CitizensInteractTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java
index 22cef8a2..eaf6ba13 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java
@@ -1,7 +1,7 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
import com.earth2me.essentials.Essentials;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java
index a6a56623..6b080f13 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsMoneyEarnTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java
index e217b8af..3647a3e7 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/IridiumSkyblockValueType.java
@@ -2,7 +2,7 @@ package com.leonardobishop.quests.quest.tasktype.type.dependent;
import com.iridium.iridiumskyblock.Island;
import com.iridium.iridiumskyblock.api.IslandWorthCalculatedEvent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java
index 4c6e3bb0..47245665 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/MythicMobsKillingType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java
index a3508bcc..137844d5 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/PlaceholderAPIEvaluateTaskType.java
@@ -1,7 +1,7 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
import com.leonardobishop.quests.Quests;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java
index 0b65fb76..664c0ab6 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusBuyCertainTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java
index 1f16163c..441c306d 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/ShopGUIPlusSellCertainTaskType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java
index 7e0787cb..a88ca6dc 100644
--- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java
+++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/uSkyBlockLevelType.java
@@ -1,6 +1,6 @@
package com.leonardobishop.quests.quest.tasktype.type.dependent;
-import com.leonardobishop.quests.QuestsConfigLoader;
+import com.leonardobishop.quests.util.QuestsConfigLoader;
import com.leonardobishop.quests.api.QuestsAPI;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
diff --git a/src/main/java/com/leonardobishop/quests/QuestCompleter.java b/src/main/java/com/leonardobishop/quests/util/QuestCompleter.java
index d3ff8cf1..b6b942fd 100644
--- a/src/main/java/com/leonardobishop/quests/QuestCompleter.java
+++ b/src/main/java/com/leonardobishop/quests/util/QuestCompleter.java
@@ -1,5 +1,6 @@
-package com.leonardobishop.quests;
+package com.leonardobishop.quests.util;
+import com.leonardobishop.quests.Quests;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgress;
import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile;
diff --git a/src/main/java/com/leonardobishop/quests/util/QuestMode.java b/src/main/java/com/leonardobishop/quests/util/QuestMode.java
new file mode 100644
index 00000000..e942d909
--- /dev/null
+++ b/src/main/java/com/leonardobishop/quests/util/QuestMode.java
@@ -0,0 +1,8 @@
+package com.leonardobishop.quests.util;
+
+public enum QuestMode {
+
+ NORMAL,
+ DAILY;
+
+}
diff --git a/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java b/src/main/java/com/leonardobishop/quests/util/QuestsAutosaveRunnable.java
index eaa37d87..dbe0b3a9 100644
--- a/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java
+++ b/src/main/java/com/leonardobishop/quests/util/QuestsAutosaveRunnable.java
@@ -1,5 +1,6 @@
-package com.leonardobishop.quests;
+package com.leonardobishop.quests.util;
+import com.leonardobishop.quests.Quests;
import com.leonardobishop.quests.player.QPlayer;
import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile;
import com.leonardobishop.quests.util.Options;
diff --git a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java b/src/main/java/com/leonardobishop/quests/util/QuestsConfigLoader.java
index 8a5e10d8..9c5215bc 100644
--- a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java
+++ b/src/main/java/com/leonardobishop/quests/util/QuestsConfigLoader.java
@@ -1,12 +1,12 @@
-package com.leonardobishop.quests;
+package com.leonardobishop.quests.util;
+import com.leonardobishop.quests.Quests;
import com.leonardobishop.quests.hook.itemgetter.ItemGetter;
import com.leonardobishop.quests.menu.QItemStack;
import com.leonardobishop.quests.quest.Category;
import com.leonardobishop.quests.quest.Quest;
import com.leonardobishop.quests.quest.Task;
import com.leonardobishop.quests.quest.tasktype.TaskType;
-import com.leonardobishop.quests.util.Options;
import org.apache.commons.lang.StringUtils;
import org.bukkit.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
@@ -83,6 +83,12 @@ public class QuestsConfigLoader {
}
}
+ try {
+ plugin.setQuestMode(QuestMode.valueOf(plugin.getConfig().getString("quest-mode.mode", "NORMAL").toUpperCase()));
+ } catch (IllegalArgumentException ex) {
+ plugin.setQuestMode(QuestMode.NORMAL);
+ }
+
FileVisitor<Path> fileVisitor = new SimpleFileVisitor<Path>() {
final URI questsRoot = Paths.get(plugin.getDataFolder() + File.separator + "quests").toUri();
@@ -180,6 +186,14 @@ public class QuestsConfigLoader {
if (category == null) category = "";
+ if (plugin.getQuestMode() == QuestMode.DAILY) {
+ repeatable = true;
+ cooldown = true;
+ cooldownTime = 0;
+ requirements = Collections.emptyList();
+ permissionRequired = false;
+ }
+
Quest quest;
if (category.equals("")) {
quest = new Quest(id, displayItem, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, placeholders, sortOrder);
diff --git a/src/main/java/com/leonardobishop/quests/QuestsLogger.java b/src/main/java/com/leonardobishop/quests/util/QuestsLogger.java
index 895b03dd..426a2601 100644
--- a/src/main/java/com/leonardobishop/quests/QuestsLogger.java
+++ b/src/main/java/com/leonardobishop/quests/util/QuestsLogger.java
@@ -1,4 +1,6 @@
-package com.leonardobishop.quests;
+package com.leonardobishop.quests.util;
+
+import com.leonardobishop.quests.Quests;
public class QuestsLogger {