diff options
4 files changed, 179 insertions, 40 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java index 37a388fb..488f91f0 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommand.java @@ -205,6 +205,7 @@ public class QuestsCommand implements TabExecutor { sender.sendMessage(ChatColor.RED + "Requirements: " + ChatColor.GRAY + String.join(", ", quest.getRequirements())); sender.sendMessage(ChatColor.RED + "Cooldown enabled: " + ChatColor.GRAY + quest.isCooldownEnabled()); sender.sendMessage(ChatColor.RED + "Cooldown time: " + ChatColor.GRAY + quest.getCooldown()); + sender.sendMessage(ChatColor.RED + "Autostart: " + ChatColor.GRAY + quest.isAutoStartEnabled()); } return true; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java index f80ec3f0..e80b30e1 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/config/BukkitQuestsLoader.java @@ -176,12 +176,13 @@ public class BukkitQuestsLoader implements QuestsLoader { boolean repeatable = config.getBoolean("options.repeatable", false); boolean cooldown = config.getBoolean("options.cooldown.enabled", false); boolean permissionRequired = config.getBoolean("options.permission-required", false); + boolean autostart = config.getBoolean("options.autostart", false); int cooldownTime = config.getInt("options.cooldown.time", 10); int sortOrder = config.getInt("options.sort-order", 1); String category = config.getString("options.category"); Map<String, String> placeholders = new HashMap<>(); - if (category == null) category = ""; + if (category != null && category.equals("")) category = null; if (questController.getName().equals("daily")) { repeatable = true; @@ -191,11 +192,22 @@ public class BukkitQuestsLoader implements QuestsLoader { permissionRequired = false; } - Quest quest; - if (category.equals("")) { - quest = new Quest(id, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, placeholders, sortOrder); - } else { - quest = new Quest(id, rewards, requirements, repeatable, cooldown, cooldownTime, permissionRequired, rewardString, startString, placeholders, category, sortOrder); + Quest quest = new Quest.Builder(id) + .withRewards(rewards) + .withRequirements(requirements) + .withRewardString(rewardString) + .withStartString(startString) + .withPlaceholders(placeholders) + .withCooldown(cooldownTime) + .withSortOrder(sortOrder) + .withCooldownEnabled(cooldown) + .withPermissionRequired(permissionRequired) + .withRepeatEnabled(repeatable) + .withAutoStartEnabled(autostart) + .inCategory(category) + .build(); + + if (category != null) { Category c = questManager.getCategoryById(category); if (c != null) { c.registerQuestId(id); diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java index c9c95eb7..d32218b6 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java @@ -23,6 +23,10 @@ import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.concurrent.TimeUnit; public class NormalQuestController implements QuestController { @@ -30,9 +34,18 @@ public class NormalQuestController implements QuestController { private final BukkitQuestsPlugin plugin; private final BukkitQuestsConfig config; + private final List<Quest> autoStartQuestCache; + public NormalQuestController(BukkitQuestsPlugin plugin) { this.plugin = plugin; this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); + + List<Quest> autoStartQuestCache = new ArrayList<>(); + List<Quest> nonAutoStartQuestCache = new ArrayList<>(); + for (Quest quest : plugin.getQuestManager().getQuests().values()) { + if (quest.isAutoStartEnabled()) autoStartQuestCache.add(quest); + } + this.autoStartQuestCache = autoStartQuestCache; } @Override @@ -125,7 +138,7 @@ public class NormalQuestController implements QuestController { @Override public QuestStartResult canPlayerStartQuest(QPlayer qPlayer, Quest quest) { Player p = Bukkit.getPlayer(qPlayer.getPlayerUUID()); - if (qPlayer.getQuestProgressFile().getStartedQuests().size() >= config.getInt("options.quest-started-limit") && !config.getBoolean("options.quest-autostart")) { + if (getStartedQuestsForPlayer(qPlayer).size() >= config.getInt("options.quest-started-limit") && !config.getBoolean("options.quest-autostart")) { return QuestStartResult.QUEST_LIMIT_REACHED; } QuestProgress questProgress = qPlayer.getQuestProgressFile().getQuestProgress(quest); @@ -223,7 +236,10 @@ public class NormalQuestController implements QuestController { 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(); + if (quest.isAutoStartEnabled()) { + 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(); } } @@ -282,4 +298,25 @@ public class NormalQuestController implements QuestController { } } + private Set<Quest> getStartedQuestsForPlayer(QPlayer qPlayer) { + Set<Quest> startedQuests = new HashSet<>(); + if (config.getBoolean("options.quest-autostart")) { + for (Quest quest : plugin.getQuestManager().getQuests().values()) { + QuestStartResult response = canPlayerStartQuest(qPlayer, quest); + if (response == QuestStartResult.QUEST_SUCCESS || response == QuestStartResult.QUEST_ALREADY_STARTED) { + startedQuests.add(quest); + } + } + } else { + startedQuests.addAll(qPlayer.getQuestProgressFile().getStartedQuests()); + for (Quest quest : autoStartQuestCache) { + QuestStartResult response = canPlayerStartQuest(qPlayer, quest); + if (response == QuestStartResult.QUEST_SUCCESS || response == QuestStartResult.QUEST_ALREADY_STARTED) { + startedQuests.add(quest); + } + } + } + return startedQuests; + } + } diff --git a/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java b/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java index 510e88d9..c1f6f47f 100644 --- a/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java +++ b/common/src/main/java/com/leonardobishop/quests/common/quest/Quest.java @@ -2,45 +2,29 @@ package com.leonardobishop.quests.common.quest; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class Quest implements Comparable<Quest> { - private Map<String, Task> tasks = new HashMap<>(); - private final String id; - private final List<String> rewards; - private final List<String> requirements; - private final List<String> rewardString; - private final List<String> startString; - private final boolean repeatable; - private final boolean cooldownEnabled; - private final int cooldown; - private final int sortOrder; - private final boolean permissionRequired; - private final Map<String, String> placeholders; + private final Map<String, Task> tasks = new HashMap<>(); + private String id; + private List<String> rewards; + private List<String> requirements; + private List<String> rewardString; + private List<String> startString; + private boolean repeatEnabled; + private boolean cooldownEnabled; + private int cooldown; + private int sortOrder; + private boolean permissionRequired; + private boolean autoStartEnabled; + private Map<String, String> placeholders; private String categoryid; - - public Quest(String id, List<String> rewards, List<String> requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List<String> rewardString, List<String> startString, Map<String, String> placeholders, String categoryid, int sortOrder) { - this(id, rewards, requirements, repeatable, cooldownEnabled, cooldown, permissionRequired, rewardString, startString, placeholders, sortOrder); - this.categoryid = categoryid; - } - - public Quest(String id, List<String> rewards, List<String> requirements, boolean repeatable, boolean cooldownEnabled, int cooldown, boolean permissionRequired, List<String> rewardString, List<String> startString, Map<String, String> placeholders, int sortOrder) { - this.id = id; - this.rewards = rewards; - this.requirements = requirements; - this.repeatable = repeatable; - this.cooldownEnabled = cooldownEnabled; - this.cooldown = cooldown; - this.permissionRequired = permissionRequired; - this.rewardString = rewardString; - this.startString = startString; - this.placeholders = placeholders; - this.sortOrder = sortOrder; - } + private Quest() { } public void registerTask(Task task) { tasks.put(task.getId(), task); @@ -90,7 +74,7 @@ public class Quest implements Comparable<Quest> { } public boolean isRepeatable() { - return repeatable; + return repeatEnabled; } public boolean isCooldownEnabled() { @@ -113,8 +97,113 @@ public class Quest implements Comparable<Quest> { return sortOrder; } + public boolean isAutoStartEnabled() { + return autoStartEnabled; + } + @Override public int compareTo(Quest quest) { return (sortOrder - quest.sortOrder); } + + public static class Builder { + + private final String id; + private List<String> rewards = Collections.emptyList(); + private List<String> requirements = Collections.emptyList(); + private List<String> rewardString = Collections.emptyList(); + private List<String> startString = Collections.emptyList(); + private boolean repeatEnabled = false; + private boolean cooldownEnabled = false; + private int cooldown = 0; + private int sortOrder = 1; + private boolean permissionRequired = false; + private boolean autoStartEnabled = false; + private Map<String, String> placeholders = Collections.emptyMap(); + private String categoryid = null; + + public Builder(String id) { + this.id = id; + } + + public Builder withRewards(List<String> rewards) { + this.rewards = rewards; + return this; + } + + public Builder withRequirements(List<String> requirements) { + this.requirements = requirements; + return this; + } + + public Builder withRewardString(List<String> rewardString) { + this.rewardString = rewardString; + return this; + } + + public Builder withStartString(List<String> startString) { + this.startString = startString; + return this; + } + + public Builder withSortOrder(int sortOrder) { + this.sortOrder = sortOrder; + return this; + } + + public Builder withCooldown(int cooldown) { + this.cooldown = cooldown; + return this; + } + + public Builder withPlaceholders(Map<String, String> placeholders) { + this.placeholders = placeholders; + return this; + } + + public Builder withRepeatEnabled(boolean repeatEnabled) { + this.repeatEnabled = repeatEnabled; + return this; + } + + public Builder withCooldownEnabled(boolean cooldownEnabled) { + this.cooldownEnabled = cooldownEnabled; + return this; + } + + public Builder withPermissionRequired(boolean permissionRequired) { + this.permissionRequired = permissionRequired; + return this; + } + + public Builder withAutoStartEnabled(boolean autoStartEnabled) { + this.autoStartEnabled = autoStartEnabled; + return this; + } + + public Builder inCategory(String categoryid) { + this.categoryid = categoryid; + return this; + } + + public Quest build() { + Quest quest = new Quest(); + quest.id = this.id; + quest.rewards = this.rewards; + quest.requirements = this.requirements; + quest.rewardString = this.rewardString; + quest.startString = this.startString; + quest.repeatEnabled = this.repeatEnabled; + quest.cooldownEnabled = this.cooldownEnabled; + quest.cooldown = this.cooldown; + quest.sortOrder = this.sortOrder; + quest.permissionRequired = this.permissionRequired; + quest.autoStartEnabled = this.autoStartEnabled; + quest.placeholders = this.placeholders; + quest.categoryid = this.categoryid; + + return quest; + } + + } } |
