From 21c713b04fb57016f9024b2ee09763e87a1c0f1a Mon Sep 17 00:00:00 2001 From: LMBishop <13875753+LMBishop@users.noreply.github.com> Date: Sat, 6 Mar 2021 23:20:34 +0000 Subject: Restructured menu controller & code organisation --- .../java/com/leonardobishop/quests/Quests.java | 47 ++-- .../quests/QuestsAutosaveRunnable.java | 1 - .../quests/events/EventPlayerJoin.java | 3 +- .../quests/events/EventPlayerLeave.java | 5 +- .../quests/events/MenuController.java | 65 +---- .../leonardobishop/quests/menu/CancelQMenu.java | 81 ++++++ .../leonardobishop/quests/menu/CategoryQMenu.java | 154 +++++++++++ .../com/leonardobishop/quests/menu/DailyQMenu.java | 106 ++++++++ .../com/leonardobishop/quests/menu/MenuUtil.java | 23 ++ .../com/leonardobishop/quests/menu/QItemStack.java | 18 +- .../leonardobishop/quests/menu/QMenuCancel.java | 93 ------- .../leonardobishop/quests/menu/QMenuCategory.java | 165 ------------ .../com/leonardobishop/quests/menu/QMenuDaily.java | 106 -------- .../com/leonardobishop/quests/menu/QMenuQuest.java | 285 --------------------- .../leonardobishop/quests/menu/QMenuStarted.java | 176 ------------- .../com/leonardobishop/quests/menu/QuestQMenu.java | 279 ++++++++++++++++++++ .../leonardobishop/quests/menu/StartedQMenu.java | 173 +++++++++++++ .../quests/menu/element/CategoryMenuElement.java | 65 +++++ .../quests/menu/element/CustomMenuElement.java | 17 ++ .../quests/menu/element/MenuElement.java | 9 + .../quests/menu/element/QuestMenuElement.java | 108 ++++++++ .../quests/menu/object/CategoryMenuElement.java | 65 ----- .../quests/menu/object/CustomMenuElement.java | 17 -- .../quests/menu/object/MenuElement.java | 9 - .../quests/menu/object/QuestMenuElement.java | 108 -------- .../com/leonardobishop/quests/player/QPlayer.java | 53 ++-- .../questprogressfile/QuestProgressFile.java | 4 +- .../quests/tasktypes/types/InventoryTaskType.java | 14 +- .../tasktypes/types/MiningCertainTaskType.java | 6 +- .../quests/tasktypes/types/PermissionTaskType.java | 6 +- .../quests/tasktypes/types/PlaytimeTaskType.java | 6 +- .../types/dependent/CitizensDeliverTaskType.java | 12 +- .../types/dependent/IridiumSkyblockValueType.java | 2 - .../dependent/PlaceholderAPIEvaluateTaskType.java | 6 +- .../java/com/leonardobishop/quests/util/Items.java | 7 +- .../com/leonardobishop/quests/util/Options.java | 1 + 36 files changed, 1123 insertions(+), 1172 deletions(-) create mode 100644 src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuDaily.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/element/CustomMenuElement.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/element/MenuElement.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/object/CategoryMenuElement.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/object/CustomMenuElement.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/object/MenuElement.java delete mode 100644 src/main/java/com/leonardobishop/quests/menu/object/QuestMenuElement.java (limited to 'src/main') diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java index 1997699b..7f5df19e 100644 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ b/src/main/java/com/leonardobishop/quests/Quests.java @@ -76,17 +76,19 @@ import java.util.ArrayList; public class Quests extends JavaPlugin { - private static QuestManager questManager; - private static QPlayerManager qPlayerManager; - private static TaskTypeManager taskTypeManager; - private static Quests instance; private static Updater updater; - private static Title title; + + private QuestManager questManager; + private QPlayerManager qPlayerManager; + private TaskTypeManager taskTypeManager; + + private Title titleHandle; private ItemGetter itemGetter; private QuestCompleter questCompleter; private QuestsConfigLoader questsConfigLoader; private QuestsLogger questsLogger; + private MenuController menuController; private IPlaceholderAPIHook placeholderAPIHook; private ICoreProtectHook coreProtectHook; @@ -119,8 +121,8 @@ public class Quests extends JavaPlugin { this.brokenConfig = brokenConfig; } - public Title getTitle() { - return title; + public Title getTitleHandle() { + return titleHandle; } public Updater getUpdater() { @@ -131,6 +133,10 @@ public class Quests extends JavaPlugin { return questsConfigLoader; } + public MenuController getMenuController() { + return menuController; + } + public String convertToFormat(long m) { //seconds please long hours = m / 3600; long minutes = (m % 3600) / 60; @@ -152,13 +158,14 @@ public class Quests extends JavaPlugin { taskTypeManager = new TaskTypeManager(this); questManager = new QuestManager(this); qPlayerManager = new QPlayerManager(this); + menuController = new MenuController(this); dataGenerator(); setupVersionSpecific(); Bukkit.getPluginCommand("quests").setExecutor(new CommandQuests(this)); Bukkit.getPluginManager().registerEvents(new EventPlayerJoin(this), this); - Bukkit.getPluginManager().registerEvents(new MenuController(this), this); + Bukkit.getPluginManager().registerEvents(menuController, this); Bukkit.getPluginManager().registerEvents(new EventPlayerLeave(this), this); Metrics metrics = new Metrics(this); @@ -171,26 +178,26 @@ public class Quests extends JavaPlugin { // register task types after the server has fully started Bukkit.getScheduler().runTask(this, () -> { taskTypeManager.registerTaskType(new MiningTaskType()); - taskTypeManager.registerTaskType(new MiningCertainTaskType()); + taskTypeManager.registerTaskType(new MiningCertainTaskType(this)); 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 InventoryTaskType(this)); 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 PlaytimeTaskType(this)); taskTypeManager.registerTaskType(new BrewingTaskType()); taskTypeManager.registerTaskType(new ExpEarnTaskType()); taskTypeManager.registerTaskType(new BreedingTaskType()); taskTypeManager.registerTaskType(new EnchantingTaskType()); taskTypeManager.registerTaskType(new DealDamageTaskType()); - taskTypeManager.registerTaskType(new PermissionTaskType()); + taskTypeManager.registerTaskType(new PermissionTaskType(this)); taskTypeManager.registerTaskType(new DistancefromTaskType()); taskTypeManager.registerTaskType(new CommandTaskType()); // TODO: FIX @@ -208,14 +215,14 @@ public class Quests extends JavaPlugin { taskTypeManager.registerTaskType(new uSkyBlockLevelType()); } if (Bukkit.getPluginManager().isPluginEnabled("Citizens")) { - taskTypeManager.registerTaskType(new CitizensDeliverTaskType()); + taskTypeManager.registerTaskType(new CitizensDeliverTaskType(this)); taskTypeManager.registerTaskType(new CitizensInteractTaskType()); } if (Bukkit.getPluginManager().isPluginEnabled("MythicMobs")) { taskTypeManager.registerTaskType(new MythicMobsKillingType()); } if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { - taskTypeManager.registerTaskType(new PlaceholderAPIEvaluateTaskType()); + taskTypeManager.registerTaskType(new PlaceholderAPIEvaluateTaskType(this)); } if (Bukkit.getPluginManager().isPluginEnabled("Essentials")) { taskTypeManager.registerTaskType(new EssentialsMoneyEarnTaskType()); @@ -346,7 +353,7 @@ public class Quests extends JavaPlugin { version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; } catch (ArrayIndexOutOfBoundsException e) { getQuestsLogger().warning("Failed to resolve server version - some features will not work!"); - title = new Title_Other(); + titleHandle = new Title_Other(); itemGetter = new ItemGetter_Late_1_8(); return; } @@ -354,11 +361,11 @@ public class Quests extends JavaPlugin { getQuestsLogger().info("Your server is running version " + version + "."); if (version.startsWith("v1_7")) { - title = new Title_Other(); + titleHandle = new Title_Other(); } else if (version.startsWith("v1_8") || version.startsWith("v1_9") || version.startsWith("v1_10")) { - title = new Title_BukkitNoTimings(); + titleHandle = new Title_BukkitNoTimings(); } else { - title = new Title_Bukkit(); + titleHandle = new Title_Bukkit(); } if (version.startsWith("v1_7") || version.startsWith("v1_8") || version.startsWith("v1_9") @@ -370,9 +377,9 @@ public class Quests extends JavaPlugin { itemGetter = new ItemGetterLatest(); } - if (title instanceof Title_Bukkit) { + if (titleHandle instanceof Title_Bukkit) { getQuestsLogger().info("Titles have been enabled."); - } else if (title instanceof Title_BukkitNoTimings) { + } else if (titleHandle instanceof Title_BukkitNoTimings) { getQuestsLogger().info("Titles have been enabled, although they have limited timings."); } else { getQuestsLogger().info("Titles are not supported for this version."); diff --git a/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java b/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java index c7688e8e..551d2ead 100644 --- a/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java +++ b/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java @@ -41,5 +41,4 @@ public class QuestsAutosaveRunnable extends BukkitRunnable { } } - } diff --git a/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java b/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java index 143046be..8e718975 100644 --- a/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java +++ b/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java @@ -23,8 +23,7 @@ public class EventPlayerJoin implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onAsyncJoin(AsyncPlayerPreLoginEvent event) { if (!Options.QUEST_JOIN_ASYNC.getBooleanValue()) return; - UUID playerUuid = event.getUniqueId(); - plugin.getPlayerManager().loadPlayer(playerUuid); + plugin.getPlayerManager().loadPlayer(event.getUniqueId()); } @EventHandler diff --git a/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java b/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java index 2253cbec..e3c714a4 100644 --- a/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java +++ b/src/main/java/com/leonardobishop/quests/events/EventPlayerLeave.java @@ -5,8 +5,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; -import java.util.UUID; - public class EventPlayerLeave implements Listener { private final Quests plugin; @@ -17,8 +15,7 @@ public class EventPlayerLeave implements Listener { @EventHandler public void onEvent(PlayerQuitEvent event) { - UUID playerUuid = event.getPlayer().getUniqueId(); - plugin.getPlayerManager().removePlayer(playerUuid); + plugin.getPlayerManager().removePlayer(event.getPlayer().getUniqueId()); } } diff --git a/src/main/java/com/leonardobishop/quests/events/MenuController.java b/src/main/java/com/leonardobishop/quests/events/MenuController.java index a6d498ae..12f35baa 100644 --- a/src/main/java/com/leonardobishop/quests/events/MenuController.java +++ b/src/main/java/com/leonardobishop/quests/events/MenuController.java @@ -2,51 +2,37 @@ package com.leonardobishop.quests.events; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.menu.QMenu; -import com.leonardobishop.quests.menu.QMenuCancel; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.util.Options; -import org.bukkit.entity.Player; +import org.bukkit.entity.HumanEntity; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType; -import java.util.ArrayList; import java.util.HashMap; import java.util.UUID; public class MenuController implements Listener { - private static final HashMap tracker = new HashMap<>(); - private static final ArrayList buffer = new ArrayList<>(); - + private final HashMap tracker = new HashMap<>(); private final Quests plugin; public MenuController(Quests plugin) { this.plugin = plugin; } - /** - * Add a player to the tracker so the event can watch them in the menu. - * - * @param uuid UUID of player to track - * @param qMenu The menu they have open - */ - public static void track(UUID uuid, QMenu qMenu) { - tracker.put(uuid, qMenu); - } - - public HashMap getTracker() { - return tracker; + public void openMenu(HumanEntity player, QMenu qMenu, int page) { + player.openInventory(qMenu.toInventory(page)); + tracker.put(player.getUniqueId(), qMenu); } - public ArrayList getBuffer() { - return buffer; + @EventHandler + private void onClose(InventoryCloseEvent event) { + tracker.remove(event.getPlayer().getUniqueId()); } @EventHandler - public void onEvent(InventoryClickEvent event) { + private void onClick(InventoryClickEvent event) { // check if the player has a quest menu open if (tracker.containsKey(event.getWhoClicked().getUniqueId())) { event.setCancelled(true); @@ -60,37 +46,4 @@ public class MenuController implements Listener { } } - // utility - public void middleClickQuest(QMenu menu, Quest quest, Player player) { - if (menu.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { - String tracked = menu.getOwner().getQuestProgressFile().getPlayerPreferences().getTrackedQuestId(); - - if (quest.getId().equals(tracked)) { - menu.getOwner().getQuestProgressFile().trackQuest(null); - } else { - menu.getOwner().getQuestProgressFile().trackQuest(quest); - } - player.closeInventory(); - } - } - - // utility - public void rightClickQuest(QMenu menu, Quest quest, Player player) { - if (menu.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { - if (Options.QUEST_AUTOSTART.getBooleanValue()) return; - QMenuCancel qMenuCancel = new QMenuCancel(menu.getOwner(), menu, quest); - buffer.add(player.getUniqueId()); - player.openInventory(qMenuCancel.toInventory(1)); - tracker.put(player.getUniqueId(), qMenuCancel); - } - } - - @EventHandler - public void onEvent(InventoryCloseEvent event) { - // the buffer prevents players being lost from the tracker when changing menus, add to the buffer before - // an anticipated menu change - if (buffer.contains(event.getPlayer().getUniqueId())) { - buffer.remove(event.getPlayer().getUniqueId()); - } else tracker.remove(event.getPlayer().getUniqueId()); - } } diff --git a/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java b/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java new file mode 100644 index 00000000..c1479beb --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/CancelQMenu.java @@ -0,0 +1,81 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.util.Items; +import com.leonardobishop.quests.util.Options; +import org.bukkit.Bukkit; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +/** + * Represents a cancellation confirmation menu for a specific quest. + */ +public class CancelQMenu implements QMenu { + + private final QMenu superMenu; + private final QPlayer owner; + private final Quest quest; + + public CancelQMenu(QPlayer owner, QMenu superMenu, Quest quest) { + this.owner = owner; + this.superMenu = superMenu; + this.quest = quest; + } + + public Quest getQuest() { + return quest; + } + + @Override + public QPlayer getOwner() { + return owner; + } + + public Inventory toInventory(int page) { + String title = Options.color(Options.GUITITLE_QUEST_CANCEL.getStringValue()); + + ItemStack yes = Items.QUEST_CANCEL_YES.getItem(); + ItemStack no = Items.QUEST_CANCEL_NO.getItem(); + + 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); + } + + inventory.setItem(10, no); + inventory.setItem(11, no); + inventory.setItem(12, no); + 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); + + return inventory; + } + + @Override + public void handleClick(InventoryClickEvent event, MenuController controller) { + if (event.getSlot() == 10 || event.getSlot() == 11 || event.getSlot() == 12) { + controller.openMenu(event.getWhoClicked(), this.getSuperMenu(), 1); + } else if (event.getSlot() == 14 || event.getSlot() == 15 || event.getSlot() == 16) { + if (this.getOwner().getQuestProgressFile().cancelQuest(this.getQuest())) { + event.getWhoClicked().closeInventory(); + } + } + } + + public QMenu getSuperMenu() { + return superMenu; + } + +} diff --git a/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java b/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java new file mode 100644 index 00000000..8a56c044 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/CategoryQMenu.java @@ -0,0 +1,154 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.menu.element.CategoryMenuElement; +import com.leonardobishop.quests.menu.element.CustomMenuElement; +import com.leonardobishop.quests.menu.element.MenuElement; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.util.Items; +import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.util.Options; +import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.Bukkit; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Represents a menu which contains a listing of different categories. + */ +public class CategoryQMenu implements QMenu { + + private final Quests plugin; + private final int pageSize = 45; + private final HashMap menuElements = new HashMap<>(); + private final QPlayer owner; + + private int maxElement = 0; + private int pagePrevLocation = -1; + private int pageNextLocation = -1; + private int currentPage = -1; + + public CategoryQMenu(Quests plugin, QPlayer owner) { + this.plugin = plugin; + this.owner = owner; + } + + public void populate(List menuQuests) { + if (plugin.getConfig().isConfigurationSection("custom-elements.categories")) { + for (String s : plugin.getConfig().getConfigurationSection("custom-elements.categories").getKeys(false)) { + if (!NumberUtils.isNumber(s)) continue; + int slot = Integer.parseInt(s); + int repeat = plugin.getConfig().getInt("custom-elements.categories." + s + ".repeat"); + ItemStack is = plugin.getItemStack("custom-elements.categories." + s + ".display", plugin.getConfig()); + + for (int i = 0; i <= repeat; i++) { + menuElements.put(slot + i, new CustomMenuElement(is)); + } + } + } + int slot = 0; + for (QuestQMenu questQMenu : menuQuests) { + while (menuElements.containsKey(slot)) slot++; + if (Options.GUI_HIDE_CATEGORIES_NOPERMISSION.getBooleanValue() && plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()).isPermissionRequired()) { + if (!Bukkit.getPlayer(owner.getUuid()).hasPermission("quests.category." + questQMenu.getCategoryName())) { + continue; + } + } + menuElements.put(slot, new CategoryMenuElement(plugin, owner.getUuid(), questQMenu)); + slot++; + } + + for (Integer integer : menuElements.keySet()) { + if (integer + 1 > maxElement) maxElement = integer + 1; + } + } + + @Override + public QPlayer getOwner() { + return owner; + } + + public Inventory toInventory(int page) { + currentPage = page; + int pageMin = pageSize * (page - 1); + int pageMax = pageSize * page; + String title = Options.color(Options.GUITITLE_QUESTS_CATEGORY.getStringValue()); + + ItemStack pageIs; + ItemStack pagePrevIs; + ItemStack pageNextIs; + Inventory inventory = Bukkit.createInventory(null, 54, title); + + int highestOnPage = 0; + for (int pointer = pageMin; pointer < pageMax; pointer++) { + if (menuElements.containsKey(pointer)) { + inventory.setItem(pointer - ((page - 1) * pageSize), menuElements.get(pointer).asItemStack()); + if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; + } + } + + pageNextLocation = -1; + pagePrevLocation = -1; + + Map pageplaceholders = new HashMap<>(); + pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); + pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); + pageplaceholders.put("{page}", String.valueOf(page)); + pageIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs.setAmount(Math.min(page, 64)); + pagePrevIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_PREV.getItem(), pageplaceholders); + pageNextIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_NEXT.getItem(), pageplaceholders); + + if (maxElement > pageSize) { + inventory.setItem(49, pageIs); + if (page != 1) { + inventory.setItem(48, pagePrevIs); + pagePrevLocation = 48; + } + if (Math.ceil((double) maxElement / ((double) pageSize)) != page) { + inventory.setItem(50, pageNextIs); + pageNextLocation = 50; + } + } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { + int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); + inventorySize = inventorySize <= 0 ? 9 : inventorySize; + if (inventorySize == 54) { + return inventory; + } + + Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); + + for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { + trimmedInventory.setItem(slot, inventory.getItem(slot)); + } + return trimmedInventory; + } + return inventory; + } + + @Override + public void handleClick(InventoryClickEvent event, MenuController controller) { + if (pagePrevLocation == event.getSlot()) { + controller.openMenu(event.getWhoClicked(), this, currentPage - 1); + + } else if (pageNextLocation == event.getSlot()) { + controller.openMenu(event.getWhoClicked(), this, currentPage + 1); + + } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { + MenuElement element = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); + if (element instanceof CategoryMenuElement) { + CategoryMenuElement categoryMenuElement = (CategoryMenuElement) element; + QuestQMenu questQMenu = categoryMenuElement.getQuestMenu(); + if (owner.openCategory(plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()), questQMenu) != 0) { + event.getWhoClicked().sendMessage(Messages.QUEST_CATEGORY_PERMISSION.getMessage()); + } + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java b/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java new file mode 100644 index 00000000..a89765e4 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/DailyQMenu.java @@ -0,0 +1,106 @@ +//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 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 quests) { +// int slot = 11; +// for (Quest quest : quests) { +// slotsToQuestIds.put(slot, quest.getId()); +// slot++; +// if (slot == 16) { +// break; +// } +// } +// } +// +// @Override +// public HashMap 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 quests = new ArrayList<>(); +//// for (String requirement : quest.getRequirements()) { +//// quests.add(Quests.getQuestManager().getQuestById(requirement).getDisplayNameStripped()); +//// } +//// Map 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 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 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; +// } +//} diff --git a/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java b/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java index c1192c10..c3f1a94f 100644 --- a/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java +++ b/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java @@ -1,6 +1,8 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -47,4 +49,25 @@ public class MenuUtil { return newItemStack; } + public static void handleMiddleClick(QMenu menu, Quest quest, Player player, MenuController controller) { + if (menu.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { + String tracked = menu.getOwner().getQuestProgressFile().getPlayerPreferences().getTrackedQuestId(); + + if (quest.getId().equals(tracked)) { + menu.getOwner().getQuestProgressFile().trackQuest(null); + } else { + menu.getOwner().getQuestProgressFile().trackQuest(quest); + } + player.closeInventory(); + } + } + + public static void handleRightClick(QMenu menu, Quest quest, Player player, MenuController controller) { + if (menu.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { + if (Options.QUEST_AUTOSTART.getBooleanValue()) return; + CancelQMenu cancelQMenu = new CancelQMenu(menu.getOwner(), menu, quest); + controller.openMenu(player, cancelQMenu, 1); + } + } + } diff --git a/src/main/java/com/leonardobishop/quests/menu/QItemStack.java b/src/main/java/com/leonardobishop/quests/menu/QItemStack.java index 775e5cc1..e2a918dc 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QItemStack.java +++ b/src/main/java/com/leonardobishop/quests/menu/QItemStack.java @@ -93,19 +93,13 @@ public class QItemStack { Player player = Bukkit.getPlayer(questProgressFile.getPlayerUUID()); if (questProgressFile.hasStartedQuest(quest)) { boolean tracked = quest.getId().equals(questProgressFile.getPlayerPreferences().getTrackedQuestId()); - if (Options.GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE.getBooleanValue() && !globalLoreAppendStarted.isEmpty()) { - if (tracked) { - tempLore.addAll(globalLoreAppendTracked); - } else { - tempLore.addAll(globalLoreAppendStarted); - } - } else { + if (!Options.GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE.getBooleanValue() || globalLoreAppendStarted.isEmpty()) { tempLore.addAll(loreStarted); - if (tracked) { - tempLore.addAll(globalLoreAppendTracked); - } else { - tempLore.addAll(globalLoreAppendStarted); - } + } + if (tracked) { + tempLore.addAll(globalLoreAppendTracked); + } else { + tempLore.addAll(globalLoreAppendStarted); } ism.addEnchant(Enchantment.ARROW_INFINITE, 1, true); try { diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java b/src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java deleted file mode 100644 index 69c46374..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.leonardobishop.quests.menu; - -import com.leonardobishop.quests.events.MenuController; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -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; - -public class QMenuCancel implements QMenu { - - private final HashMap slotsToQuestIds = new HashMap<>(); - private final QMenu superMenu; - private final QPlayer owner; - private final Quest quest; - - public QMenuCancel(QPlayer owner, QMenu superMenu, Quest quest) { - this.owner = owner; - this.superMenu = superMenu; - this.quest = quest; - } - - public void populate(List quests) { - /* ignored */ - } - - public HashMap getSlotsToMenu() { - return slotsToQuestIds; - } - - public Quest getQuest() { - return quest; - } - - @Override - public QPlayer getOwner() { - return owner; - } - - public Inventory toInventory(int page) { - String title = Options.color(Options.GUITITLE_QUEST_CANCEL.getStringValue()); - - ItemStack yes = Items.QUEST_CANCEL_YES.getItem(); - ItemStack no = Items.QUEST_CANCEL_NO.getItem(); - - 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); - } - - inventory.setItem(10, no); - inventory.setItem(11, no); - inventory.setItem(12, no); - 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); - - return inventory; - } - - @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { - if (event.getSlot() == 10 || event.getSlot() == 11 || event.getSlot() == 12) { - QMenu qSuperMenu = this.getSuperMenu(); - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(qSuperMenu.toInventory(1)); - controller.getTracker().put(event.getWhoClicked().getUniqueId(), qSuperMenu); - } else if (event.getSlot() == 14 || event.getSlot() == 15 || event.getSlot() == 16) { - if (this.getOwner().getQuestProgressFile().cancelQuest(this.getQuest())) { - event.getWhoClicked().closeInventory(); - } - } - } - - public QMenu getSuperMenu() { - return superMenu; - } - -} diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java b/src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java deleted file mode 100644 index da06ae91..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.leonardobishop.quests.menu; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.events.MenuController; -import com.leonardobishop.quests.menu.object.CategoryMenuElement; -import com.leonardobishop.quests.menu.object.CustomMenuElement; -import com.leonardobishop.quests.menu.object.MenuElement; -import com.leonardobishop.quests.menu.object.QuestMenuElement; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quests.Category; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Messages; -import com.leonardobishop.quests.util.Options; -import org.apache.commons.lang.math.NumberUtils; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.awt.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Menu list of categories. - */ -public class QMenuCategory implements QMenu { - - private final Quests plugin; - private final int pageSize = 45; - private final HashMap menuElements = new HashMap<>(); - private final QPlayer owner; - - private int maxElement = 0; - private int pagePrevLocation = -1; - private int pageNextLocation = -1; - private int currentPage = -1; - - public QMenuCategory(Quests plugin, QPlayer owner) { - this.plugin = plugin; - this.owner = owner; - } - - public void populate(List menuQuests) { - if (plugin.getConfig().isConfigurationSection("custom-elements.categories")) { - for (String s : plugin.getConfig().getConfigurationSection("custom-elements.categories").getKeys(false)) { - if (!NumberUtils.isNumber(s)) continue; - int slot = Integer.parseInt(s); - int repeat = plugin.getConfig().getInt("custom-elements.categories." + s + ".repeat"); - ItemStack is = plugin.getItemStack("custom-elements.categories." + s + ".display", plugin.getConfig()); - - for (int i = 0; i <= repeat; i++) { - menuElements.put(slot + i, new CustomMenuElement(is)); - } - } - } - int slot = 0; - for (QMenuQuest qMenuQuest : menuQuests) { - while (menuElements.containsKey(slot)) slot++; - if (Options.GUI_HIDE_CATEGORIES_NOPERMISSION.getBooleanValue() && Quests.get().getQuestManager().getCategoryById(qMenuQuest.getCategoryName()).isPermissionRequired()) { - if (!Bukkit.getPlayer(owner.getUuid()).hasPermission("quests.category." + qMenuQuest.getCategoryName())) { - continue; - } - } - menuElements.put(slot, new CategoryMenuElement(plugin, owner.getUuid(), qMenuQuest)); - slot++; - } - - for (Integer integer : menuElements.keySet()) { - if (integer + 1 > maxElement) maxElement = integer + 1; - } - } - - @Override - public QPlayer getOwner() { - return owner; - } - - public Inventory toInventory(int page) { - currentPage = page; - int pageMin = pageSize * (page - 1); - int pageMax = pageSize * page; - String title = Options.color(Options.GUITITLE_QUESTS_CATEGORY.getStringValue()); - - ItemStack pageIs; - ItemStack pagePrevIs; - ItemStack pageNextIs; - Inventory inventory = Bukkit.createInventory(null, 54, title); - - int highestOnPage = 0; - for (int pointer = pageMin; pointer < pageMax; pointer++) { - if (menuElements.containsKey(pointer)) { - inventory.setItem(pointer - ((page - 1) * pageSize), menuElements.get(pointer).asItemStack()); - if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; - } - } - - pageNextLocation = -1; - pagePrevLocation = -1; - - Map pageplaceholders = new HashMap<>(); - pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); - pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); - pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); - pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_PREV.getItem(), pageplaceholders); - pageNextIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_NEXT.getItem(), pageplaceholders); - - if (maxElement > pageSize) { - inventory.setItem(49, pageIs); - if (page != 1) { - inventory.setItem(48, pagePrevIs); - pagePrevLocation = 48; - } - if (Math.ceil((double) maxElement / ((double) pageSize)) != page) { - inventory.setItem(50, pageNextIs); - pageNextLocation = 50; - } - } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { - int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); - inventorySize = inventorySize <= 0 ? 9 : inventorySize; - if (inventorySize == 54) { - return inventory; - } - - Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); - - for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { - trimmedInventory.setItem(slot, inventory.getItem(slot)); - } - return trimmedInventory; - } - return inventory; - } - - @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { - if (pagePrevLocation == event.getSlot()) { - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(this.toInventory(currentPage - 1)); - - } else if (pageNextLocation == event.getSlot()) { - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(this.toInventory(currentPage + 1)); - - } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { - MenuElement element = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); - if (element instanceof CategoryMenuElement) { - CategoryMenuElement categoryMenuElement = (CategoryMenuElement) element; - QMenuQuest qMenuQuest = categoryMenuElement.getQuestMenu(); - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - if (this.getOwner().openCategory(plugin.getQuestManager().getCategoryById(qMenuQuest.getCategoryName()), qMenuQuest) != 0) { - controller.getBuffer().remove(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().sendMessage(Messages.QUEST_CATEGORY_PERMISSION.getMessage()); - } - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuDaily.java b/src/main/java/com/leonardobishop/quests/menu/QMenuDaily.java deleted file mode 100644 index a89765e4..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuDaily.java +++ /dev/null @@ -1,106 +0,0 @@ -//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 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 quests) { -// int slot = 11; -// for (Quest quest : quests) { -// slotsToQuestIds.put(slot, quest.getId()); -// slot++; -// if (slot == 16) { -// break; -// } -// } -// } -// -// @Override -// public HashMap 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 quests = new ArrayList<>(); -//// for (String requirement : quest.getRequirements()) { -//// quests.add(Quests.getQuestManager().getQuestById(requirement).getDisplayNameStripped()); -//// } -//// Map 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 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 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; -// } -//} diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java b/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java deleted file mode 100644 index 7a2b8f69..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java +++ /dev/null @@ -1,285 +0,0 @@ -package com.leonardobishop.quests.menu; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.events.MenuController; -import com.leonardobishop.quests.menu.object.CustomMenuElement; -import com.leonardobishop.quests.menu.object.MenuElement; -import com.leonardobishop.quests.menu.object.QuestMenuElement; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; -import org.apache.commons.lang.math.NumberUtils; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -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.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -/** - * Menu for a specific category. - */ -public class QMenuQuest implements QMenu { - - private final Quests plugin; - private final HashMap menuElements = new HashMap<>(); - private final QMenuCategory superMenu; - private final String categoryName; - private final int pageSize = 45; - private final QPlayer owner; - - private int maxElement = 0; - private int backButtonLocation = -1; - private int pagePrevLocation = -1; - private int pageNextLocation = -1; - private int currentPage = -1; - private boolean backButtonEnabled = true; - - public QMenuQuest(Quests plugin, QPlayer owner, String categoryName, QMenuCategory superMenu) { - this.plugin = plugin; - this.owner = owner; - this.categoryName = categoryName; - this.superMenu = superMenu; - } - - public void populate(List quests) { - String path; - if (Options.CATEGORIES_ENABLED.getBooleanValue()) { - path = "custom-elements.c:" + categoryName; - } else { - path = "custom-elements.quests"; - } - if (plugin.getConfig().isConfigurationSection(path)) { - for (String s : plugin.getConfig().getConfigurationSection(path).getKeys(false)) { - if (!NumberUtils.isNumber(s)) continue; - int slot = Integer.parseInt(s); - int repeat = plugin.getConfig().getInt(path + "." + s + ".repeat"); - ItemStack is = plugin.getItemStack(path + "." + s + ".display", plugin.getConfig()); - - for (int i = 0; i <= repeat; i++) { - menuElements.put(slot + i, new CustomMenuElement(is)); - } - } - } - - Collections.sort(quests); - int slot = 0; - for (Quest quest : quests) { - while (menuElements.containsKey(slot)) slot++; - if (Options.GUI_HIDE_LOCKED.getBooleanValue()) { - QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); - long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); - if (!owner.getQuestProgressFile().hasMetRequirements(quest) || (!quest.isRepeatable() && questProgress.isCompletedBefore()) || cooldown > 0) { - continue; - } - } - if (Options.GUI_HIDE_QUESTS_NOPERMISSION.getBooleanValue() && quest.isPermissionRequired()) { - if (!Bukkit.getPlayer(owner.getUuid()).hasPermission("quests.quest." + quest.getId())) { - continue; - } - } - menuElements.put(slot, new QuestMenuElement(plugin, owner, quest.getId())); - slot++; - } - - for (Integer integer : menuElements.keySet()) { - if (integer + 1 > maxElement) maxElement = integer + 1; - } - } - - @Override - public QPlayer getOwner() { - return owner; - } - - public String getCategoryName() { - return categoryName; - } - - public int getPagePrevLocation() { - return pagePrevLocation; - } - - public int getPageNextLocation() { - return pageNextLocation; - } - - public int getCurrentPage() { - return currentPage; - } - - public int getPageSize() { - return pageSize; - } - - public Inventory toInventory(int page) { - currentPage = page; - int pageMin = pageSize * (page - 1); - int pageMax = pageSize * page; - String title = Options.color(Options.GUITITLE_QUESTS.getStringValue()); - - ItemStack pageIs; - ItemStack pagePrevIs; - ItemStack pageNextIs; - ItemStack back = Items.BACK_BUTTON.getItem(); - - Inventory inventory = Bukkit.createInventory(null, 54, title); - - int highestOnPage = 0; - for (int pointer = pageMin; pointer < pageMax; pointer++) { - if (menuElements.containsKey(pointer)) { - inventory.setItem(pointer - ((page - 1) * pageSize), menuElements.get(pointer).asItemStack()); - if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; - } - } - - pageNextLocation = -1; - pagePrevLocation = -1; - - Map pageplaceholders = new HashMap<>(); - pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); - pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); - pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = replaceItemStack(Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); - pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = replaceItemStack(Items.PAGE_PREV.getItem(), pageplaceholders); - pageNextIs = replaceItemStack(Items.PAGE_NEXT.getItem(), pageplaceholders); - - if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) { - inventory.setItem(45, back); - backButtonLocation = 45; - } - if (maxElement > pageSize) { - inventory.setItem(49, pageIs); - if (page != 1) { - inventory.setItem(48, pagePrevIs); - pagePrevLocation = 48; - } - if (Math.ceil((double) maxElement / ((double) pageSize)) != page) { - inventory.setItem(50, pageNextIs); - pageNextLocation = 50; - } - } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { - int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); - inventorySize = inventorySize <= 0 ? 9 : inventorySize; - if (inventorySize == 54) { - return inventory; - } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) { - inventorySize += 9; - } - - Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); - - for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { - if (slot >= (trimmedInventory.getSize() - 9) && backButtonEnabled){ - if (Options.CATEGORIES_ENABLED.getBooleanValue()) { - trimmedInventory.setItem(slot, back); - backButtonLocation = slot; - } - break; - } - trimmedInventory.setItem(slot, inventory.getItem(slot)); - } - return trimmedInventory; - } - - return inventory; - } - - @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { - //TODO make everything a menu element cuz this is jank - if (pagePrevLocation == event.getSlot()) { - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(this.toInventory(currentPage - 1)); - - } else if (pageNextLocation == event.getSlot()) { - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(this.toInventory(currentPage + 1)); - - } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonLocation == event.getSlot()) { - QMenuCategory qMenuCategory = this.getSuperMenu(); - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(qMenuCategory.toInventory(1)); - controller.getTracker().put(event.getWhoClicked().getUniqueId(), qMenuCategory); - - } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { - MenuElement menuElement = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); - 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 (this.getOwner().getQuestProgressFile().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()) { - controller.middleClickQuest(this, quest, Bukkit.getPlayer(this.getOwner().getUuid())); - } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() - && this.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { - controller.rightClickQuest(this, quest, Bukkit.getPlayer(this.getOwner().getUuid())); - } - } - } - } - - public boolean isBackButtonEnabled() { - return backButtonEnabled; - } - - public void setBackButtonEnabled(boolean backButtonEnabled) { - this.backButtonEnabled = backButtonEnabled; - } - - public int getBackButtonLocation() { - return backButtonLocation; - } - - public QMenuCategory getSuperMenu() { - return superMenu; - } - - public ItemStack replaceItemStack(ItemStack is) { - return replaceItemStack(is, Collections.emptyMap()); - } - - public ItemStack replaceItemStack(ItemStack is, Map placeholders) { - ItemStack newItemStack = is.clone(); - List lore = newItemStack.getItemMeta().getLore(); - List newLore = new ArrayList<>(); - ItemMeta ism = newItemStack.getItemMeta(); - Player player = Bukkit.getPlayer(owner.getUuid()); - if (lore != null) { - for (String s : lore) { - for (Map.Entry entry : placeholders.entrySet()) { - s = s.replace(entry.getKey(), entry.getValue()); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); - } - } - newLore.add(s); - } - } - for (Map.Entry entry : placeholders.entrySet()) { - ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); - } - } - ism.setLore(newLore); - newItemStack.setItemMeta(ism); - return newItemStack; - } -} diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java b/src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java deleted file mode 100644 index fbbfae69..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.leonardobishop.quests.menu; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.events.MenuController; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -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.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class QMenuStarted implements QMenu { - - private final Quests plugin; - private final HashMap slotsToQuestIds = new HashMap<>(); - private final int pageSize = 45; - private final QPlayer owner; - - private int pagePrevLocation = -1; - private int pageNextLocation = -1; - private int currentPage = -1; - - public QMenuStarted(Quests plugin, QPlayer owner) { - this.plugin = plugin; - this.owner = owner; - } - - public void populate(List quests) { - Collections.sort(quests); - int slot = 0; - for (QuestSortWrapper quest : quests) { - if (owner.getQuestProgressFile().hasStartedQuest(quest.getQuest())) { - slotsToQuestIds.put(slot, quest.getQuest().getId()); - slot++; - } - } - } - - public HashMap getSlotsToMenu() { - return slotsToQuestIds; - } - - @Override - public QPlayer getOwner() { - return owner; - } - - public int getPagePrevLocation() { - return pagePrevLocation; - } - - public int getPageNextLocation() { - return pageNextLocation; - } - - public int getCurrentPage() { - return currentPage; - } - - public int getPageSize() { - return pageSize; - } - - public Inventory toInventory(int page) { - currentPage = page; - int pageMin = pageSize * (page - 1); - int pageMax = pageSize * page; - String title = Options.color(Options.GUITITLE_QUESTS_STARTED.getStringValue()); - - ItemStack pageIs; - ItemStack pagePrevIs; - ItemStack pageNextIs; - ItemStack none = Items.NO_STARTED_QUESTS.getItem(); - - Inventory inventory = Bukkit.createInventory(null, 54, title); - - int invSlot = 0; - if (!slotsToQuestIds.isEmpty()) { - for (int pointer = pageMin; pointer < pageMax; pointer++) { - if (slotsToQuestIds.containsKey(pointer)) { - Quest quest = Quests.get().getQuestManager().getQuestById(slotsToQuestIds.get(pointer)); - QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); - - inventory.setItem(invSlot, MenuUtil.applyPlaceholders(plugin, owner.getUuid(), plugin.getQuestManager().getQuestById( - quest.getId()).getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress))); - } - invSlot++; - } - } else { - inventory.setItem(4, none); - } - - pageNextLocation = -1; - pagePrevLocation = -1; - - Map pageplaceholders = new HashMap<>(); - pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); - pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); - pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); - pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_PREV.getItem(), pageplaceholders); - pageNextIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_NEXT.getItem(), pageplaceholders); - - if (slotsToQuestIds.size() > pageSize) { - inventory.setItem(49, pageIs); - if (page != 1) { - inventory.setItem(48, pagePrevIs); - pagePrevLocation = 48; - } - if (Math.ceil((double) slotsToQuestIds.size() / ((double) 45)) != page) { - inventory.setItem(50, pageNextIs); - pageNextLocation = 50; - } - } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { - int slotsUsed = 0; - for (int pointer = 0; pointer < pageMax; pointer++) { - if (inventory.getItem(pointer) != null) { - slotsUsed++; - } - } - - int inventorySize = (slotsUsed >= 54) ? 54 : slotsUsed + (9 - slotsUsed % 9) * Math.min(1, slotsUsed % 9); - inventorySize = inventorySize <= 0 ? 9 : inventorySize; - if (inventorySize == 54) { - return inventory; - } - - Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); - - for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { - trimmedInventory.setItem(slot, inventory.getItem(slot)); - } - return trimmedInventory; - } - - return inventory; - } - - @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { - if (this.getPagePrevLocation() == event.getSlot()) { - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(this.toInventory(this.getCurrentPage() - 1)); - - } else if (this.getPageNextLocation() == event.getSlot()) { - controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(this.toInventory(this.getCurrentPage() + 1)); - - } else if (event.getSlot() < this.getPageSize() && this.getSlotsToMenu().containsKey(event.getSlot() + (((this - .getCurrentPage()) - 1) * this.getPageSize()))) { - - // repeat from above - String questid = this.getSlotsToMenu().get(event.getSlot() + (((this.getCurrentPage()) - 1) * this.getPageSize())); - Quest quest = plugin.getQuestManager().getQuestById(questid); - if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) { - controller.middleClickQuest(this, quest, Bukkit.getPlayer(this.getOwner().getUuid())); - } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() - && this.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { - controller.rightClickQuest(this, quest, Bukkit.getPlayer(this.getOwner().getUuid())); - } - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java b/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java new file mode 100644 index 00000000..0499174c --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QuestQMenu.java @@ -0,0 +1,279 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.api.enums.QuestStartResult; +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.menu.element.CustomMenuElement; +import com.leonardobishop.quests.menu.element.MenuElement; +import com.leonardobishop.quests.menu.element.QuestMenuElement; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.util.Items; +import com.leonardobishop.quests.util.Options; +import org.apache.commons.lang.math.NumberUtils; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +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.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Represents a menu for a specified category (or all if they are disabled), + * which contains a listing of different quests. + */ +public class QuestQMenu implements QMenu { + + private final Quests plugin; + private final HashMap menuElements = new HashMap<>(); + private final CategoryQMenu superMenu; + private final String categoryName; + private final int pageSize = 45; + private final QPlayer owner; + + private int maxElement = 0; + private int backButtonLocation = -1; + private int pagePrevLocation = -1; + private int pageNextLocation = -1; + private int currentPage = -1; + private boolean backButtonEnabled = true; + + public QuestQMenu(Quests plugin, QPlayer owner, String categoryName, CategoryQMenu superMenu) { + this.plugin = plugin; + this.owner = owner; + this.categoryName = categoryName; + this.superMenu = superMenu; + } + + public void populate(List quests) { + String path; + if (Options.CATEGORIES_ENABLED.getBooleanValue()) { + path = "custom-elements.c:" + categoryName; + } else { + path = "custom-elements.quests"; + } + if (plugin.getConfig().isConfigurationSection(path)) { + for (String s : plugin.getConfig().getConfigurationSection(path).getKeys(false)) { + if (!NumberUtils.isNumber(s)) continue; + int slot = Integer.parseInt(s); + int repeat = plugin.getConfig().getInt(path + "." + s + ".repeat"); + ItemStack is = plugin.getItemStack(path + "." + s + ".display", plugin.getConfig()); + + for (int i = 0; i <= repeat; i++) { + menuElements.put(slot + i, new CustomMenuElement(is)); + } + } + } + + Collections.sort(quests); + int slot = 0; + for (Quest quest : quests) { + while (menuElements.containsKey(slot)) slot++; + if (Options.GUI_HIDE_LOCKED.getBooleanValue()) { + QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); + long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); + if (!owner.getQuestProgressFile().hasMetRequirements(quest) || (!quest.isRepeatable() && questProgress.isCompletedBefore()) || cooldown > 0) { + continue; + } + } + if (Options.GUI_HIDE_QUESTS_NOPERMISSION.getBooleanValue() && quest.isPermissionRequired()) { + if (!Bukkit.getPlayer(owner.getUuid()).hasPermission("quests.quest." + quest.getId())) { + continue; + } + } + menuElements.put(slot, new QuestMenuElement(plugin, owner, quest.getId())); + slot++; + } + + for (Integer integer : menuElements.keySet()) { + if (integer + 1 > maxElement) maxElement = integer + 1; + } + } + + @Override + public QPlayer getOwner() { + return owner; + } + + public String getCategoryName() { + return categoryName; + } + + public int getPagePrevLocation() { + return pagePrevLocation; + } + + public int getPageNextLocation() { + return pageNextLocation; + } + + public int getCurrentPage() { + return currentPage; + } + + public int getPageSize() { + return pageSize; + } + + public Inventory toInventory(int page) { + currentPage = page; + int pageMin = pageSize * (page - 1); + int pageMax = pageSize * page; + String title = Options.color(Options.GUITITLE_QUESTS.getStringValue()); + + ItemStack pageIs; + ItemStack pagePrevIs; + ItemStack pageNextIs; + ItemStack back = Items.BACK_BUTTON.getItem(); + + Inventory inventory = Bukkit.createInventory(null, 54, title); + + int highestOnPage = 0; + for (int pointer = pageMin; pointer < pageMax; pointer++) { + if (menuElements.containsKey(pointer)) { + inventory.setItem(pointer - ((page - 1) * pageSize), menuElements.get(pointer).asItemStack()); + if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; + } + } + + pageNextLocation = -1; + pagePrevLocation = -1; + + Map pageplaceholders = new HashMap<>(); + pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); + pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); + pageplaceholders.put("{page}", String.valueOf(page)); + pageIs = replaceItemStack(Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs.setAmount(Math.min(page, 64)); + pagePrevIs = replaceItemStack(Items.PAGE_PREV.getItem(), pageplaceholders); + pageNextIs = replaceItemStack(Items.PAGE_NEXT.getItem(), pageplaceholders); + + if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) { + inventory.setItem(45, back); + backButtonLocation = 45; + } + if (maxElement > pageSize) { + inventory.setItem(49, pageIs); + if (page != 1) { + inventory.setItem(48, pagePrevIs); + pagePrevLocation = 48; + } + if (Math.ceil((double) maxElement / ((double) pageSize)) != page) { + inventory.setItem(50, pageNextIs); + pageNextLocation = 50; + } + } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { + int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); + inventorySize = inventorySize <= 0 ? 9 : inventorySize; + if (inventorySize == 54) { + return inventory; + } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) { + inventorySize += 9; + } + + Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); + + for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { + if (slot >= (trimmedInventory.getSize() - 9) && backButtonEnabled){ + if (Options.CATEGORIES_ENABLED.getBooleanValue()) { + trimmedInventory.setItem(slot, back); + backButtonLocation = slot; + } + break; + } + trimmedInventory.setItem(slot, inventory.getItem(slot)); + } + return trimmedInventory; + } + + return inventory; + } + + @Override + public void handleClick(InventoryClickEvent event, MenuController controller) { + //TODO maybe redo this maybe + if (pagePrevLocation == event.getSlot()) { + controller.openMenu(event.getWhoClicked(), this, currentPage - 1); + + } else if (pageNextLocation == event.getSlot()) { + controller.openMenu(event.getWhoClicked(), this, currentPage + 1); + + } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonLocation == event.getSlot()) { + controller.openMenu(event.getWhoClicked(), this.getSuperMenu(), 1); + + } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { + MenuElement menuElement = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); + 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 (this.getOwner().getQuestProgressFile().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.getUuid()), controller); + } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() + && this.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { + MenuUtil.handleRightClick(this, quest, Bukkit.getPlayer(owner.getUuid()), controller); + } + } + } + } + + public boolean isBackButtonEnabled() { + return backButtonEnabled; + } + + public void setBackButtonEnabled(boolean backButtonEnabled) { + this.backButtonEnabled = backButtonEnabled; + } + + public int getBackButtonLocation() { + return backButtonLocation; + } + + public CategoryQMenu getSuperMenu() { + return superMenu; + } + + public ItemStack replaceItemStack(ItemStack is) { + return replaceItemStack(is, Collections.emptyMap()); + } + + public ItemStack replaceItemStack(ItemStack is, Map placeholders) { + ItemStack newItemStack = is.clone(); + List lore = newItemStack.getItemMeta().getLore(); + List newLore = new ArrayList<>(); + ItemMeta ism = newItemStack.getItemMeta(); + Player player = Bukkit.getPlayer(owner.getUuid()); + if (lore != null) { + for (String s : lore) { + for (Map.Entry entry : placeholders.entrySet()) { + s = s.replace(entry.getKey(), entry.getValue()); + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); + } + } + newLore.add(s); + } + } + for (Map.Entry entry : placeholders.entrySet()) { + ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); + } + } + ism.setLore(newLore); + newItemStack.setItemMeta(ism); + return newItemStack; + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java b/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java new file mode 100644 index 00000000..4bb06bfe --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/StartedQMenu.java @@ -0,0 +1,173 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.quests.Quest; +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 java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Represents a menu listing quests the player has started. + */ +public class StartedQMenu implements QMenu { + + private final Quests plugin; + private final HashMap slotsToQuestIds = new HashMap<>(); + private final int pageSize = 45; + private final QPlayer owner; + + private int pagePrevLocation = -1; + private int pageNextLocation = -1; + private int currentPage = -1; + + public StartedQMenu(Quests plugin, QPlayer owner) { + this.plugin = plugin; + this.owner = owner; + } + + public void populate(List quests) { + Collections.sort(quests); + int slot = 0; + for (QuestSortWrapper quest : quests) { + if (owner.getQuestProgressFile().hasStartedQuest(quest.getQuest())) { + slotsToQuestIds.put(slot, quest.getQuest().getId()); + slot++; + } + } + } + + public HashMap getSlotsToMenu() { + return slotsToQuestIds; + } + + @Override + public QPlayer getOwner() { + return owner; + } + + public int getPagePrevLocation() { + return pagePrevLocation; + } + + public int getPageNextLocation() { + return pageNextLocation; + } + + public int getCurrentPage() { + return currentPage; + } + + public int getPageSize() { + return pageSize; + } + + public Inventory toInventory(int page) { + currentPage = page; + int pageMin = pageSize * (page - 1); + int pageMax = pageSize * page; + String title = Options.color(Options.GUITITLE_QUESTS_STARTED.getStringValue()); + + ItemStack pageIs; + ItemStack pagePrevIs; + ItemStack pageNextIs; + ItemStack none = Items.NO_STARTED_QUESTS.getItem(); + + Inventory inventory = Bukkit.createInventory(null, 54, title); + + int invSlot = 0; + if (!slotsToQuestIds.isEmpty()) { + for (int pointer = pageMin; pointer < pageMax; pointer++) { + if (slotsToQuestIds.containsKey(pointer)) { + Quest quest = plugin.getQuestManager().getQuestById(slotsToQuestIds.get(pointer)); + QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); + + inventory.setItem(invSlot, MenuUtil.applyPlaceholders(plugin, owner.getUuid(), plugin.getQuestManager().getQuestById( + quest.getId()).getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress))); + } + invSlot++; + } + } else { + inventory.setItem(4, none); + } + + pageNextLocation = -1; + pagePrevLocation = -1; + + Map pageplaceholders = new HashMap<>(); + pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); + pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); + pageplaceholders.put("{page}", String.valueOf(page)); + pageIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs.setAmount(Math.min(page, 64)); + pagePrevIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_PREV.getItem(), pageplaceholders); + pageNextIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_NEXT.getItem(), pageplaceholders); + + if (slotsToQuestIds.size() > pageSize) { + inventory.setItem(49, pageIs); + if (page != 1) { + inventory.setItem(48, pagePrevIs); + pagePrevLocation = 48; + } + if (Math.ceil((double) slotsToQuestIds.size() / ((double) 45)) != page) { + inventory.setItem(50, pageNextIs); + pageNextLocation = 50; + } + } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { + int slotsUsed = 0; + for (int pointer = 0; pointer < pageMax; pointer++) { + if (inventory.getItem(pointer) != null) { + slotsUsed++; + } + } + + int inventorySize = (slotsUsed >= 54) ? 54 : slotsUsed + (9 - slotsUsed % 9) * Math.min(1, slotsUsed % 9); + inventorySize = inventorySize <= 0 ? 9 : inventorySize; + if (inventorySize == 54) { + return inventory; + } + + Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); + + for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { + trimmedInventory.setItem(slot, inventory.getItem(slot)); + } + return trimmedInventory; + } + + return inventory; + } + + @Override + public void handleClick(InventoryClickEvent event, MenuController controller) { + if (pagePrevLocation == event.getSlot()) { + controller.openMenu(event.getWhoClicked(), this, currentPage - 1); + + } else if (pageNextLocation == event.getSlot()) { + controller.openMenu(event.getWhoClicked(), this, currentPage + 1); + + } else if (event.getSlot() < pageSize && slotsToQuestIds.containsKey(event.getSlot() + ((currentPage) - 1) * pageSize)) { + + // repeat from above + String questid = slotsToQuestIds.get(event.getSlot() + (((currentPage) - 1) * pageSize)); + Quest quest = plugin.getQuestManager().getQuestById(questid); + if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) { + MenuUtil.handleMiddleClick(this, quest, Bukkit.getPlayer(owner.getUuid()), controller); + } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() + && owner.getQuestProgressFile().hasStartedQuest(quest)) { + MenuUtil.handleRightClick(this, quest, Bukkit.getPlayer(owner.getUuid()), controller); + } + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java new file mode 100644 index 00000000..2e1376eb --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/element/CategoryMenuElement.java @@ -0,0 +1,65 @@ +package com.leonardobishop.quests.menu.element; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.menu.QuestQMenu; +import com.leonardobishop.quests.quests.Category; +import com.leonardobishop.quests.util.Options; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class CategoryMenuElement extends MenuElement { + + private final Quests plugin; + private final UUID owner; + private final QuestQMenu questMenu; + + public CategoryMenuElement(Quests plugin, UUID owner, QuestQMenu questMenu) { + this.plugin = plugin; + this.owner = owner; + this.questMenu = questMenu; + } + + public UUID getOwner() { + return owner; + } + + public QuestQMenu getQuestMenu() { + return questMenu; + } + + @Override + public ItemStack asItemStack() { + Category category = plugin.getQuestManager().getCategoryById(questMenu.getCategoryName()); + if (category != null) { + return replaceItemStack(category.getDisplayItem()); + } + return null; + } + + private ItemStack replaceItemStack(ItemStack is) { + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + ItemStack newItemStack = is.clone(); + List lore = newItemStack.getItemMeta().getLore(); + List newLore = new ArrayList<>(); + ItemMeta ism = newItemStack.getItemMeta(); + Player player = Bukkit.getPlayer(owner); + ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); + if (lore != null) { + for (String s : lore) { + s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); + newLore.add(s); + } + } + ism.setLore(newLore); + newItemStack.setItemMeta(ism); + return newItemStack; + } + return is; + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/element/CustomMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/element/CustomMenuElement.java new file mode 100644 index 00000000..d1986f18 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/element/CustomMenuElement.java @@ -0,0 +1,17 @@ +package com.leonardobishop.quests.menu.element; + +import org.bukkit.inventory.ItemStack; + +public class CustomMenuElement extends MenuElement{ + + private ItemStack itemStack; + + public CustomMenuElement(ItemStack itemStack) { + this.itemStack = itemStack; + } + + @Override + public ItemStack asItemStack() { + return itemStack; + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/element/MenuElement.java b/src/main/java/com/leonardobishop/quests/menu/element/MenuElement.java new file mode 100644 index 00000000..a7ee580a --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/element/MenuElement.java @@ -0,0 +1,9 @@ +package com.leonardobishop.quests.menu.element; + +import org.bukkit.inventory.ItemStack; + +public abstract class MenuElement { + + public abstract ItemStack asItemStack(); + +} diff --git a/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java new file mode 100644 index 00000000..e1cd6c22 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/element/QuestMenuElement.java @@ -0,0 +1,108 @@ +package com.leonardobishop.quests.menu.element; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.util.Items; +import com.leonardobishop.quests.util.Options; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class QuestMenuElement extends MenuElement { + + private final Quests plugin; + private final QPlayer owner; + private final String questId; + + public QuestMenuElement(Quests plugin, QPlayer owner, String questId) { + this.plugin = plugin; + this.owner = owner; + this.questId = questId; + } + + public QPlayer getOwner() { + return owner; + } + + public String getQuestId() { + return questId; + } + + @Override + public ItemStack asItemStack() { + Quest quest = plugin.getQuestManager().getQuestById(questId); + QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); + long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); + if (!owner.getQuestProgressFile().hasMetRequirements(quest)) { + List quests = new ArrayList<>(); + for (String requirement : quest.getRequirements()) { + quests.add(plugin.getQuestManager().getQuestById(requirement).getDisplayNameStripped()); + } + Map placeholders = new HashMap<>(); + placeholders.put("{quest}", quest.getDisplayNameStripped()); + placeholders.put("{requirements}", String.join(", ", quests)); + ItemStack is = replaceItemStack(Items.QUEST_LOCKED.getItem(), placeholders); + return is; + } else if (!quest.isRepeatable() && questProgress.isCompletedBefore()) { + Map 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.getUuid()).hasPermission("quests.quest." + quest.getId())) { + Map placeholders = new HashMap<>(); + placeholders.put("{quest}", quest.getDisplayNameStripped()); + ItemStack is = replaceItemStack(Items.QUEST_PERMISSION.getItem(), placeholders); + return is; + } else if (cooldown > 0) { + Map placeholders = new HashMap<>(); + placeholders.put("{time}", plugin.convertToFormat(TimeUnit.SECONDS.convert(cooldown, TimeUnit.MILLISECONDS))); + placeholders.put("{quest}", quest.getDisplayNameStripped()); + ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders); + return is; + } else { + return replaceItemStack(quest.getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress)); + } + } + + private ItemStack replaceItemStack(ItemStack is) { + return replaceItemStack(is, Collections.emptyMap()); + } + + private ItemStack replaceItemStack(ItemStack is, Map placeholders) { + ItemStack newItemStack = is.clone(); + List lore = newItemStack.getItemMeta().getLore(); + List newLore = new ArrayList<>(); + ItemMeta ism = newItemStack.getItemMeta(); + Player player = Bukkit.getPlayer(owner.getUuid()); + if (lore != null) { + for (String s : lore) { + for (Map.Entry entry : placeholders.entrySet()) { + s = s.replace(entry.getKey(), entry.getValue()); + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); + } + } + newLore.add(s); + } + } + for (Map.Entry entry : placeholders.entrySet()) { + ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); + } + } + ism.setLore(newLore); + newItemStack.setItemMeta(ism); + return newItemStack; + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/object/CategoryMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/object/CategoryMenuElement.java deleted file mode 100644 index be71ef91..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/object/CategoryMenuElement.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.leonardobishop.quests.menu.object; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.menu.QMenuQuest; -import com.leonardobishop.quests.quests.Category; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -public class CategoryMenuElement extends MenuElement { - - private final Quests plugin; - private final UUID owner; - private final QMenuQuest questMenu; - - public CategoryMenuElement(Quests plugin, UUID owner, QMenuQuest questMenu) { - this.plugin = plugin; - this.owner = owner; - this.questMenu = questMenu; - } - - public UUID getOwner() { - return owner; - } - - public QMenuQuest getQuestMenu() { - return questMenu; - } - - @Override - public ItemStack asItemStack() { - Category category = plugin.getQuestManager().getCategoryById(questMenu.getCategoryName()); - if (category != null) { - return replaceItemStack(category.getDisplayItem()); - } - return null; - } - - private ItemStack replaceItemStack(ItemStack is) { - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - ItemStack newItemStack = is.clone(); - List lore = newItemStack.getItemMeta().getLore(); - List newLore = new ArrayList<>(); - ItemMeta ism = newItemStack.getItemMeta(); - Player player = Bukkit.getPlayer(owner); - ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); - if (lore != null) { - for (String s : lore) { - s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); - newLore.add(s); - } - } - ism.setLore(newLore); - newItemStack.setItemMeta(ism); - return newItemStack; - } - return is; - } -} diff --git a/src/main/java/com/leonardobishop/quests/menu/object/CustomMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/object/CustomMenuElement.java deleted file mode 100644 index d88a0cf9..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/object/CustomMenuElement.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.leonardobishop.quests.menu.object; - -import org.bukkit.inventory.ItemStack; - -public class CustomMenuElement extends MenuElement{ - - private ItemStack itemStack; - - public CustomMenuElement(ItemStack itemStack) { - this.itemStack = itemStack; - } - - @Override - public ItemStack asItemStack() { - return itemStack; - } -} diff --git a/src/main/java/com/leonardobishop/quests/menu/object/MenuElement.java b/src/main/java/com/leonardobishop/quests/menu/object/MenuElement.java deleted file mode 100644 index 9d5cceb6..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/object/MenuElement.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.leonardobishop.quests.menu.object; - -import org.bukkit.inventory.ItemStack; - -public abstract class MenuElement { - - public abstract ItemStack asItemStack(); - -} diff --git a/src/main/java/com/leonardobishop/quests/menu/object/QuestMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/object/QuestMenuElement.java deleted file mode 100644 index 9adc8fa2..00000000 --- a/src/main/java/com/leonardobishop/quests/menu/object/QuestMenuElement.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.leonardobishop.quests.menu.object; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quests.Quest; -import com.leonardobishop.quests.util.Items; -import com.leonardobishop.quests.util.Options; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -public class QuestMenuElement extends MenuElement { - - private final Quests plugin; - private final QPlayer owner; - private final String questId; - - public QuestMenuElement(Quests plugin, QPlayer owner, String questId) { - this.plugin = plugin; - this.owner = owner; - this.questId = questId; - } - - public QPlayer getOwner() { - return owner; - } - - public String getQuestId() { - return questId; - } - - @Override - public ItemStack asItemStack() { - Quest quest = plugin.getQuestManager().getQuestById(questId); - QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); - long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); - if (!owner.getQuestProgressFile().hasMetRequirements(quest)) { - List quests = new ArrayList<>(); - for (String requirement : quest.getRequirements()) { - quests.add(Quests.get().getQuestManager().getQuestById(requirement).getDisplayNameStripped()); - } - Map placeholders = new HashMap<>(); - placeholders.put("{quest}", quest.getDisplayNameStripped()); - placeholders.put("{requirements}", String.join(", ", quests)); - ItemStack is = replaceItemStack(Items.QUEST_LOCKED.getItem(), placeholders); - return is; - } else if (!quest.isRepeatable() && questProgress.isCompletedBefore()) { - Map 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.getUuid()).hasPermission("quests.quest." + quest.getId())) { - Map placeholders = new HashMap<>(); - placeholders.put("{quest}", quest.getDisplayNameStripped()); - ItemStack is = replaceItemStack(Items.QUEST_PERMISSION.getItem(), placeholders); - return is; - } else if (cooldown > 0) { - Map placeholders = new HashMap<>(); - placeholders.put("{time}", Quests.get().convertToFormat(TimeUnit.SECONDS.convert(cooldown, TimeUnit.MILLISECONDS))); - placeholders.put("{quest}", quest.getDisplayNameStripped()); - ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders); - return is; - } else { - return replaceItemStack(quest.getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress)); - } - } - - private ItemStack replaceItemStack(ItemStack is) { - return replaceItemStack(is, Collections.emptyMap()); - } - - private ItemStack replaceItemStack(ItemStack is, Map placeholders) { - ItemStack newItemStack = is.clone(); - List lore = newItemStack.getItemMeta().getLore(); - List newLore = new ArrayList<>(); - ItemMeta ism = newItemStack.getItemMeta(); - Player player = Bukkit.getPlayer(owner.getUuid()); - if (lore != null) { - for (String s : lore) { - for (Map.Entry entry : placeholders.entrySet()) { - s = s.replace(entry.getKey(), entry.getValue()); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); - } - } - newLore.add(s); - } - } - for (Map.Entry entry : placeholders.entrySet()) { - ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); - } - } - ism.setLore(newLore); - newItemStack.setItemMeta(ism); - return newItemStack; - } -} diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayer.java b/src/main/java/com/leonardobishop/quests/player/QPlayer.java index b2dba6fe..9b4807e9 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayer.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayer.java @@ -1,11 +1,10 @@ package com.leonardobishop.quests.player; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.events.MenuController; -import com.leonardobishop.quests.menu.QMenuCategory; -import com.leonardobishop.quests.menu.QMenuQuest; -import com.leonardobishop.quests.menu.QMenuStarted; +import com.leonardobishop.quests.menu.CategoryQMenu; +import com.leonardobishop.quests.menu.QuestQMenu; import com.leonardobishop.quests.menu.QuestSortWrapper; +import com.leonardobishop.quests.menu.StartedQMenu; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.quests.Category; import com.leonardobishop.quests.quests.Quest; @@ -37,7 +36,7 @@ public class QPlayer { /** * @return 0 if success, 1 if no permission, 2 is only data loaded, 3 if player not found */ - public int openCategory(Category category, QMenuCategory superMenu, boolean backButton) { + public int openCategory(Category category, CategoryQMenu superMenu, boolean backButton) { Player player = Bukkit.getPlayer(this.uuid); if (player == null) { return 3; @@ -48,7 +47,7 @@ public class QPlayer { } // Using `this` instead of searching again for this QPlayer - QMenuQuest qMenuQuest = new QMenuQuest(plugin, this, category.getId(), superMenu); + QuestQMenu questQMenu = new QuestQMenu(plugin, this, category.getId(), superMenu); List quests = new ArrayList<>(); for (String questid : category.getRegisteredQuestIds()) { Quest quest = plugin.getQuestManager().getQuestById(questid); @@ -56,15 +55,15 @@ public class QPlayer { quests.add(quest); } } - qMenuQuest.populate(quests); - qMenuQuest.setBackButtonEnabled(backButton); - return openCategory(category, qMenuQuest); + questQMenu.populate(quests); + questQMenu.setBackButtonEnabled(backButton); + return openCategory(category, questQMenu); } /** * @return 0 if success, 1 if no permission, 2 is only data loaded, 3 if player not found */ - public int openCategory(Category category, QMenuQuest qMenuQuest) { + public int openCategory(Category category, QuestQMenu questQMenu) { Player player = Bukkit.getPlayer(this.uuid); if (player == null) { return 3; @@ -74,8 +73,7 @@ public class QPlayer { return 1; } - player.openInventory(qMenuQuest.toInventory(1)); - MenuController.track(this.uuid, qMenuQuest); + plugin.getMenuController().openMenu(player, questQMenu, 1); return 0; } @@ -89,10 +87,10 @@ public class QPlayer { } if (Options.CATEGORIES_ENABLED.getBooleanValue()) { - QMenuCategory qMenuCategory = new QMenuCategory(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId())); - List questMenus = new ArrayList<>(); + CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId())); + List questMenus = new ArrayList<>(); for (Category category : plugin.getQuestManager().getCategories()) { - QMenuQuest qMenuQuest = new QMenuQuest(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), category.getId(), qMenuCategory); + QuestQMenu questQMenu = new QuestQMenu(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), category.getId(), categoryQMenu); List quests = new ArrayList<>(); for (String questid : category.getRegisteredQuestIds()) { Quest quest = plugin.getQuestManager().getQuestById(questid); @@ -100,24 +98,22 @@ public class QPlayer { quests.add(quest); } } - qMenuQuest.populate(quests); - questMenus.add(qMenuQuest); + questQMenu.populate(quests); + questMenus.add(questQMenu); } - qMenuCategory.populate(questMenus); + categoryQMenu.populate(questMenus); - player.openInventory(qMenuCategory.toInventory(1)); - MenuController.track(player.getUniqueId(), qMenuCategory); + plugin.getMenuController().openMenu(player, categoryQMenu, 1); } else { - QMenuQuest qMenuQuest = new QMenuQuest(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), "", null); + QuestQMenu questQMenu = new QuestQMenu(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), "", null); List quests = new ArrayList<>(); for (Map.Entry entry : plugin.getQuestManager().getQuests().entrySet()) { quests.add(entry.getValue()); } - qMenuQuest.populate(quests); - qMenuQuest.setBackButtonEnabled(false); + questQMenu.populate(quests); + questQMenu.setBackButtonEnabled(false); - player.openInventory(qMenuQuest.toInventory(1)); - MenuController.track(player.getUniqueId(), qMenuQuest); + plugin.getMenuController().openMenu(player, questQMenu, 1); } } @@ -130,15 +126,14 @@ public class QPlayer { return; } - QMenuStarted qMenuStarted = new QMenuStarted(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId())); + StartedQMenu startedQMenu = new StartedQMenu(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId())); List quests = new ArrayList<>(); for (Map.Entry entry : plugin.getQuestManager().getQuests().entrySet()) { quests.add(new QuestSortWrapper(plugin, entry.getValue())); } - qMenuStarted.populate(quests); + startedQMenu.populate(quests); - player.openInventory(qMenuStarted.toInventory(1)); - MenuController.track(player.getUniqueId(), qMenuStarted); + plugin.getMenuController().openMenu(player, startedQMenu, 1); } public QuestProgressFile getQuestProgressFile() { 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 a7ee6502..137d83f9 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java +++ b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java @@ -81,7 +81,7 @@ public class QuestProgressFile { if (questFinishEvent.getQuestFinishMessage() != null) player.sendMessage(questFinishEvent.getQuestFinishMessage()); if (Options.TITLES_ENABLED.getBooleanValue()) { - plugin.getTitle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest + plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest .getDisplayNameStripped()), Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", quest .getDisplayNameStripped())); } @@ -243,7 +243,7 @@ public class QuestProgressFile { 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.getTitle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", quest + plugin.getTitleHandle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", quest .getDisplayNameStripped()), Messages.TITLE_QUEST_START_SUBTITLE.getMessage().replace("{quest}", quest .getDisplayNameStripped())); } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java index 88921877..5db2ee7c 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/InventoryTaskType.java @@ -29,9 +29,11 @@ import java.util.List; public final class InventoryTaskType extends TaskType { private List creatorConfigValues = new ArrayList<>(); - - public InventoryTaskType() { + private final Quests plugin; + + public InventoryTaskType(Quests plugin) { super("inventory", "LMBishop", "Obtain a set of items."); + this.plugin = plugin; this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); this.creatorConfigValues.add(new ConfigValue("data", false, "Data of item.")); @@ -57,7 +59,7 @@ public final class InventoryTaskType extends TaskType { QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); } else { String type = String.valueOf(section.get(itemloc)); - if (!Quests.get().getItemGetter().isValidMaterial(type)) { + if (!plugin.getItemGetter().isValidMaterial(type)) { problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); } @@ -88,12 +90,12 @@ public final class InventoryTaskType extends TaskType { public void onItemPickup(PlayerPickupItemEvent event) { if (event.getPlayer().hasMetadata("NPC")) return; - Bukkit.getScheduler().runTaskLater(Quests.get(), () -> this.checkInventory(event.getPlayer()), 1L); + Bukkit.getScheduler().runTaskLater(plugin, () -> this.checkInventory(event.getPlayer()), 1L); } @EventHandler(priority = EventPriority.MONITOR) public void onInventoryClick(InventoryCloseEvent event) { - Bukkit.getScheduler().runTaskLater(Quests.get(), () -> checkInventory((Player) event.getPlayer()), 1L); //Still some work to do as it doesn't really work + Bukkit.getScheduler().runTaskLater(plugin, () -> checkInventory((Player) event.getPlayer()), 1L); //Still some work to do as it doesn't really work } @SuppressWarnings("deprecation") @@ -130,7 +132,7 @@ public final class InventoryTaskType extends TaskType { ItemStack is; if (configBlock instanceof ConfigurationSection) { - is = Quests.get().getItemStack("", (org.bukkit.configuration.ConfigurationSection) configBlock); + is = plugin.getItemStack("", (org.bukkit.configuration.ConfigurationSection) configBlock); } else { material = Material.getMaterial(String.valueOf(configBlock)); diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java index 8be6dc0e..e3f89ff6 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/MiningCertainTaskType.java @@ -25,10 +25,12 @@ import java.util.List; public final class MiningCertainTaskType extends TaskType { + private final Quests plugin; private List creatorConfigValues = new ArrayList<>(); - public MiningCertainTaskType() { + public MiningCertainTaskType(Quests plugin) { super("blockbreakcertain", "LMBishop", "Break a set amount of a specific block."); + this.plugin = plugin; this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of blocks to be broken.")); this.creatorConfigValues.add(new ConfigValue("block", true, "Name or ID of block.", "block")); // Can use name:datacode this.creatorConfigValues.add(new ConfigValue("blocks", true, "List of blocks (alias for block for config readability).", "block")); @@ -110,7 +112,7 @@ public final class MiningCertainTaskType extends TaskType { boolean coreProtectEnabled = (boolean) task.getConfigValue("check-coreprotect", false); int coreProtectTime = (int) task.getConfigValue("check-coreprotect-time", 3600); - if (coreProtectEnabled && Quests.get().getCoreProtectHook().checkBlock(event.getBlock(), coreProtectTime)) { + if (coreProtectEnabled && plugin.getCoreProtectHook().checkBlock(event.getBlock(), coreProtectTime)) { continue; } increment(task, taskProgress, 1); diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PermissionTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PermissionTaskType.java index f094e5cf..59e48061 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PermissionTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PermissionTaskType.java @@ -20,11 +20,13 @@ import java.util.List; public final class PermissionTaskType extends TaskType { + private Quests plugin; private BukkitTask poll; private List creatorConfigValues = new ArrayList<>(); - public PermissionTaskType() { + public PermissionTaskType(Quests plugin) { super("permission", "LMBishop", "Test if a player has a permission"); + this.plugin = plugin; this.creatorConfigValues.add(new ConfigValue("permission", true, "The required permission.")); } @@ -58,7 +60,7 @@ public final class PermissionTaskType extends TaskType { } } } - }.runTaskTimer(Quests.get(), 30L, 30L); + }.runTaskTimer(plugin, 30L, 30L); } @Override diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java index fd05e9c8..7fee929b 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/PlaytimeTaskType.java @@ -23,11 +23,13 @@ import java.util.List; public final class PlaytimeTaskType extends TaskType { + private final Quests plugin; private BukkitTask poll; private List creatorConfigValues = new ArrayList<>(); - public PlaytimeTaskType() { + public PlaytimeTaskType(Quests plugin) { super("playtime", "Reinatix", "Track the amount of playing time a user has been on"); + this.plugin = plugin; this.creatorConfigValues.add(new ConfigValue("minutes", true, "Time in minutes.")); } @@ -77,7 +79,7 @@ public final class PlaytimeTaskType extends TaskType { } } } - }.runTaskTimer(Quests.get(), 1200L, 1200L); + }.runTaskTimer(plugin, 1200L, 1200L); } } diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensDeliverTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensDeliverTaskType.java index ccced949..d7d73131 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensDeliverTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/CitizensDeliverTaskType.java @@ -27,10 +27,12 @@ import java.util.List; public final class CitizensDeliverTaskType extends TaskType { + private final Quests plugin; private List creatorConfigValues = new ArrayList<>(); - public CitizensDeliverTaskType() { + public CitizensDeliverTaskType(Quests plugin) { super("citizens_deliver", "LMBishop", "Deliver a set of items to a NPC."); + this.plugin = plugin; this.creatorConfigValues.add(new ConfigValue("amount", true, "Amount of item to retrieve.")); this.creatorConfigValues.add(new ConfigValue("item", true, "Name or ID of item.")); this.creatorConfigValues.add(new ConfigValue("npc-name", true, "Name of the NPC.")); @@ -55,7 +57,7 @@ public final class CitizensDeliverTaskType extends TaskType { QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(""), root + ".item.type")); } else { String type = String.valueOf(section.get(itemloc)); - if (!Quests.get().getItemGetter().isValidMaterial(type)) { + if (!plugin.getItemGetter().isValidMaterial(type)) { problems.add(new QuestsConfigLoader.ConfigProblem(QuestsConfigLoader.ConfigProblemType.WARNING, QuestsConfigLoader.ConfigProblemDescriptions.UNKNOWN_MATERIAL.getDescription(type), root + ".item." + itemloc)); } @@ -81,7 +83,7 @@ public final class CitizensDeliverTaskType extends TaskType { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) public void onNPCClick(NPCRightClickEvent event) { - Bukkit.getScheduler().runTaskLater(Quests.get(), () -> checkInventory(event.getClicker(), event.getNPC().getName()), 1L); + Bukkit.getScheduler().runTaskLater(plugin, () -> checkInventory(event.getClicker(), event.getNPC().getName()), 1L); } @SuppressWarnings("deprecation") @@ -89,7 +91,7 @@ public final class CitizensDeliverTaskType extends TaskType { if (player == null || !player.isOnline()) { return; } - QPlayer qPlayer = Quests.get().getPlayerManager().getPlayer(player.getUniqueId()); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { return; } @@ -121,7 +123,7 @@ public final class CitizensDeliverTaskType extends TaskType { ItemStack is; if (configBlock instanceof ConfigurationSection) { - is = Quests.get().getItemStack(null, (org.bukkit.configuration.ConfigurationSection) configBlock); + is = plugin.getItemStack(null, (org.bukkit.configuration.ConfigurationSection) configBlock); } else { material = Material.getMaterial(String.valueOf(configBlock)); diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/IridiumSkyblockValueType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/IridiumSkyblockValueType.java index 5191c52e..76b2df1a 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/IridiumSkyblockValueType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/IridiumSkyblockValueType.java @@ -2,7 +2,6 @@ package com.leonardobishop.quests.quests.tasktypes.types.dependent; import com.iridium.iridiumskyblock.Island; import com.iridium.iridiumskyblock.api.IslandWorthCalculatedEvent; -import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.QuestsAPI; import com.leonardobishop.quests.player.QPlayer; @@ -47,7 +46,6 @@ public final class IridiumSkyblockValueType extends TaskType { try { uuid = UUID.fromString(player); } catch (Exception e) { - Quests.get().getQuestsLogger().debug("Cannot convert from String to UUID for IridiumSkyblock"); continue; } QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(uuid); diff --git a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/PlaceholderAPIEvaluateTaskType.java b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/PlaceholderAPIEvaluateTaskType.java index d6b8d2df..9ba9005b 100644 --- a/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/PlaceholderAPIEvaluateTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quests/tasktypes/types/dependent/PlaceholderAPIEvaluateTaskType.java @@ -24,11 +24,13 @@ import java.util.List; public final class PlaceholderAPIEvaluateTaskType extends TaskType { + private final Quests plugin; private BukkitTask poll; private List creatorConfigValues = new ArrayList<>(); - public PlaceholderAPIEvaluateTaskType() { + public PlaceholderAPIEvaluateTaskType(Quests plugin) { super("placeholderapi_evaluate", "LMBishop", "Evaluate the result of a placeholder"); + this.plugin = plugin; this.creatorConfigValues.add(new ConfigValue("placeholder", true, "The placeholder string (including %%).")); this.creatorConfigValues.add(new ConfigValue("evaluates", true, "What it should evaluate to be marked as complete.")); this.creatorConfigValues.add(new ConfigValue("operator", false, "Comparison method.")); @@ -138,7 +140,7 @@ public final class PlaceholderAPIEvaluateTaskType extends TaskType { } } } - }.runTaskTimer(Quests.get(), 30L, 30L); + }.runTaskTimer(plugin, 30L, 30L); } @Override diff --git a/src/main/java/com/leonardobishop/quests/util/Items.java b/src/main/java/com/leonardobishop/quests/util/Items.java index a6af8cd5..be34d72c 100644 --- a/src/main/java/com/leonardobishop/quests/util/Items.java +++ b/src/main/java/com/leonardobishop/quests/util/Items.java @@ -3,6 +3,9 @@ package com.leonardobishop.quests.util; import com.leonardobishop.quests.Quests; import org.bukkit.inventory.ItemStack; +import java.util.HashMap; +import java.util.Map; + public enum Items { BACK_BUTTON("gui.back-button"), @@ -18,6 +21,8 @@ public enum Items { QUEST_CANCEL_NO("gui.quest-cancel-no"), QUEST_CANCEL_BACKGROUND("gui.quest-cancel-background"); + private static final Map cachedItemStacks = new HashMap<>(); + private final String path; Items(String path) { @@ -25,7 +30,7 @@ public enum Items { } public ItemStack getItem() { - return Quests.get().getItemStack(path, Quests.get().getConfig()); + return new ItemStack(cachedItemStacks.computeIfAbsent(path, s -> Quests.get().getItemStack(path, Quests.get().getConfig()))); } } diff --git a/src/main/java/com/leonardobishop/quests/util/Options.java b/src/main/java/com/leonardobishop/quests/util/Options.java index e1737f4b..1a11b402 100644 --- a/src/main/java/com/leonardobishop/quests/util/Options.java +++ b/src/main/java/com/leonardobishop/quests/util/Options.java @@ -9,6 +9,7 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public enum Options { + CATEGORIES_ENABLED("options.categories-enabled"), TRIM_GUI_SIZE("options.trim-gui-size"), QUESTS_START_LIMIT("options.quest-started-limit"), -- cgit v1.2.3-70-g09d2