From 367cbbede13140cc7c5e13de1041fdf4bd62f105 Mon Sep 17 00:00:00 2001 From: LMBishop <13875753+LMBishop@users.noreply.github.com> Date: Thu, 24 Jun 2021 13:17:16 +0100 Subject: Add quest-specific autostart - Closes #188 - Closes #125 --- .../quests/bukkit/command/QuestsCommand.java | 1 + .../quests/bukkit/config/BukkitQuestsLoader.java | 24 +++++++++---- .../questcontroller/NormalQuestController.java | 41 ++++++++++++++++++++-- 3 files changed, 58 insertions(+), 8 deletions(-) (limited to 'bukkit') 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 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 autoStartQuestCache; + public NormalQuestController(BukkitQuestsPlugin plugin) { this.plugin = plugin; this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); + + List autoStartQuestCache = new ArrayList<>(); + List 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 getStartedQuestsForPlayer(QPlayer qPlayer) { + Set 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; + } + } -- cgit v1.2.3-70-g09d2