From e4e2a28defeb7dded336cc385135cbe2b4efe316 Mon Sep 17 00:00:00 2001 From: lmbishop <13875753+lmbishop@users.noreply.github.com> Date: Sat, 29 Jun 2019 17:43:27 +0100 Subject: Auto start - Quests can now be auto started - Removed tests --- .../java/com/leonardobishop/quests/Quests.java | 60 +++++------ .../quests/events/EventInventory.java | 2 + .../com/leonardobishop/quests/obj/Options.java | 3 +- .../leonardobishop/quests/obj/misc/QItemStack.java | 7 +- .../quests/obj/misc/QMenuCancel.java | 2 +- .../leonardobishop/quests/obj/misc/QMenuQuest.java | 2 +- .../questprogressfile/QuestProgressFile.java | 110 ++++++++++++++------- .../quests/quests/tasktypes/TaskType.java | 26 +++++ 8 files changed, 140 insertions(+), 72 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java index e1acd4a3..79724c66 100644 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ b/src/main/java/com/leonardobishop/quests/Quests.java @@ -127,35 +127,6 @@ public class Quests extends JavaPlugin { dataGenerator(); setupTitle(); - taskTypeManager.registerTaskType(new MiningTaskType()); - taskTypeManager.registerTaskType(new MiningCertainTaskType()); - taskTypeManager.registerTaskType(new BuildingTaskType()); - taskTypeManager.registerTaskType(new BuildingCertainTaskType()); - taskTypeManager.registerTaskType(new MobkillingTaskType()); - taskTypeManager.registerTaskType(new MobkillingCertainTaskType()); - taskTypeManager.registerTaskType(new PlayerkillingTaskType()); - taskTypeManager.registerTaskType(new FishingTaskType()); - taskTypeManager.registerTaskType(new InventoryTaskType()); - taskTypeManager.registerTaskType(new WalkingTaskType()); - taskTypeManager.registerTaskType(new TamingTaskType()); - taskTypeManager.registerTaskType(new MilkingTaskType()); - taskTypeManager.registerTaskType(new ShearingTaskType()); - taskTypeManager.registerTaskType(new PositionTaskType()); - taskTypeManager.registerTaskType(new PlaytimeTaskType()); - taskTypeManager.registerTaskType(new BrewingTaskType()); - // TODO: FIX - // taskTypeManager.registerTaskType(new BrewingCertainTaskType()); - if (Bukkit.getPluginManager().isPluginEnabled("ASkyBlock")) { - taskTypeManager.registerTaskType(new ASkyBlockLevelType()); - } - if (Bukkit.getPluginManager().isPluginEnabled("uSkyBlock")) { - taskTypeManager.registerTaskType(new uSkyBlockLevelType()); - } - if (Bukkit.getPluginManager().isPluginEnabled("Citizens")) { - taskTypeManager.registerTaskType(new CitizensDeliverTaskType()); - taskTypeManager.registerTaskType(new CitizensInteractTaskType()); - } - Bukkit.getPluginCommand("quests").setExecutor(new CommandQuests()); Bukkit.getPluginManager().registerEvents(new EventPlayerJoin(), this); Bukkit.getPluginManager().registerEvents(new EventInventory(), this); @@ -169,6 +140,35 @@ public class Quests extends JavaPlugin { new BukkitRunnable() { @Override public void run() { + taskTypeManager.registerTaskType(new MiningTaskType()); + taskTypeManager.registerTaskType(new MiningCertainTaskType()); + taskTypeManager.registerTaskType(new BuildingTaskType()); + taskTypeManager.registerTaskType(new BuildingCertainTaskType()); + taskTypeManager.registerTaskType(new MobkillingTaskType()); + taskTypeManager.registerTaskType(new MobkillingCertainTaskType()); + taskTypeManager.registerTaskType(new PlayerkillingTaskType()); + taskTypeManager.registerTaskType(new FishingTaskType()); + taskTypeManager.registerTaskType(new InventoryTaskType()); + taskTypeManager.registerTaskType(new WalkingTaskType()); + taskTypeManager.registerTaskType(new TamingTaskType()); + taskTypeManager.registerTaskType(new MilkingTaskType()); + taskTypeManager.registerTaskType(new ShearingTaskType()); + taskTypeManager.registerTaskType(new PositionTaskType()); + taskTypeManager.registerTaskType(new PlaytimeTaskType()); + taskTypeManager.registerTaskType(new BrewingTaskType()); + // TODO: FIX + // taskTypeManager.registerTaskType(new BrewingCertainTaskType()); + if (Bukkit.getPluginManager().isPluginEnabled("ASkyBlock")) { + taskTypeManager.registerTaskType(new ASkyBlockLevelType()); + } + if (Bukkit.getPluginManager().isPluginEnabled("uSkyBlock")) { + taskTypeManager.registerTaskType(new uSkyBlockLevelType()); + } + if (Bukkit.getPluginManager().isPluginEnabled("Citizens")) { + taskTypeManager.registerTaskType(new CitizensDeliverTaskType()); + taskTypeManager.registerTaskType(new CitizensInteractTaskType()); + } + reloadQuests(); for (Player player : Bukkit.getOnlinePlayers()) { @@ -198,7 +198,7 @@ public class Quests extends JavaPlugin { for (Map.Entry entry : Quests.getQuestManager().getQuests().entrySet()) { Quest quest = entry.getValue(); QuestProgress questProgress = questProgressFile.getQuestProgress(quest); - if (questProgress != null && questProgress.isStarted()) { + if (questProgressFile.hasStartedQuest(quest)) { boolean complete = true; for (Task task : quest.getTasks()) { TaskProgress taskProgress; diff --git a/src/main/java/com/leonardobishop/quests/events/EventInventory.java b/src/main/java/com/leonardobishop/quests/events/EventInventory.java index ce989d4f..623f8c25 100644 --- a/src/main/java/com/leonardobishop/quests/events/EventInventory.java +++ b/src/main/java/com/leonardobishop/quests/events/EventInventory.java @@ -52,6 +52,8 @@ public class EventInventory implements Listener { } else if (event.getSlot() < qMenuQuest.getPageSize() && qMenuQuest.getSlotsToMenu().containsKey(event.getSlot() + (((qMenuQuest .getCurrentPage()) - 1) * qMenuQuest.getPageSize()))) { + if (Options.QUEST_AUTOSTART.getBooleanValue()) return; + String questid = qMenuQuest.getSlotsToMenu().get(event.getSlot() + (((qMenuQuest.getCurrentPage()) - 1) * qMenuQuest.getPageSize())); Quest quest = Quests.getQuestManager().getQuestById(questid); if (event.getClick() == ClickType.LEFT) { diff --git a/src/main/java/com/leonardobishop/quests/obj/Options.java b/src/main/java/com/leonardobishop/quests/obj/Options.java index 2fe624d3..238c77cf 100644 --- a/src/main/java/com/leonardobishop/quests/obj/Options.java +++ b/src/main/java/com/leonardobishop/quests/obj/Options.java @@ -19,7 +19,8 @@ public enum Options { GUITITLE_QUESTS("options.guinames.quests-menu"), GUITITLE_DAILY_QUESTS("options.guinames.daily-quests"), GUITITLE_QUEST_CANCEL("options.guinames.quest-cancel"), - ALLOW_QUEST_CANCEL("options.allow-quest-cancel"); + ALLOW_QUEST_CANCEL("options.allow-quest-cancel"), + QUEST_AUTOSTART("options.quest-autostart"); private String path; diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java b/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java index 8d5c82e9..775e19bb 100644 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java +++ b/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java @@ -1,6 +1,9 @@ package com.leonardobishop.quests.obj.misc; +import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.quests.Quest; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemFlag; @@ -68,14 +71,14 @@ public class QItemStack { this.data = data; } - public ItemStack toItemStack(QuestProgress questProgress) { + public ItemStack toItemStack(Quest quest, QuestProgressFile questProgressFile, QuestProgress questProgress) { ItemStack is = new ItemStack(type, 1, (short) data); ItemMeta ism = is.getItemMeta(); ism.setDisplayName(name); List formattedLore = new ArrayList<>(); List tempLore = new ArrayList<>(); tempLore.addAll(loreNormal); - if (questProgress != null && questProgress.isStarted()) { + if (questProgressFile.hasStartedQuest(quest)) { tempLore.addAll(loreStarted); ism.addEnchant(Enchantment.ARROW_INFINITE, 1, true); try { diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java index b23911fc..abebb17d 100644 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java +++ b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java @@ -66,7 +66,7 @@ public class QMenuCancel implements QMenu { inventory.setItem(10, no); inventory.setItem(11, no); inventory.setItem(12, no); - inventory.setItem(13, quest.getDisplayItem().toItemStack(owner.getQuestProgressFile().getQuestProgress(quest))); + inventory.setItem(13, quest.getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), owner.getQuestProgressFile().getQuestProgress(quest))); inventory.setItem(14, yes); inventory.setItem(15, yes); inventory.setItem(16, yes); diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java index 6aabfe6e..370374f1 100644 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java +++ b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java @@ -135,7 +135,7 @@ public class QMenuQuest implements QMenu { ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders); inventory.setItem(invSlot, is); } else { - inventory.setItem(invSlot, Quests.getQuestManager().getQuestById(quest.getId()).getDisplayItem().toItemStack(questProgress)); + inventory.setItem(invSlot, Quests.getQuestManager().getQuestById(quest.getId()).getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress)); } } invSlot++; diff --git a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java index 8950d158..5fbb9e9f 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java +++ b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java @@ -1,10 +1,10 @@ package com.leonardobishop.quests.player.questprogressfile; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.quests.Task; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.obj.Messages; import com.leonardobishop.quests.obj.Options; +import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.quests.Task; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.configuration.file.YamlConfiguration; @@ -53,51 +53,39 @@ public class QuestProgressFile { } /** - * Start a quest for the player. + * Check if the player can start a quest. + *

+ * Warning: will fail if the player is not online. * * @param quest the quest to check - * @return 0 if successful, 1 if limit reached, 2 if quest is already completed, 3 if quest has cooldown, 4 if still locked, 5 if already started, 6 if + * @return 0 if true, 1 if limit reached, 2 if quest is already completed, 3 if quest has cooldown, 4 if still locked, 5 if already started, 6 if * no permission, 7 if no permission for category */ - public int startQuest(Quest quest) { + public int canStartQuest(Quest quest) { Player p = Bukkit.getPlayer(player); if (getStartedQuests().size() >= Options.QUESTS_START_LIMIT.getIntValue()) { - if (player != null) { - p.sendMessage(Messages.QUEST_START_LIMIT.getMessage().replace("{limit}", String.valueOf(Options.QUESTS_START_LIMIT.getIntValue()))); - } return 1; } QuestProgress questProgress = getQuestProgress(quest); if (!quest.isRepeatable() && questProgress.isCompletedBefore()) { if (player != null) { - p.sendMessage(Messages.QUEST_START_DISABLED.getMessage()); + } return 2; } long cooldown = getCooldownFor(quest); if (cooldown > 0) { - if (player != null) { - p.sendMessage(Messages.QUEST_START_COOLDOWN.getMessage().replace("{time}", String.valueOf(Quests.convertToFormat(TimeUnit.MINUTES.convert - (cooldown, TimeUnit.MILLISECONDS))))); - } return 3; } if (!hasMetRequirements(quest)) { - if (player != null) { - p.sendMessage(Messages.QUEST_START_LOCKED.getMessage()); - } return 4; } if (questProgress.isStarted()) { - if (player != null) { - p.sendMessage(Messages.QUEST_START_STARTED.getMessage()); - } return 5; } if (quest.isPermissionRequired()) { if (player != null) { if (!p.hasPermission("quests.quest." + quest.getId())) { - p.sendMessage(Messages.QUEST_START_PERMISSION.getMessage()); return 6; } } else { @@ -108,30 +96,75 @@ public class QuestProgressFile { .getCategoryById(quest.getCategoryId()).isPermissionRequired()) { if (player != null) { if (!p.hasPermission("quests.category." + quest.getCategoryId())) { - p.sendMessage(Messages.QUEST_CATEGORY_QUEST_PERMISSION.getMessage()); return 7; } } else { return 7; } } + return 0; + } - questProgress.setStarted(true); - for (TaskProgress taskProgress : questProgress.getTaskProgress()) { - taskProgress.setCompleted(false); - taskProgress.setProgress(null); + /** + * Start a quest for the player. + *

+ * Warning: will fail if the player is not online. + * + * @param quest the quest to check + * @return 0 if successful, 1 if limit reached, 2 if quest is already completed, 3 if quest has cooldown, 4 if still locked, 5 if already started, 6 if + * no permission, 7 if no permission for category, 8 if other + */ + public int startQuest(Quest quest) { + Player p = Bukkit.getPlayer(player); + int code = canStartQuest(quest); + if (p != null) { + switch (code) { + case 0: + break; + case 1: + p.sendMessage(Messages.QUEST_START_LIMIT.getMessage().replace("{limit}", String.valueOf(Options.QUESTS_START_LIMIT.getIntValue()))); + break; + case 2: + p.sendMessage(Messages.QUEST_START_DISABLED.getMessage()); + break; + case 3: + long cooldown = getCooldownFor(quest); + p.sendMessage(Messages.QUEST_START_COOLDOWN.getMessage().replace("{time}", String.valueOf(Quests.convertToFormat(TimeUnit.MINUTES.convert + (cooldown, TimeUnit.MILLISECONDS))))); + break; + case 4: + p.sendMessage(Messages.QUEST_START_LOCKED.getMessage()); + break; + case 5: + p.sendMessage(Messages.QUEST_START_STARTED.getMessage()); + break; + case 6: + p.sendMessage(Messages.QUEST_START_PERMISSION.getMessage()); + break; + case 7: + p.sendMessage(Messages.QUEST_CATEGORY_QUEST_PERMISSION.getMessage()); + break; + } } - questProgress.setCompleted(false); - if (Bukkit.getPlayer(player) != null) { - Player player = Bukkit.getPlayer(getPlayer()); - player.sendMessage(Messages.QUEST_START.getMessage().replace("{quest}", quest.getDisplayNameStripped())); - if (Options.TITLES_ENABLED.getBooleanValue()) { - Quests.getTitle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", quest - .getDisplayNameStripped()), Messages.TITLE_QUEST_START_SUBTITLE.getMessage().replace("{quest}", quest - .getDisplayNameStripped())); + if (code == 0) { + QuestProgress questProgress = getQuestProgress(quest); + questProgress.setStarted(true); + for (TaskProgress taskProgress : questProgress.getTaskProgress()) { + taskProgress.setCompleted(false); + taskProgress.setProgress(null); + } + questProgress.setCompleted(false); + if (Bukkit.getPlayer(player) != null) { + Player player = Bukkit.getPlayer(getPlayer()); + player.sendMessage(Messages.QUEST_START.getMessage().replace("{quest}", quest.getDisplayNameStripped())); + if (Options.TITLES_ENABLED.getBooleanValue()) { + Quests.getTitle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", quest + .getDisplayNameStripped()), Messages.TITLE_QUEST_START_SUBTITLE.getMessage().replace("{quest}", quest + .getDisplayNameStripped())); + } } } - return 0; + return code; } public boolean cancelQuest(Quest quest) { @@ -171,12 +204,15 @@ public class QuestProgressFile { } public boolean hasStartedQuest(Quest quest) { - //TODO always return true if the need for starting quests is disabled & requirements are met - if (hasQuestProgress(quest)) { - if (getQuestProgress(quest).isStarted()) { + if (!Options.QUEST_AUTOSTART.getBooleanValue()) { + if (hasQuestProgress(quest) && getQuestProgress(quest).isStarted()) { return true; } + } else { + int response = canStartQuest(quest); + if (response == 0 || response == 5) return true; } + return false; } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java index 51770401..d3d00962 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/TaskType.java @@ -7,6 +7,12 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +/** + * A task type which can be used within Quests. A {@link Quest} + * will be registered to this if it contains at least 1 task + * which is of this type. This is so you do not have to + * iterate through every single quest. + */ public abstract class TaskType implements Listener { private List quests = new ArrayList<>(); @@ -14,26 +20,46 @@ public abstract class TaskType implements Listener { private String author; private String description; + /** + * @param type the name of the task type, should not contain spaces + * @param author the name of the person (or people) who wrote it + * @param description a short, simple description of the task type + */ public TaskType(String type, String author, String description) { this.type = type; this.author = author; this.description = description; } + /** + * @param type the name of the task type, should not contain spaces + */ public TaskType(String type) { this.type = type; } + /** + * Registers a {@link Quest} to this task type. This is usually done when + * all the quests are initially loaded. + * + * @param quest the {@link Quest} to register. + */ public final void registerQuest(Quest quest) { if (!quests.contains(quest)) { quests.add(quest); } } + /** + * Clears the list which contains the registered quests. + */ public final void unregisterAll() { quests.clear(); } + /** + * @return {@link List} of type {@link Quest} of all registered quests. + */ public final List getRegisteredQuests() { return quests; } -- cgit v1.2.3-70-g09d2