From 3a454e2597263bac73ac31d250347f7a356fd69f Mon Sep 17 00:00:00 2001 From: LMBishop <13875753+LMBishop@users.noreply.github.com> Date: Wed, 3 Mar 2021 14:03:43 +0000 Subject: Restructued menu classes --- .../java/com/leonardobishop/quests/Quests.java | 6 +- .../quests/QuestsAutosaveRunnable.java | 3 +- .../leonardobishop/quests/QuestsConfigLoader.java | 4 +- .../quests/api/QuestsPlaceholders.java | 4 +- .../quests/commands/CommandQuests.java | 18 +- .../quests/events/EventInventory.java | 188 ------------- .../quests/events/EventPlayerJoin.java | 4 +- .../quests/events/MenuController.java | 105 ++++++++ .../com/leonardobishop/quests/menu/QItemStack.java | 157 +++++++++++ .../java/com/leonardobishop/quests/menu/QMenu.java | 17 ++ .../leonardobishop/quests/menu/QMenuCancel.java | 94 +++++++ .../leonardobishop/quests/menu/QMenuCategory.java | 141 ++++++++++ .../com/leonardobishop/quests/menu/QMenuDaily.java | 106 ++++++++ .../com/leonardobishop/quests/menu/QMenuQuest.java | 292 +++++++++++++++++++++ .../leonardobishop/quests/menu/QMenuStarted.java | 204 ++++++++++++++ .../quests/menu/QuestSortWrapper.java | 44 ++++ .../java/com/leonardobishop/quests/obj/Items.java | 31 --- .../com/leonardobishop/quests/obj/Messages.java | 74 ------ .../com/leonardobishop/quests/obj/Options.java | 97 ------- .../leonardobishop/quests/obj/misc/QItemStack.java | 157 ----------- .../com/leonardobishop/quests/obj/misc/QMenu.java | 14 - .../quests/obj/misc/QMenuCancel.java | 80 ------ .../quests/obj/misc/QMenuCategory.java | 126 --------- .../leonardobishop/quests/obj/misc/QMenuDaily.java | 110 -------- .../leonardobishop/quests/obj/misc/QMenuQuest.java | 253 ------------------ .../quests/obj/misc/QMenuStarted.java | 176 ------------- .../quests/obj/misc/QuestSortWrapper.java | 44 ---- .../quests/obj/misc/creator/QMenuCreator.java | 71 ----- .../com/leonardobishop/quests/player/QPlayer.java | 20 +- .../quests/player/QPlayerManager.java | 3 +- .../questprogressfile/QuestProgressFile.java | 4 +- .../com/leonardobishop/quests/quests/Quest.java | 2 +- .../com/leonardobishop/quests/updater/Updater.java | 2 +- .../java/com/leonardobishop/quests/util/Items.java | 31 +++ .../com/leonardobishop/quests/util/Messages.java | 74 ++++++ .../com/leonardobishop/quests/util/Options.java | 96 +++++++ 36 files changed, 1398 insertions(+), 1454 deletions(-) delete mode 100644 src/main/java/com/leonardobishop/quests/events/EventInventory.java create mode 100644 src/main/java/com/leonardobishop/quests/events/MenuController.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QItemStack.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenu.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuDaily.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java create mode 100644 src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/Items.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/Messages.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/Options.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/QMenu.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/QMenuCategory.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/QMenuDaily.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/QMenuStarted.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/QuestSortWrapper.java delete mode 100644 src/main/java/com/leonardobishop/quests/obj/misc/creator/QMenuCreator.java create mode 100644 src/main/java/com/leonardobishop/quests/util/Items.java create mode 100644 src/main/java/com/leonardobishop/quests/util/Messages.java create mode 100644 src/main/java/com/leonardobishop/quests/util/Options.java (limited to 'src') diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java index 63fcdf08..eee970b3 100644 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ b/src/main/java/com/leonardobishop/quests/Quests.java @@ -2,7 +2,7 @@ package com.leonardobishop.quests; import com.leonardobishop.quests.bstats.Metrics; import com.leonardobishop.quests.commands.CommandQuests; -import com.leonardobishop.quests.events.EventInventory; +import com.leonardobishop.quests.events.MenuController; import com.leonardobishop.quests.events.EventPlayerJoin; import com.leonardobishop.quests.events.EventPlayerLeave; import com.leonardobishop.quests.hooks.itemgetter.ItemGetter; @@ -15,7 +15,7 @@ import com.leonardobishop.quests.hooks.title.Title; import com.leonardobishop.quests.hooks.title.Title_Bukkit; import com.leonardobishop.quests.hooks.title.Title_BukkitNoTimings; import com.leonardobishop.quests.hooks.title.Title_Other; -import com.leonardobishop.quests.obj.Messages; +import com.leonardobishop.quests.util.Messages; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.QPlayerManager; import com.leonardobishop.quests.quests.QuestManager; @@ -113,7 +113,7 @@ public class Quests extends JavaPlugin { Bukkit.getPluginCommand("quests").setExecutor(new CommandQuests(this)); Bukkit.getPluginManager().registerEvents(new EventPlayerJoin(this), this); - Bukkit.getPluginManager().registerEvents(new EventInventory(this), this); + Bukkit.getPluginManager().registerEvents(new MenuController(this), this); Bukkit.getPluginManager().registerEvents(new EventPlayerLeave(this), this); Metrics metrics = new Metrics(this); diff --git a/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java b/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java index 71e42dff..67b545f6 100644 --- a/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java +++ b/src/main/java/com/leonardobishop/quests/QuestsAutosaveRunnable.java @@ -1,12 +1,11 @@ package com.leonardobishop.quests; -import com.leonardobishop.quests.obj.Options; +import com.leonardobishop.quests.util.Options; import com.leonardobishop.quests.player.QPlayer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.scheduler.BukkitRunnable; -import java.util.Collection; import java.util.LinkedList; import java.util.Queue; import java.util.UUID; diff --git a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java b/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java index 05e94e8f..1ad75d2a 100644 --- a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java +++ b/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java @@ -1,8 +1,8 @@ package com.leonardobishop.quests; import com.leonardobishop.quests.hooks.itemgetter.ItemGetter; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.obj.misc.QItemStack; +import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.menu.QItemStack; import com.leonardobishop.quests.quests.Category; import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.quests.Task; diff --git a/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java b/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java index 0b8e99f7..b45919b1 100644 --- a/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java +++ b/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java @@ -2,8 +2,8 @@ package com.leonardobishop.quests.api; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.obj.misc.QItemStack; +import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.menu.QItemStack; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.quests.Category; diff --git a/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java b/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java index d88ca70f..4df5cd7d 100644 --- a/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java +++ b/src/main/java/com/leonardobishop/quests/commands/CommandQuests.java @@ -3,8 +3,8 @@ package com.leonardobishop.quests.commands; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.QuestsConfigLoader; import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.obj.Messages; -import com.leonardobishop.quests.obj.Options; +import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.util.Options; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.quests.Category; @@ -377,17 +377,23 @@ public class CommandQuests implements TabExecutor { } else { if (qPlayer == null) { // shit + fan - sender.sendMessage(ChatColor.RED + "An error occurred finding your player."); //lazy? :) + sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); //lazy? :) } else { qPlayer.getQuestProgressFile().startQuest(quest); } } } else if (args[2].equalsIgnoreCase("c") || args[2].equalsIgnoreCase("cancel")) { if (qPlayer == null) { - sender.sendMessage(ChatColor.RED + "An error occurred finding your player."); //lazy x2? ;) + sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); //lazy x2? ;) } else { qPlayer.getQuestProgressFile().cancelQuest(quest); } + } else if (args[2].equalsIgnoreCase("t") || args[2].equalsIgnoreCase("track")) { + if (qPlayer == null) { + sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); //lazy x2? ;) + } else { + qPlayer.getQuestProgressFile().trackQuest(quest); + } } else { sender.sendMessage(Messages.COMMAND_SUB_DOESNTEXIST.getMessage().replace("{sub}", args[2])); } @@ -481,7 +487,7 @@ public class CommandQuests implements TabExecutor { sender.sendMessage(ChatColor.GRAY + "The following commands are available: "); sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests " + ChatColor.DARK_GRAY + ": show quests"); sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests c/category " + ChatColor.DARK_GRAY + ": open category by ID"); - sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests q/quest " + ChatColor.DARK_GRAY + ": start or cancel quest by ID"); + sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests q/quest " + ChatColor.DARK_GRAY + ": start, cancel or track quest by ID"); sender.sendMessage(ChatColor.DARK_GRAY + " * " + ChatColor.RED + "/quests a/admin " + ChatColor.DARK_GRAY + ": view help for admins"); sender.sendMessage(ChatColor.GRAY.toString() + ChatColor.STRIKETHROUGH + "--------=[" + ChatColor.RED + " made with <3 by LMBishop " + ChatColor .GRAY.toString() + ChatColor.STRIKETHROUGH + "]=--------"); @@ -578,7 +584,7 @@ public class CommandQuests implements TabExecutor { && sender.hasPermission("quests.admin")) { Quest q = plugin.getQuestManager().getQuestById(args[1]); if (q != null) { - List options = Arrays.asList("start", "cancel"); + List options = Arrays.asList("start", "cancel", "track"); return matchTabComplete(args[2], options); } } else if (args[0].equalsIgnoreCase("a") || args[0].equalsIgnoreCase("admin") diff --git a/src/main/java/com/leonardobishop/quests/events/EventInventory.java b/src/main/java/com/leonardobishop/quests/events/EventInventory.java deleted file mode 100644 index e1c4d0c2..00000000 --- a/src/main/java/com/leonardobishop/quests/events/EventInventory.java +++ /dev/null @@ -1,188 +0,0 @@ -package com.leonardobishop.quests.events; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.api.enums.QuestStartResult; -import com.leonardobishop.quests.obj.Messages; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.obj.misc.*; -import com.leonardobishop.quests.quests.Quest; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.ClickType; -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 EventInventory implements Listener { - - private static final HashMap tracker = new HashMap<>(); - private final Quests plugin; - - // ADD PLAYERS TO THE BUFFER BEFORE AN ANTICIPATED MENU CHANGE SO THAT - // THEY ARE NOT LOST FROM THE TRACKER WHEN CHANGING MENUS - private final ArrayList buffer = new ArrayList<>(); - - public EventInventory(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); - } - - @EventHandler - public void onEvent(InventoryClickEvent event) { - // check if the player has a quest menu open - if (tracker.containsKey(event.getWhoClicked().getUniqueId())) { - event.setCancelled(true); - if (event.getClickedInventory() == null) - return; //The player clicked outside the inventory - if (event.getClickedInventory().getType() == InventoryType.PLAYER) - return; //The clicked inventory is a player inventory type - QMenu qMenu = tracker.get(event.getWhoClicked().getUniqueId()); - - // **** MENU TYPE: QUESTS IN CATEGORY/ALL QUESTS **** - if (qMenu instanceof QMenuQuest) { - QMenuQuest qMenuQuest = (QMenuQuest) qMenu; - - if (qMenuQuest.getPagePrevLocation() == event.getSlot()) { - // (see line 26) - buffer.add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(qMenuQuest.toInventory(qMenuQuest.getCurrentPage() - 1)); - - } else if (qMenuQuest.getPageNextLocation() == event.getSlot()) { - //This shouldn't be here lol, forgot about it - buffer.add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(qMenuQuest.toInventory(qMenuQuest.getCurrentPage() + 1)); - - // return to QMenuCategory (category listing) - } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && qMenuQuest.getBackButtonLocation() == event.getSlot()) { - QMenuCategory qMenuCategory = qMenuQuest.getSuperMenu(); - buffer.add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(qMenuCategory.toInventory(1)); - tracker.put(event.getWhoClicked().getUniqueId(), qMenuCategory); - - // handle when player wishes to start a quest by matching the slot they clicked to a predetermined - // map which maps quests to slots so you do not have to compare the item stack - } else if (event.getSlot() < qMenuQuest.getPageSize() && qMenuQuest.getSlotsToMenu().containsKey(event.getSlot() + (((qMenuQuest - .getCurrentPage()) - 1) * qMenuQuest.getPageSize()))) { - - String questid = qMenuQuest.getSlotsToMenu().get(event.getSlot() + (((qMenuQuest.getCurrentPage()) - 1) * qMenuQuest.getPageSize())); - Quest quest = plugin.getQuestManager().getQuestById(questid); - if (event.getClick() == ClickType.LEFT) { - if (Options.QUEST_AUTOSTART.getBooleanValue()) return; - if (qMenuQuest.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()) { - middleClickQuest(qMenuQuest, quest, Bukkit.getPlayer(qMenuQuest.getOwner().getUuid())); - } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() - && qMenuQuest.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { - rightClickQuest(qMenuQuest, quest, Bukkit.getPlayer(qMenuQuest.getOwner().getUuid())); - } - } - - // **** MENU TYPE: STARTED QUESTS **** - } else if (qMenu instanceof QMenuStarted) { - QMenuStarted qMenuQuest = (QMenuStarted) qMenu; - - if (qMenuQuest.getPagePrevLocation() == event.getSlot()) { - buffer.add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(qMenuQuest.toInventory(qMenuQuest.getCurrentPage() - 1)); - - } else if (qMenuQuest.getPageNextLocation() == event.getSlot()) { - buffer.add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(qMenuQuest.toInventory(qMenuQuest.getCurrentPage() + 1)); - - } else if (event.getSlot() < qMenuQuest.getPageSize() && qMenuQuest.getSlotsToMenu().containsKey(event.getSlot() + (((qMenuQuest - .getCurrentPage()) - 1) * qMenuQuest.getPageSize()))) { - - // repeat from above - String questid = qMenuQuest.getSlotsToMenu().get(event.getSlot() + (((qMenuQuest.getCurrentPage()) - 1) * qMenuQuest.getPageSize())); - Quest quest = plugin.getQuestManager().getQuestById(questid); - if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) { - middleClickQuest(qMenuQuest, quest, Bukkit.getPlayer(qMenuQuest.getOwner().getUuid())); - } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() - && qMenuQuest.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { - rightClickQuest(qMenuQuest, quest, Bukkit.getPlayer(qMenuQuest.getOwner().getUuid())); - } - } - - // **** MENU TYPE: CATEGORY LISTING **** - } else if (qMenu instanceof QMenuCategory) { - QMenuCategory qMenuCategory = (QMenuCategory) qMenu; - - if (qMenuCategory.getSlotsToMenu().containsKey(event.getSlot())) { - QMenuQuest qMenuQuest = qMenuCategory.getSlotsToMenu().get(event.getSlot()); - buffer.add(event.getWhoClicked().getUniqueId()); - if (qMenuCategory.getOwner().openCategory(plugin.getQuestManager().getCategoryById(qMenuQuest.getCategoryName()), qMenuQuest) != 0) { - buffer.remove(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().sendMessage(Messages.QUEST_CATEGORY_PERMISSION.getMessage()); - } - } - - // **** MENU TYPE: CANCELLING QUEST MENU **** - } else if (qMenu instanceof QMenuCancel) { - QMenuCancel qMenuCancel = (QMenuCancel) qMenu; - - event.setCancelled(true); - if (event.getSlot() == 10 || event.getSlot() == 11 || event.getSlot() == 12) { - QMenu qSuperMenu = qMenuCancel.getSuperMenu(); - buffer.add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(qSuperMenu.toInventory(1)); - tracker.put(event.getWhoClicked().getUniqueId(), qSuperMenu); - } else if (event.getSlot() == 14 || event.getSlot() == 15 || event.getSlot() == 16) { - if (qMenuCancel.getOwner().getQuestProgressFile().cancelQuest(qMenuCancel.getQuest())) { - event.getWhoClicked().closeInventory(); - } - } - } - } - } - - private 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)) { - player.sendMessage(Messages.QUEST_TRACK_STOP.getMessage().replace("{quest}", quest.getDisplayNameStripped())); - menu.getOwner().getQuestProgressFile().trackQuest(null); - } else { - player.sendMessage(Messages.QUEST_TRACK.getMessage().replace("{quest}", quest.getDisplayNameStripped())); - menu.getOwner().getQuestProgressFile().trackQuest(quest); - } - player.closeInventory(); - } - } - - private 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/events/EventPlayerJoin.java b/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java index 5c12770d..143046be 100644 --- a/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java +++ b/src/main/java/com/leonardobishop/quests/events/EventPlayerJoin.java @@ -1,8 +1,8 @@ package com.leonardobishop.quests.events; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.obj.Messages; -import com.leonardobishop.quests.obj.Options; +import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.util.Options; import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; diff --git a/src/main/java/com/leonardobishop/quests/events/MenuController.java b/src/main/java/com/leonardobishop/quests/events/MenuController.java new file mode 100644 index 00000000..9cc390be --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/events/MenuController.java @@ -0,0 +1,105 @@ +package com.leonardobishop.quests.events; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.api.enums.QuestStartResult; +import com.leonardobishop.quests.menu.QMenu; +import com.leonardobishop.quests.menu.QMenuCancel; +import com.leonardobishop.quests.menu.QMenuCategory; +import com.leonardobishop.quests.menu.QMenuQuest; +import com.leonardobishop.quests.menu.QMenuStarted; +import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.quests.Quest; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.ClickType; +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 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 ArrayList getBuffer() { + return buffer; + } + + @EventHandler + public void onEvent(InventoryClickEvent event) { + // check if the player has a quest menu open + if (tracker.containsKey(event.getWhoClicked().getUniqueId())) { + event.setCancelled(true); + if (event.getClickedInventory() == null) + return; //The player clicked outside the inventory + if (event.getClickedInventory().getType() == InventoryType.PLAYER) + return; //The clicked inventory is a player inventory type + + QMenu qMenu = tracker.get(event.getWhoClicked().getUniqueId()); + qMenu.handleClick(event, this); + } + } + + // 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)) { + player.sendMessage(Messages.QUEST_TRACK_STOP.getMessage().replace("{quest}", quest.getDisplayNameStripped())); + menu.getOwner().getQuestProgressFile().trackQuest(null); + } else { + player.sendMessage(Messages.QUEST_TRACK.getMessage().replace("{quest}", quest.getDisplayNameStripped())); + 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/QItemStack.java b/src/main/java/com/leonardobishop/quests/menu/QItemStack.java new file mode 100644 index 00000000..4577bd59 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QItemStack.java @@ -0,0 +1,157 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; +import com.leonardobishop.quests.quests.Quest; +import org.bukkit.Bukkit; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class QItemStack { + + private final Quests plugin; + + private String name; + private List loreNormal; + private List loreStarted; + private final List globalLoreAppendNormal; + private final List globalLoreAppendNotStarted; + private final List globalLoreAppendStarted; + private final List globalLoreAppendTracked; + private ItemStack startingItemStack; + + public QItemStack(Quests plugin, String name, List loreNormal, List loreStarted, ItemStack startingItemStack) { + this.plugin = plugin; + this.name = name; + this.loreNormal = loreNormal; + this.loreStarted = loreStarted; + this.startingItemStack = startingItemStack; + + this.globalLoreAppendNormal = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_NORMAL.getStringListValue()); + this.globalLoreAppendNotStarted = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_NOT_STARTED.getStringListValue()); + this.globalLoreAppendStarted = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_STARTED.getStringListValue()); + this.globalLoreAppendTracked = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_TRACKED.getStringListValue()); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getLoreNormal() { + return loreNormal; + } + + public void setLoreNormal(List loreNormal) { + this.loreNormal = loreNormal; + } + + public List getLoreStarted() { + return loreStarted; + } + + public void setLoreStarted(List loreStarted) { + this.loreStarted = loreStarted; + } + + public ItemStack getStartingItemStack() { + return startingItemStack; + } + + public void setStartingItemStack(ItemStack startingItemStack) { + this.startingItemStack = startingItemStack; + } + + @SuppressWarnings("deprecation") + public ItemStack toItemStack(Quest quest, QuestProgressFile questProgressFile, QuestProgress questProgress) { + ItemStack is = new ItemStack(startingItemStack); + ItemMeta ism = is.getItemMeta(); + ism.setDisplayName(name); + List formattedLore = new ArrayList<>(); + List tempLore = new ArrayList<>(); + + if (Options.GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE.getBooleanValue() && !globalLoreAppendNormal.isEmpty()) { + tempLore.addAll(globalLoreAppendNormal); + } else { + tempLore.addAll(loreNormal); + tempLore.addAll(globalLoreAppendNormal); + } + + 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 { + tempLore.addAll(loreStarted); + if (tracked) { + tempLore.addAll(globalLoreAppendTracked); + } else { + tempLore.addAll(globalLoreAppendStarted); + } + } + ism.addEnchant(Enchantment.ARROW_INFINITE, 1, true); + try { + ism.addItemFlags(ItemFlag.HIDE_ENCHANTS); + ism.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + } catch (Exception ignored) { + + } + } else { + tempLore.addAll(globalLoreAppendNotStarted); + } + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); + } + if (questProgress != null) { + for (String s : tempLore) { + s = processPlaceholders(s, questProgress); + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); + } + formattedLore.add(s); + } + } + ism.setLore(formattedLore); + is.setItemMeta(ism); + return is; + } + + public static String processPlaceholders(String s, QuestProgress questProgress) { + Matcher m = Pattern.compile("\\{([^}]+)}").matcher(s); + while (m.find()) { + String[] parts = m.group(1).split(":"); + if (parts.length > 1) { + if (questProgress.getTaskProgress(parts[0]) == null) { + continue; + } + if (parts[1].equals("progress")) { + String str = String.valueOf(questProgress.getTaskProgress(parts[0]).getProgress()); + s = s.replace("{" + m.group(1) + "}", (str.equals("null") ? String.valueOf(0) : str)); + } + if (parts[1].equals("complete")) { + String str = String.valueOf(questProgress.getTaskProgress(parts[0]).isCompleted()); + s = s.replace("{" + m.group(1) + "}", str); + } + } + } + return s; + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenu.java b/src/main/java/com/leonardobishop/quests/menu/QMenu.java new file mode 100644 index 00000000..1efc34e8 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QMenu.java @@ -0,0 +1,17 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.player.QPlayer; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; + +import java.util.HashMap; + +public interface QMenu { + + QPlayer getOwner(); + HashMap getSlotsToMenu(); + Inventory toInventory(int page); + void handleClick(InventoryClickEvent event, MenuController controller); + +} diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java b/src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java new file mode 100644 index 00000000..797223cc --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java @@ -0,0 +1,94 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.util.Items; +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.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 */ + } + + @Override + 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 new file mode 100644 index 00000000..f8b4cd8a --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java @@ -0,0 +1,141 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.quests.Category; +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.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Menu list of categories. + */ +public class QMenuCategory implements QMenu { + + private final Quests plugin; + private final int pageSize = 45; + private final HashMap slotsToMenuQuest = new HashMap<>(); + private final QPlayer owner; + + public QMenuCategory(Quests plugin, QPlayer owner) { + this.plugin = plugin; + this.owner = owner; + } + + public void populate(List menuQuests) { + int slot = 0; + for (QMenuQuest qMenuQuest : menuQuests) { + 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; + } + } + slotsToMenuQuest.put(slot, qMenuQuest); + slot++; + } + } + + @Override + public HashMap getSlotsToMenu() { + return slotsToMenuQuest; + } + + @Override + public QPlayer getOwner() { + return owner; + } + + public Inventory toInventory(int page) { + int pageMin = pageSize * (page - 1); + int pageMax = pageSize * page; + String title = Options.color(Options.GUITITLE_QUESTS_CATEGORY.getStringValue()); + + ItemStack pageIs = new ItemStack(Material.DIRT); + + Inventory inventory = Bukkit.createInventory(null, 54, title); + + for (int pointer = pageMin; pointer < pageMax; pointer++) { + if (slotsToMenuQuest.containsKey(pointer)) { + Category category = Quests.get().getQuestManager().getCategoryById(slotsToMenuQuest.get(pointer).getCategoryName()); + if (category != null) { + inventory.setItem(pointer, replaceItemStack(category.getDisplayItem())); + } + } + } + + inventory.setItem(49, replaceItemStack(pageIs)); + + 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 < pageMax; slot++) { + if (slot >= trimmedInventory.getSize()) { + break; + } + trimmedInventory.setItem(slot, inventory.getItem(slot)); + } + return trimmedInventory; + } else { + return inventory; + } + + } + + @Override + public void handleClick(InventoryClickEvent event, MenuController controller) { + if (this.getSlotsToMenu().containsKey(event.getSlot())) { + QMenuQuest qMenuQuest = this.getSlotsToMenu().get(event.getSlot()); + 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()); + } + } + } + + public 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.getUuid()); + 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/QMenuDaily.java b/src/main/java/com/leonardobishop/quests/menu/QMenuDaily.java new file mode 100644 index 00000000..a89765e4 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuDaily.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/QMenuQuest.java b/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java new file mode 100644 index 00000000..bdcf20c7 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java @@ -0,0 +1,292 @@ +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.util.Items; +import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.quests.Quest; +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.*; +import java.util.concurrent.TimeUnit; + +/** + * Menu for a specific category. + */ +public class QMenuQuest implements QMenu { + + private final Quests plugin; + private final HashMap slotsToQuestIds = new HashMap<>(); + private final QMenuCategory superMenu; + private final String categoryName; + private final int pageSize = 45; + private final QPlayer owner; + + 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) { + Collections.sort(quests); + int slot = 0; + for (Quest quest : quests) { + 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; + } + } + slotsToQuestIds.put(slot, quest.getId()); + slot++; + } + } + + @Override + public HashMap getSlotsToMenu() { + return slotsToQuestIds; + } + + @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 invSlot = 0; + 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); + 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); + 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 (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); + inventory.setItem(invSlot, 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); + inventory.setItem(invSlot, is); + } else { + inventory.setItem(invSlot, replaceItemStack(Quests.get().getQuestManager().getQuestById( + quest.getId()).getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress))); + } + } + invSlot++; + } + + 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); + 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 (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; + } 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) { + 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 (Options.CATEGORIES_ENABLED.getBooleanValue() && this.getBackButtonLocation() == 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() < this.getPageSize() && this.getSlotsToMenu().containsKey(event.getSlot() + (((this + .getCurrentPage()) - 1) * this.getPageSize()))) { + + String questid = this.getSlotsToMenu().get(event.getSlot() + (((this.getCurrentPage()) - 1) * this.getPageSize())); + Quest quest = plugin.getQuestManager().getQuestById(questid); + 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 new file mode 100644 index 00000000..5faf2b5b --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java @@ -0,0 +1,204 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.util.Items; +import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.quests.Quest; +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.*; + +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++; + } + } + } + + @Override + 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, replaceItemStack(Quests.get().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 = replaceItemStack(Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pagePrevIs = replaceItemStack(Items.PAGE_PREV.getItem(), pageplaceholders); + pageNextIs = replaceItemStack(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())); + } + } + } + + 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/QuestSortWrapper.java b/src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java new file mode 100644 index 00000000..a742e6e8 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/QuestSortWrapper.java @@ -0,0 +1,44 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.quests.Category; +import com.leonardobishop.quests.quests.Quest; + +public class QuestSortWrapper implements Comparable { + + private int weightedSortOrder; + private final Quest quest; + + public QuestSortWrapper(Quests plugin, Quest quest) { + this.quest = quest; + if (quest.getCategoryId() == null) { + weightedSortOrder = quest.getSortOrder(); + return; + } + Category c = plugin.getQuestManager().getCategoryById(quest.getCategoryId()); + if (c != null) { + int index = plugin.getQuestManager().getCategories().indexOf(c); + int amountBelow = 0; + //TODO precalculate + for (int i = index; i > 0; i--) { + Category below = plugin.getQuestManager().getCategories().get(i - 1); + amountBelow += below.getRegisteredQuestIds().size(); + } + weightedSortOrder = amountBelow + quest.getSortOrder(); + } + } + + public int getWeightedSortOrder() { + return weightedSortOrder; + } + + public Quest getQuest() { + return quest; + } + + @Override + public int compareTo(QuestSortWrapper quest) { + return (weightedSortOrder - quest.weightedSortOrder); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/obj/Items.java b/src/main/java/com/leonardobishop/quests/obj/Items.java deleted file mode 100644 index 9725459a..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/Items.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.leonardobishop.quests.obj; - -import com.leonardobishop.quests.Quests; -import org.bukkit.inventory.ItemStack; - -public enum Items { - - BACK_BUTTON("gui.back-button"), - QUEST_LOCKED("gui.quest-locked-display"), - QUEST_COOLDOWN("gui.quest-cooldown-display"), - QUEST_COMPLETED("gui.quest-completed-display"), - QUEST_PERMISSION("gui.quest-permission-display"), - PAGE_PREV("gui.page-prev"), - PAGE_NEXT("gui.page-next"), - PAGE_DESCRIPTION("gui.page-desc"), - NO_STARTED_QUESTS("gui.no-started-quests"), - QUEST_CANCEL_YES("gui.quest-cancel-yes"), - QUEST_CANCEL_NO("gui.quest-cancel-no"), - QUEST_CANCEL_BACKGROUND("gui.quest-cancel-background"); - - private final String path; - - Items(String path) { - this.path = path; - } - - public ItemStack getItem() { - return Quests.get().getItemStack(path, Quests.get().getConfig()); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/obj/Messages.java b/src/main/java/com/leonardobishop/quests/obj/Messages.java deleted file mode 100644 index 44d82f07..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/Messages.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.leonardobishop.quests.obj; - -import com.leonardobishop.quests.Quests; -import org.bukkit.ChatColor; - -public enum Messages { - - TIME_FORMAT("messages.time-format"), - QUEST_START("messages.quest-start"), - QUEST_COMPLETE("messages.quest-complete"), - QUEST_CANCEL("messages.quest-cancel"), - QUEST_TRACK("messages.quest-track"), - QUEST_TRACK_STOP("messages.quest-track-stop"), - QUEST_START_LIMIT("messages.quest-start-limit"), - QUEST_START_DISABLED("messages.quest-start-disabled"), - QUEST_START_LOCKED("messages.quest-start-locked"), - QUEST_START_COOLDOWN("messages.quest-start-cooldown"), - QUEST_START_STARTED("messages.quest-start-started"), - QUEST_START_PERMISSION("messages.quest-start-permission"), - QUEST_CATEGORY_QUEST_PERMISSION("messages.quest-category-quest-permission"), - QUEST_CATEGORY_PERMISSION("messages.quest-category-permission"), - QUEST_CANCEL_NOTSTARTED("messages.quest-cancel-notstarted"), - QUEST_UPDATER("messages.quest-updater"), - COMMAND_SUB_DOESNTEXIST("messages.command-sub-doesntexist"), - COMMAND_QUEST_START_DOESNTEXIST("messages.command-quest-start-doesntexist"), - COMMAND_QUEST_GENERAL_DOESNTEXIST("messages.command-quest-general-doesntexist"), - COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS("messages.command-quest-opencategory-admin-success"), - COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS("messages.command-quest-openquests-admin-success"), - COMMAND_QUEST_ADMIN_PLAYERNOTFOUND("messages.command-quest-admin-playernotfound"), - COMMAND_CATEGORY_OPEN_DOESNTEXIST("messages.command-category-open-doesntexist"), - COMMAND_CATEGORY_OPEN_DISABLED("messages.command-category-open-disabled"), - COMMAND_QUEST_START_ADMIN_SUCCESS("messages.command-quest-start-admin-success"), - COMMAND_TASKVIEW_ADMIN_FAIL("messages.command-taskview-admin-fail"), - COMMAND_QUEST_START_ADMIN_FAIL("messages.command-quest-start-admin-fail"), - TITLE_QUEST_START_TITLE("titles.quest-start.title"), - TITLE_QUEST_START_SUBTITLE("titles.quest-start.subtitle"), - TITLE_QUEST_COMPLETE_TITLE("titles.quest-complete.title"), - TITLE_QUEST_COMPLETE_SUBTITLE("titles.quest-complete.subtitle"), - BETA_REMINDER("messages.beta-reminder"), - COMMAND_QUEST_ADMIN_LOADDATA("messages.command-quest-admin-loaddata"), - COMMAND_QUEST_ADMIN_NODATA("messages.command-quest-admin-nodata"), - COMMAND_QUEST_ADMIN_CLEAN_SUCCESS("messages.command-quest-admin-clean-success"), - COMMAND_QUEST_ADMIN_CLEAN_FAIL("messages.command-quest-admin-clean-fail"), - COMMAND_QUEST_ADMIN_FULLRESET("messages.command-quest-admin-fullreset"), - COMMAND_QUEST_ADMIN_START_FAILLOCKED("messages.command-quest-admin-start-faillocked"), - COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN("messages.command-quest-admin-start-failcooldown"), - COMMAND_QUEST_ADMIN_START_FAILCOMPLETE("messages.command-quest-admin-start-failcomplete"), - COMMAND_QUEST_ADMIN_START_FAILLIMIT("messages.command-quest-admin-start-faillimit"), - COMMAND_QUEST_ADMIN_START_FAILSTARTED("messages.command-quest-admin-start-failstarted"), - COMMAND_QUEST_ADMIN_START_FAILPERMISSION("messages.command-quest-admin-start-failpermission"), - COMMAND_QUEST_ADMIN_START_FAILCATEGORY("messages.command-quest-admin-start-failpermission"), - COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION("messages.command-quest-admin-start-failcategorypermission"), - COMMAND_QUEST_ADMIN_START_FAILOTHER("messages.command-quest-admin-start-failother"), - COMMAND_QUEST_ADMIN_START_SUCCESS("messages.command-quest-admin-start-success"), - COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION("messages.command-quest-admin-category-permission"), - COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS("messages.command-quest-admin-complete-success"), - COMMAND_QUEST_ADMIN_RESET_SUCCESS("messages.command-quest-admin-reset-success"); - - private final String path; - - Messages(String path) { - this.path = path; - } - - public String getMessage() { - if (Quests.get().getConfig().contains(path)) { - String message = Quests.get().getConfig().getString(path); - if (message != null) { - return ChatColor.translateAlternateColorCodes('&', message); - } - } - return path; - } -} diff --git a/src/main/java/com/leonardobishop/quests/obj/Options.java b/src/main/java/com/leonardobishop/quests/obj/Options.java deleted file mode 100644 index 0d8fdc2c..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/Options.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.leonardobishop.quests.obj; - -import com.leonardobishop.quests.Quests; -import org.bukkit.ChatColor; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -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"), - TITLES_ENABLED("options.titles-enabled"), - GUI_HIDE_LOCKED("options.gui-hide-locked"), - GUI_HIDE_QUESTS_NOPERMISSION("options.gui-hide-quests-nopermission"), - GUI_HIDE_CATEGORIES_NOPERMISSION("options.gui-hide-categories-nopermission"), - GUI_USE_PLACEHOLDERAPI("options.gui-use-placeholderapi"), - GUITITLE_QUESTS_CATEGORY("options.guinames.quests-category"), - GUITITLE_QUESTS("options.guinames.quests-menu"), - GUITITLE_QUESTS_STARTED("options.guinames.quests-started-menu"), - GUITITLE_DAILY_QUESTS("options.guinames.daily-quests"), - GUITITLE_QUEST_CANCEL("options.guinames.quest-cancel"), - ALLOW_QUEST_CANCEL("options.allow-quest-cancel"), - ALLOW_QUEST_TRACK("options.allow-quest-track"), - QUEST_AUTOSAVE_ASYNC("options.performance-tweaking.quests-autosave-async"), - QUEST_JOIN_ASYNC("options.performance-tweaking.quests-join-async"), - QUEST_LEAVE_ASYNC("options.performance-tweaking.quests-leave-async"), - SOFT_CLEAN_QUESTSPROGRESSFILE_ON_JOIN("options.soft-clean-questsprogressfile-on-join"), - PUSH_SOFT_CLEAN_TO_DISK("options.tab-completion.push-soft-clean-to-disk"), - TAB_COMPLETE_ENABLED("options.tab-completion.enabled"), - ERROR_CHECKING_OVERRIDE("options.error-checking.override-errors"), - QUEST_AUTOSTART("options.quest-autostart"), - QUEST_AUTOTRACK("options.quest-autotrack"), - GLOBAL_TASK_CONFIGURATION_OVERRIDE("options.global-task-configuration-override"), - GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE("options.global-quest-display-configuration-override"), - GLOBAL_QUEST_DISPLAY_LORE_APPEND_NORMAL("global-quest-display.lore.append-normal"), - GLOBAL_QUEST_DISPLAY_LORE_APPEND_NOT_STARTED("global-quest-display.lore.append-not-started"), - GLOBAL_QUEST_DISPLAY_LORE_APPEND_STARTED("global-quest-display.lore.append-started"), - GLOBAL_QUEST_DISPLAY_LORE_APPEND_TRACKED("global-quest-display.lore.append-tracked"); - - private static final Map cachedBooleans = new ConcurrentHashMap<>(); - - private final String path; - - Options(String path) { - this.path = path; - } - - public int getIntValue() { - return Quests.get().getConfig().getInt(path); - } - - public int getIntValue(int def) { - return Quests.get().getConfig().getInt(path, def); - } - - public String getStringValue() { - return Quests.get().getConfig().getString(path); - } - - public String getStringValue(String def) { - return Quests.get().getConfig().getString(path, def); - } - - public boolean getBooleanValue() { - return cachedBooleans.computeIfAbsent(path, s -> Quests.get().getConfig().getBoolean(path)); - } - - public boolean getBooleanValue(boolean def) { - return Quests.get().getConfig().getBoolean(path, def); - } - - public List getStringListValue() { - return Quests.get().getConfig().getStringList(path); - } - - public static String color(String s) { - return ChatColor.translateAlternateColorCodes('&', s); - } - - public static List color(List s) { - if (s == null || s.size() == 0) return s; - - List colored = new ArrayList<>(); - for (String line : s) { - colored.add(ChatColor.translateAlternateColorCodes('&', line)); - } - return colored; - } - - public static void invalidateCaches() { - cachedBooleans.clear(); - } -} diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java b/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java deleted file mode 100644 index 1995fffe..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java +++ /dev/null @@ -1,157 +0,0 @@ -package com.leonardobishop.quests.obj.misc; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; -import com.leonardobishop.quests.quests.Quest; -import org.bukkit.Bukkit; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class QItemStack { - - private final Quests plugin; - - private String name; - private List loreNormal; - private List loreStarted; - private final List globalLoreAppendNormal; - private final List globalLoreAppendNotStarted; - private final List globalLoreAppendStarted; - private final List globalLoreAppendTracked; - private ItemStack startingItemStack; - - public QItemStack(Quests plugin, String name, List loreNormal, List loreStarted, ItemStack startingItemStack) { - this.plugin = plugin; - this.name = name; - this.loreNormal = loreNormal; - this.loreStarted = loreStarted; - this.startingItemStack = startingItemStack; - - this.globalLoreAppendNormal = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_NORMAL.getStringListValue()); - this.globalLoreAppendNotStarted = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_NOT_STARTED.getStringListValue()); - this.globalLoreAppendStarted = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_STARTED.getStringListValue()); - this.globalLoreAppendTracked = Options.color(Options.GLOBAL_QUEST_DISPLAY_LORE_APPEND_TRACKED.getStringListValue()); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getLoreNormal() { - return loreNormal; - } - - public void setLoreNormal(List loreNormal) { - this.loreNormal = loreNormal; - } - - public List getLoreStarted() { - return loreStarted; - } - - public void setLoreStarted(List loreStarted) { - this.loreStarted = loreStarted; - } - - public ItemStack getStartingItemStack() { - return startingItemStack; - } - - public void setStartingItemStack(ItemStack startingItemStack) { - this.startingItemStack = startingItemStack; - } - - @SuppressWarnings("deprecation") - public ItemStack toItemStack(Quest quest, QuestProgressFile questProgressFile, QuestProgress questProgress) { - ItemStack is = new ItemStack(startingItemStack); - ItemMeta ism = is.getItemMeta(); - ism.setDisplayName(name); - List formattedLore = new ArrayList<>(); - List tempLore = new ArrayList<>(); - - if (Options.GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE.getBooleanValue() && !globalLoreAppendNormal.isEmpty()) { - tempLore.addAll(globalLoreAppendNormal); - } else { - tempLore.addAll(loreNormal); - tempLore.addAll(globalLoreAppendNormal); - } - - 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 { - tempLore.addAll(loreStarted); - if (tracked) { - tempLore.addAll(globalLoreAppendTracked); - } else { - tempLore.addAll(globalLoreAppendStarted); - } - } - ism.addEnchant(Enchantment.ARROW_INFINITE, 1, true); - try { - ism.addItemFlags(ItemFlag.HIDE_ENCHANTS); - ism.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); - } catch (Exception ignored) { - - } - } else { - tempLore.addAll(globalLoreAppendNotStarted); - } - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); - } - if (questProgress != null) { - for (String s : tempLore) { - s = processPlaceholders(s, questProgress); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); - } - formattedLore.add(s); - } - } - ism.setLore(formattedLore); - is.setItemMeta(ism); - return is; - } - - public static String processPlaceholders(String s, QuestProgress questProgress) { - Matcher m = Pattern.compile("\\{([^}]+)}").matcher(s); - while (m.find()) { - String[] parts = m.group(1).split(":"); - if (parts.length > 1) { - if (questProgress.getTaskProgress(parts[0]) == null) { - continue; - } - if (parts[1].equals("progress")) { - String str = String.valueOf(questProgress.getTaskProgress(parts[0]).getProgress()); - s = s.replace("{" + m.group(1) + "}", (str.equals("null") ? String.valueOf(0) : str)); - } - if (parts[1].equals("complete")) { - String str = String.valueOf(questProgress.getTaskProgress(parts[0]).isCompleted()); - s = s.replace("{" + m.group(1) + "}", str); - } - } - } - return s; - } -} diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenu.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenu.java deleted file mode 100644 index a4f1bafb..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenu.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.leonardobishop.quests.obj.misc; - -import com.leonardobishop.quests.player.QPlayer; -import org.bukkit.inventory.Inventory; - -import java.util.HashMap; - -public interface QMenu { - - QPlayer getOwner(); - HashMap getSlotsToMenu(); - Inventory toInventory(int page); - -} diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java deleted file mode 100644 index 1c04d5cc..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.leonardobishop.quests.obj.misc; - -import com.leonardobishop.quests.obj.Items; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quests.Quest; -import org.bukkit.Bukkit; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -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 */ - } - - @Override - 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; - } - - public QMenu getSuperMenu() { - return superMenu; - } - -} diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCategory.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCategory.java deleted file mode 100644 index 86f4d57f..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCategory.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.leonardobishop.quests.obj.misc; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quests.Category; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -/** - * Menu list of categories. - */ -public class QMenuCategory implements QMenu { - - private final Quests plugin; - private final int pageSize = 45; - private final HashMap slotsToMenuQuest = new HashMap<>(); - private final QPlayer owner; - - public QMenuCategory(Quests plugin, QPlayer owner) { - this.plugin = plugin; - this.owner = owner; - } - - public void populate(List menuQuests) { - int slot = 0; - for (QMenuQuest qMenuQuest : menuQuests) { - 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; - } - } - slotsToMenuQuest.put(slot, qMenuQuest); - slot++; - } - } - - @Override - public HashMap getSlotsToMenu() { - return slotsToMenuQuest; - } - - @Override - public QPlayer getOwner() { - return owner; - } - - public Inventory toInventory(int page) { - int pageMin = pageSize * (page - 1); - int pageMax = pageSize * page; - String title = Options.color(Options.GUITITLE_QUESTS_CATEGORY.getStringValue()); - - ItemStack pageIs = new ItemStack(Material.DIRT); - - Inventory inventory = Bukkit.createInventory(null, 54, title); - - for (int pointer = pageMin; pointer < pageMax; pointer++) { - if (slotsToMenuQuest.containsKey(pointer)) { - Category category = Quests.get().getQuestManager().getCategoryById(slotsToMenuQuest.get(pointer).getCategoryName()); - if (category != null) { - inventory.setItem(pointer, replaceItemStack(category.getDisplayItem())); - } - } - } - - inventory.setItem(49, replaceItemStack(pageIs)); - - 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 < pageMax; slot++) { - if (slot >= trimmedInventory.getSize()) { - break; - } - trimmedInventory.setItem(slot, inventory.getItem(slot)); - } - return trimmedInventory; - } else { - return inventory; - } - - } - - public 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.getUuid()); - 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/obj/misc/QMenuDaily.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuDaily.java deleted file mode 100644 index 0e0cc132..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuDaily.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.leonardobishop.quests.obj.misc; - -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.quests.Quest; -import org.bukkit.Bukkit; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -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/obj/misc/QMenuQuest.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java deleted file mode 100644 index dbaf23ff..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.leonardobishop.quests.obj.misc; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.obj.Items; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quests.Quest; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.*; -import java.util.concurrent.TimeUnit; - -/** - * Menu for a specific category. - */ -public class QMenuQuest implements QMenu { - - private final Quests plugin; - private final HashMap slotsToQuestIds = new HashMap<>(); - private final QMenuCategory superMenu; - private final String categoryName; - private final int pageSize = 45; - private final QPlayer owner; - - 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) { - Collections.sort(quests); - int slot = 0; - for (Quest quest : quests) { - 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; - } - } - slotsToQuestIds.put(slot, quest.getId()); - slot++; - } - } - - @Override - public HashMap getSlotsToMenu() { - return slotsToQuestIds; - } - - @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 invSlot = 0; - 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); - 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); - 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 (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); - inventory.setItem(invSlot, 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); - inventory.setItem(invSlot, is); - } else { - inventory.setItem(invSlot, replaceItemStack(Quests.get().getQuestManager().getQuestById( - quest.getId()).getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress))); - } - } - invSlot++; - } - - 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); - 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 (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; - } 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; - } - - 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/obj/misc/QMenuStarted.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuStarted.java deleted file mode 100644 index 88222b57..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuStarted.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.leonardobishop.quests.obj.misc; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.obj.Items; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.player.QPlayer; -import com.leonardobishop.quests.player.questprogressfile.QuestProgress; -import com.leonardobishop.quests.quests.Quest; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.*; - -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++; - } - } - } - - @Override - 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, replaceItemStack(Quests.get().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 = replaceItemStack(Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); - pagePrevIs = replaceItemStack(Items.PAGE_PREV.getItem(), pageplaceholders); - pageNextIs = replaceItemStack(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; - } - - 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/obj/misc/QuestSortWrapper.java b/src/main/java/com/leonardobishop/quests/obj/misc/QuestSortWrapper.java deleted file mode 100644 index 40cd563d..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QuestSortWrapper.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.leonardobishop.quests.obj.misc; - -import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.quests.Category; -import com.leonardobishop.quests.quests.Quest; - -public class QuestSortWrapper implements Comparable { - - private int weightedSortOrder; - private final Quest quest; - - public QuestSortWrapper(Quests plugin, Quest quest) { - this.quest = quest; - if (quest.getCategoryId() == null) { - weightedSortOrder = quest.getSortOrder(); - return; - } - Category c = plugin.getQuestManager().getCategoryById(quest.getCategoryId()); - if (c != null) { - int index = plugin.getQuestManager().getCategories().indexOf(c); - int amountBelow = 0; - //TODO precalculate - for (int i = index; i > 0; i--) { - Category below = plugin.getQuestManager().getCategories().get(i - 1); - amountBelow += below.getRegisteredQuestIds().size(); - } - weightedSortOrder = amountBelow + quest.getSortOrder(); - } - } - - public int getWeightedSortOrder() { - return weightedSortOrder; - } - - public Quest getQuest() { - return quest; - } - - @Override - public int compareTo(QuestSortWrapper quest) { - return (weightedSortOrder - quest.weightedSortOrder); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/creator/QMenuCreator.java b/src/main/java/com/leonardobishop/quests/obj/misc/creator/QMenuCreator.java deleted file mode 100644 index a8800d54..00000000 --- a/src/main/java/com/leonardobishop/quests/obj/misc/creator/QMenuCreator.java +++ /dev/null @@ -1,71 +0,0 @@ -//package com.leonardobishop.quests.obj.misc.creator; -// -//import com.leonardobishop.quests.obj.misc.QMenu; -//import com.leonardobishop.quests.player.QPlayer; -//import org.bukkit.Bukkit; -//import org.bukkit.ChatColor; -//import org.bukkit.Material; -//import org.bukkit.inventory.Inventory; -//import org.bukkit.inventory.ItemStack; -//import org.bukkit.inventory.meta.ItemMeta; -// -//import java.util.ArrayList; -//import java.util.HashMap; -//import java.util.List; -// -//public class QMenuCreator implements QMenu { -// -// private final QPlayer owner; -// -// public QMenuCreator(QPlayer owner) { -// this.owner = owner; -// } -// -// @Override -// public HashMap getSlotsToMenu() { -// return null; -// } -// -// @Override -// public QPlayer getOwner() { -// return owner; -// } -// -// public Inventory toInventory(int page) { -// String title = "Quest Creator"; -// -// Inventory inventory = Bukkit.createInventory(null, 9, title); -// -// ItemStack newQuest = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 5); -// ItemMeta newQuestM = newQuest.getItemMeta(); -// List newQuestL = new ArrayList<>(); -// newQuestM.setDisplayName(ChatColor.GREEN.toString() + ChatColor.BOLD + "New Quest"); -// newQuestL.add(ChatColor.GRAY + "Click to make a new quest."); -// newQuestM.setLore(newQuestL); -// newQuest.setItemMeta(newQuestM); -// -// ItemStack editQuest = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 1); -// ItemMeta editQuestM = editQuest.getItemMeta(); -// List editQuestL = new ArrayList<>(); -// editQuestM.setDisplayName(ChatColor.GREEN.toString() + ChatColor.BOLD + "Edit Quest"); -// editQuestL.add(ChatColor.GRAY + "Click to edit an existing quest."); -// editQuestM.setLore(editQuestL); -// editQuest.setItemMeta(editQuestM); -// -// ItemStack removeQuest = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 14); -// ItemMeta removeQuestM = removeQuest.getItemMeta(); -// List removeQuestL = new ArrayList<>(); -// removeQuestM.setDisplayName(ChatColor.GREEN.toString() + ChatColor.BOLD + "Delete Quest"); -// removeQuestL.add(ChatColor.GRAY + "Click to delete an existing quest."); -// removeQuestM.setLore(removeQuestL); -// removeQuest.setItemMeta(removeQuestM); -// -// inventory.setItem(2, newQuest); -// inventory.setItem(4, editQuest); -// inventory.setItem(6, removeQuest); -// return inventory; -// -// return Bukkit.createInventory(null, 9, title); -// } -// -//} diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayer.java b/src/main/java/com/leonardobishop/quests/player/QPlayer.java index 45d58012..d5d5b66a 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayer.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayer.java @@ -1,12 +1,12 @@ package com.leonardobishop.quests.player; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.events.EventInventory; -import com.leonardobishop.quests.obj.Options; -import com.leonardobishop.quests.obj.misc.QMenuCategory; -import com.leonardobishop.quests.obj.misc.QMenuQuest; -import com.leonardobishop.quests.obj.misc.QMenuStarted; -import com.leonardobishop.quests.obj.misc.QuestSortWrapper; +import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.util.Options; +import com.leonardobishop.quests.menu.QMenuCategory; +import com.leonardobishop.quests.menu.QMenuQuest; +import com.leonardobishop.quests.menu.QMenuStarted; +import com.leonardobishop.quests.menu.QuestSortWrapper; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.quests.Category; import com.leonardobishop.quests.quests.Quest; @@ -75,7 +75,7 @@ public class QPlayer { } player.openInventory(qMenuQuest.toInventory(1)); - EventInventory.track(this.uuid, qMenuQuest); + MenuController.track(this.uuid, qMenuQuest); return 0; } @@ -106,7 +106,7 @@ public class QPlayer { qMenuCategory.populate(questMenus); player.openInventory(qMenuCategory.toInventory(1)); - EventInventory.track(player.getUniqueId(), qMenuCategory); + MenuController.track(player.getUniqueId(), qMenuCategory); } else { QMenuQuest qMenuQuest = new QMenuQuest(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), "", null); List quests = new ArrayList<>(); @@ -117,7 +117,7 @@ public class QPlayer { qMenuQuest.setBackButtonEnabled(false); player.openInventory(qMenuQuest.toInventory(1)); - EventInventory.track(player.getUniqueId(), qMenuQuest); + MenuController.track(player.getUniqueId(), qMenuQuest); } } @@ -138,7 +138,7 @@ public class QPlayer { qMenuStarted.populate(quests); player.openInventory(qMenuStarted.toInventory(1)); - EventInventory.track(player.getUniqueId(), qMenuStarted); + MenuController.track(player.getUniqueId(), qMenuStarted); } public QuestProgressFile getQuestProgressFile() { diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java index ba942978..cc33b0ff 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java @@ -2,7 +2,7 @@ package com.leonardobishop.quests.player; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.QuestsLogger; -import com.leonardobishop.quests.obj.Options; +import com.leonardobishop.quests.util.Options; import com.leonardobishop.quests.player.questprogressfile.QPlayerPreferences; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; @@ -12,7 +12,6 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.util.Collection; -import java.util.HashMap; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; 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 b2596079..e7a77853 100644 --- a/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java +++ b/src/main/java/com/leonardobishop/quests/player/questprogressfile/QuestProgressFile.java @@ -9,8 +9,8 @@ import com.leonardobishop.quests.api.events.PlayerStartQuestEvent; import com.leonardobishop.quests.api.events.PlayerStartTrackQuestEvent; import com.leonardobishop.quests.api.events.PlayerStopTrackQuestEvent; import com.leonardobishop.quests.api.events.PreStartQuestEvent; -import com.leonardobishop.quests.obj.Messages; -import com.leonardobishop.quests.obj.Options; +import com.leonardobishop.quests.util.Messages; +import com.leonardobishop.quests.util.Options; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.quests.Task; diff --git a/src/main/java/com/leonardobishop/quests/quests/Quest.java b/src/main/java/com/leonardobishop/quests/quests/Quest.java index 76aaefcf..eddeaa8b 100644 --- a/src/main/java/com/leonardobishop/quests/quests/Quest.java +++ b/src/main/java/com/leonardobishop/quests/quests/Quest.java @@ -1,6 +1,6 @@ package com.leonardobishop.quests.quests; -import com.leonardobishop.quests.obj.misc.QItemStack; +import com.leonardobishop.quests.menu.QItemStack; import org.bukkit.ChatColor; import java.util.*; diff --git a/src/main/java/com/leonardobishop/quests/updater/Updater.java b/src/main/java/com/leonardobishop/quests/updater/Updater.java index 6c197b88..5fa1a7e5 100644 --- a/src/main/java/com/leonardobishop/quests/updater/Updater.java +++ b/src/main/java/com/leonardobishop/quests/updater/Updater.java @@ -1,7 +1,7 @@ package com.leonardobishop.quests.updater; import com.leonardobishop.quests.Quests; -import com.leonardobishop.quests.obj.Messages; +import com.leonardobishop.quests.util.Messages; import java.io.BufferedReader; import java.io.IOException; diff --git a/src/main/java/com/leonardobishop/quests/util/Items.java b/src/main/java/com/leonardobishop/quests/util/Items.java new file mode 100644 index 00000000..a6af8cd5 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/util/Items.java @@ -0,0 +1,31 @@ +package com.leonardobishop.quests.util; + +import com.leonardobishop.quests.Quests; +import org.bukkit.inventory.ItemStack; + +public enum Items { + + BACK_BUTTON("gui.back-button"), + QUEST_LOCKED("gui.quest-locked-display"), + QUEST_COOLDOWN("gui.quest-cooldown-display"), + QUEST_COMPLETED("gui.quest-completed-display"), + QUEST_PERMISSION("gui.quest-permission-display"), + PAGE_PREV("gui.page-prev"), + PAGE_NEXT("gui.page-next"), + PAGE_DESCRIPTION("gui.page-desc"), + NO_STARTED_QUESTS("gui.no-started-quests"), + QUEST_CANCEL_YES("gui.quest-cancel-yes"), + QUEST_CANCEL_NO("gui.quest-cancel-no"), + QUEST_CANCEL_BACKGROUND("gui.quest-cancel-background"); + + private final String path; + + Items(String path) { + this.path = path; + } + + public ItemStack getItem() { + return Quests.get().getItemStack(path, Quests.get().getConfig()); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/util/Messages.java b/src/main/java/com/leonardobishop/quests/util/Messages.java new file mode 100644 index 00000000..fc9fb976 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/util/Messages.java @@ -0,0 +1,74 @@ +package com.leonardobishop.quests.util; + +import com.leonardobishop.quests.Quests; +import org.bukkit.ChatColor; + +public enum Messages { + + TIME_FORMAT("messages.time-format"), + QUEST_START("messages.quest-start"), + QUEST_COMPLETE("messages.quest-complete"), + QUEST_CANCEL("messages.quest-cancel"), + QUEST_TRACK("messages.quest-track"), + QUEST_TRACK_STOP("messages.quest-track-stop"), + QUEST_START_LIMIT("messages.quest-start-limit"), + QUEST_START_DISABLED("messages.quest-start-disabled"), + QUEST_START_LOCKED("messages.quest-start-locked"), + QUEST_START_COOLDOWN("messages.quest-start-cooldown"), + QUEST_START_STARTED("messages.quest-start-started"), + QUEST_START_PERMISSION("messages.quest-start-permission"), + QUEST_CATEGORY_QUEST_PERMISSION("messages.quest-category-quest-permission"), + QUEST_CATEGORY_PERMISSION("messages.quest-category-permission"), + QUEST_CANCEL_NOTSTARTED("messages.quest-cancel-notstarted"), + QUEST_UPDATER("messages.quest-updater"), + COMMAND_SUB_DOESNTEXIST("messages.command-sub-doesntexist"), + COMMAND_QUEST_START_DOESNTEXIST("messages.command-quest-start-doesntexist"), + COMMAND_QUEST_GENERAL_DOESNTEXIST("messages.command-quest-general-doesntexist"), + COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS("messages.command-quest-opencategory-admin-success"), + COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS("messages.command-quest-openquests-admin-success"), + COMMAND_QUEST_ADMIN_PLAYERNOTFOUND("messages.command-quest-admin-playernotfound"), + COMMAND_CATEGORY_OPEN_DOESNTEXIST("messages.command-category-open-doesntexist"), + COMMAND_CATEGORY_OPEN_DISABLED("messages.command-category-open-disabled"), + COMMAND_QUEST_START_ADMIN_SUCCESS("messages.command-quest-start-admin-success"), + COMMAND_TASKVIEW_ADMIN_FAIL("messages.command-taskview-admin-fail"), + COMMAND_QUEST_START_ADMIN_FAIL("messages.command-quest-start-admin-fail"), + TITLE_QUEST_START_TITLE("titles.quest-start.title"), + TITLE_QUEST_START_SUBTITLE("titles.quest-start.subtitle"), + TITLE_QUEST_COMPLETE_TITLE("titles.quest-complete.title"), + TITLE_QUEST_COMPLETE_SUBTITLE("titles.quest-complete.subtitle"), + BETA_REMINDER("messages.beta-reminder"), + COMMAND_QUEST_ADMIN_LOADDATA("messages.command-quest-admin-loaddata"), + COMMAND_QUEST_ADMIN_NODATA("messages.command-quest-admin-nodata"), + COMMAND_QUEST_ADMIN_CLEAN_SUCCESS("messages.command-quest-admin-clean-success"), + COMMAND_QUEST_ADMIN_CLEAN_FAIL("messages.command-quest-admin-clean-fail"), + COMMAND_QUEST_ADMIN_FULLRESET("messages.command-quest-admin-fullreset"), + COMMAND_QUEST_ADMIN_START_FAILLOCKED("messages.command-quest-admin-start-faillocked"), + COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN("messages.command-quest-admin-start-failcooldown"), + COMMAND_QUEST_ADMIN_START_FAILCOMPLETE("messages.command-quest-admin-start-failcomplete"), + COMMAND_QUEST_ADMIN_START_FAILLIMIT("messages.command-quest-admin-start-faillimit"), + COMMAND_QUEST_ADMIN_START_FAILSTARTED("messages.command-quest-admin-start-failstarted"), + COMMAND_QUEST_ADMIN_START_FAILPERMISSION("messages.command-quest-admin-start-failpermission"), + COMMAND_QUEST_ADMIN_START_FAILCATEGORY("messages.command-quest-admin-start-failpermission"), + COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION("messages.command-quest-admin-start-failcategorypermission"), + COMMAND_QUEST_ADMIN_START_FAILOTHER("messages.command-quest-admin-start-failother"), + COMMAND_QUEST_ADMIN_START_SUCCESS("messages.command-quest-admin-start-success"), + COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION("messages.command-quest-admin-category-permission"), + COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS("messages.command-quest-admin-complete-success"), + COMMAND_QUEST_ADMIN_RESET_SUCCESS("messages.command-quest-admin-reset-success"); + + private final String path; + + Messages(String path) { + this.path = path; + } + + public String getMessage() { + if (Quests.get().getConfig().contains(path)) { + String message = Quests.get().getConfig().getString(path); + if (message != null) { + return ChatColor.translateAlternateColorCodes('&', message); + } + } + return path; + } +} diff --git a/src/main/java/com/leonardobishop/quests/util/Options.java b/src/main/java/com/leonardobishop/quests/util/Options.java new file mode 100644 index 00000000..e1737f4b --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/util/Options.java @@ -0,0 +1,96 @@ +package com.leonardobishop.quests.util; + +import com.leonardobishop.quests.Quests; +import org.bukkit.ChatColor; + +import java.util.ArrayList; +import java.util.List; +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"), + TITLES_ENABLED("options.titles-enabled"), + GUI_HIDE_LOCKED("options.gui-hide-locked"), + GUI_HIDE_QUESTS_NOPERMISSION("options.gui-hide-quests-nopermission"), + GUI_HIDE_CATEGORIES_NOPERMISSION("options.gui-hide-categories-nopermission"), + GUI_USE_PLACEHOLDERAPI("options.gui-use-placeholderapi"), + GUITITLE_QUESTS_CATEGORY("options.guinames.quests-category"), + GUITITLE_QUESTS("options.guinames.quests-menu"), + GUITITLE_QUESTS_STARTED("options.guinames.quests-started-menu"), + GUITITLE_DAILY_QUESTS("options.guinames.daily-quests"), + GUITITLE_QUEST_CANCEL("options.guinames.quest-cancel"), + ALLOW_QUEST_CANCEL("options.allow-quest-cancel"), + ALLOW_QUEST_TRACK("options.allow-quest-track"), + QUEST_AUTOSAVE_ASYNC("options.performance-tweaking.quests-autosave-async"), + QUEST_JOIN_ASYNC("options.performance-tweaking.quests-join-async"), + QUEST_LEAVE_ASYNC("options.performance-tweaking.quests-leave-async"), + SOFT_CLEAN_QUESTSPROGRESSFILE_ON_JOIN("options.soft-clean-questsprogressfile-on-join"), + PUSH_SOFT_CLEAN_TO_DISK("options.tab-completion.push-soft-clean-to-disk"), + TAB_COMPLETE_ENABLED("options.tab-completion.enabled"), + ERROR_CHECKING_OVERRIDE("options.error-checking.override-errors"), + QUEST_AUTOSTART("options.quest-autostart"), + QUEST_AUTOTRACK("options.quest-autotrack"), + GLOBAL_TASK_CONFIGURATION_OVERRIDE("options.global-task-configuration-override"), + GLOBAL_QUEST_DISPLAY_CONFIGURATION_OVERRIDE("options.global-quest-display-configuration-override"), + GLOBAL_QUEST_DISPLAY_LORE_APPEND_NORMAL("global-quest-display.lore.append-normal"), + GLOBAL_QUEST_DISPLAY_LORE_APPEND_NOT_STARTED("global-quest-display.lore.append-not-started"), + GLOBAL_QUEST_DISPLAY_LORE_APPEND_STARTED("global-quest-display.lore.append-started"), + GLOBAL_QUEST_DISPLAY_LORE_APPEND_TRACKED("global-quest-display.lore.append-tracked"); + + private static final Map cachedBooleans = new ConcurrentHashMap<>(); + + private final String path; + + Options(String path) { + this.path = path; + } + + public int getIntValue() { + return Quests.get().getConfig().getInt(path); + } + + public int getIntValue(int def) { + return Quests.get().getConfig().getInt(path, def); + } + + public String getStringValue() { + return Quests.get().getConfig().getString(path); + } + + public String getStringValue(String def) { + return Quests.get().getConfig().getString(path, def); + } + + public boolean getBooleanValue() { + return cachedBooleans.computeIfAbsent(path, s -> Quests.get().getConfig().getBoolean(path)); + } + + public boolean getBooleanValue(boolean def) { + return Quests.get().getConfig().getBoolean(path, def); + } + + public List getStringListValue() { + return Quests.get().getConfig().getStringList(path); + } + + public static String color(String s) { + return ChatColor.translateAlternateColorCodes('&', s); + } + + public static List color(List s) { + if (s == null || s.size() == 0) return s; + + List colored = new ArrayList<>(); + for (String line : s) { + colored.add(ChatColor.translateAlternateColorCodes('&', line)); + } + return colored; + } + + public static void invalidateCaches() { + cachedBooleans.clear(); + } +} -- cgit v1.2.3-70-g09d2