diff options
| author | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2023-01-13 18:16:44 +0000 |
|---|---|---|
| committer | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2023-01-13 18:18:40 +0000 |
| commit | 7a18c1fd85180b0204664af370002533f98d9978 (patch) | |
| tree | cb6e86f07743891793151113b8efc31380bd8335 | |
| parent | c7bf2ba6a6b40a57b4b7046aa8b36f14fcabe850 (diff) | |
Refactor menu code
27 files changed, 841 insertions, 784 deletions
diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java index 8334d251..5d4f1c32 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/BukkitQuestsPlugin.java @@ -17,11 +17,7 @@ import com.leonardobishop.quests.bukkit.hook.title.Title; import com.leonardobishop.quests.bukkit.hook.title.Title_Bukkit; import com.leonardobishop.quests.bukkit.hook.title.Title_BukkitNoTimings; import com.leonardobishop.quests.bukkit.hook.title.Title_Other; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler11; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler16; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler8; -import com.leonardobishop.quests.bukkit.hook.versionspecific.VersionSpecificHandler9; +import com.leonardobishop.quests.bukkit.hook.versionspecific.*; import com.leonardobishop.quests.bukkit.item.ParsedQuestItem; import com.leonardobishop.quests.bukkit.item.QuestItem; import com.leonardobishop.quests.bukkit.item.QuestItemRegistry; diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCategoryCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCategoryCommandHandler.java index 5c8d527f..485b234d 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCategoryCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiCategoryCommandHandler.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.bukkit.command; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.MenuUtils; import com.leonardobishop.quests.bukkit.util.Messages; import com.leonardobishop.quests.common.player.QPlayer; import com.leonardobishop.quests.common.quest.Category; @@ -37,12 +38,13 @@ public class AdminOpenguiCategoryCommandHandler implements CommandHandler { if (player != null) { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer != null) { - if (plugin.getMenuController().openQuestCategory(qPlayer, category, null, false) == 0) { + if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { + Messages.COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION.send(sender, "{player}", player.getName(), "{category}", category.getId()); + } else { + MenuUtils.openQuestCategory(plugin, qPlayer, category, null); Messages.COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS.send(sender, "{player}", player.getName(), "{category}", category.getId()); - } else { - Messages.COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION.send(sender, "{player}", player.getName(), "{category}", category.getId()); } return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiQuestCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiQuestCommandHandler.java index c94174d2..04f7cad3 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiQuestCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiQuestCommandHandler.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.bukkit.command; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.MenuUtils; import com.leonardobishop.quests.bukkit.util.Messages; import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.Bukkit; @@ -27,7 +28,7 @@ public class AdminOpenguiQuestCommandHandler implements CommandHandler { if (player != null) { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer != null) { - plugin.getMenuController().openMainMenu(qPlayer); + MenuUtils.openMainMenu(plugin, qPlayer); Messages.COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS.send(sender, "{player}", player.getName()); return; diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiStartedCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiStartedCommandHandler.java index 99968948..516c5a2f 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiStartedCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/AdminOpenguiStartedCommandHandler.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.bukkit.command; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.MenuUtils; import com.leonardobishop.quests.bukkit.util.Messages; import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.Bukkit; @@ -27,7 +28,7 @@ public class AdminOpenguiStartedCommandHandler implements CommandHandler { if (player != null) { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer != null) { - plugin.getMenuController().openStartedQuests(qPlayer); + MenuUtils.openStartedQuests(plugin, qPlayer); Messages.COMMAND_QUEST_OPENSTARTED_ADMIN_SUCCESS.send(sender, "{player}", player.getName()); return; diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CategoryCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CategoryCommandHandler.java index d536b3ca..e4bc280d 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CategoryCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/CategoryCommandHandler.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.bukkit.command; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.MenuUtils; import com.leonardobishop.quests.bukkit.util.Messages; import com.leonardobishop.quests.common.player.QPlayer; import com.leonardobishop.quests.common.quest.Category; @@ -36,8 +37,13 @@ public class CategoryCommandHandler implements CommandHandler { } if (category == null) { Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.send(sender, "{category}", args[1]); + } else if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { + Messages.COMMAND_QUEST_ADMIN_CATEGORY_PERMISSION.send(sender, "{player}", player.getName(), "{category}", category.getId()); } else { - plugin.getMenuController().openQuestCategory(qPlayer, category, null, false); + MenuUtils.openQuestCategory(plugin, qPlayer, category, null); + Messages.COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS.send(sender, + "{player}", player.getName(), + "{category}", category.getId()); } return; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandSwitcher.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandSwitcher.java index c880a851..e756fb55 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandSwitcher.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/QuestsCommandSwitcher.java @@ -2,6 +2,7 @@ package com.leonardobishop.quests.bukkit.command; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.util.CommandUtils; +import com.leonardobishop.quests.bukkit.util.MenuUtils; import com.leonardobishop.quests.bukkit.util.Messages; import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.ChatColor; @@ -61,7 +62,7 @@ public class QuestsCommandSwitcher extends CommandSwitcher implements TabExecuto Messages.COMMAND_DATA_NOT_LOADED.send(player); return true; } - plugin.getMenuController().openMainMenu(qPlayer); + MenuUtils.openMainMenu(plugin, qPlayer); return true; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/StartedCommandHandler.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/StartedCommandHandler.java index 0eacba4a..d94edb55 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/StartedCommandHandler.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/command/StartedCommandHandler.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.bukkit.command; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.MenuUtils; import com.leonardobishop.quests.bukkit.util.Messages; import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.command.CommandSender; @@ -26,7 +27,7 @@ public class StartedCommandHandler implements CommandHandler { Messages.COMMAND_DATA_NOT_LOADED.send(player); return; } - plugin.getMenuController().openStartedQuests(qPlayer); + MenuUtils.openStartedQuests(plugin, qPlayer); } @Override diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java index fb0a334a..63ed54db 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java @@ -2,32 +2,46 @@ package com.leonardobishop.quests.bukkit.menu; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.element.*; import com.leonardobishop.quests.bukkit.util.chat.Chat; import com.leonardobishop.quests.common.player.QPlayer; import com.leonardobishop.quests.common.quest.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; /** * Represents a cancellation confirmation menu for a specific quest. */ -public class CancelQMenu implements QMenu { +public class CancelQMenu extends QMenu { private final BukkitQuestsPlugin plugin; private final BukkitQuestsConfig config; private final QMenu superMenu; - private final QPlayer owner; private final Quest quest; public CancelQMenu(BukkitQuestsPlugin plugin, QMenu superMenu, QPlayer owner, Quest quest) { + super(owner); this.plugin = plugin; this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); this.superMenu = superMenu; - this.owner = owner; this.quest = quest; + + MenuElement questMenuElement = new QuestMenuElement(plugin, quest, this, true); + MenuElement confirmCancelMenuElement = new ConfirmCancelMenuElement(plugin, owner, quest, superMenu); + MenuElement abortCancelMenuElement = new AbortCancelMenuElement(plugin, owner, superMenu); + MenuElement border = new CustomMenuElement(plugin, owner.getPlayerUUID(), null, config.getItem("gui.quest-cancel-background")); + + for (int i = 0; i < 27; i++) { + menuElements.put(i, border); + } + + menuElements.put(10, abortCancelMenuElement); + menuElements.put(11, abortCancelMenuElement); + menuElements.put(12, abortCancelMenuElement); + menuElements.put(13, questMenuElement); + menuElements.put(14, confirmCancelMenuElement); + menuElements.put(15, confirmCancelMenuElement); + menuElements.put(16, confirmCancelMenuElement); } public Quest getQuest() { @@ -35,54 +49,16 @@ public class CancelQMenu implements QMenu { } @Override - public QPlayer getOwner() { - return owner; - } - - public Inventory toInventory(int page) { + public Inventory draw() { String title = Chat.legacyColor(config.getString("options.guinames.quest-cancel")); - - ItemStack yes = config.getItem("gui.quest-cancel-yes"); - ItemStack no = config.getItem("gui.quest-cancel-no"); - - ItemStack background = config.getItem("gui.quest-cancel-background"); - 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, plugin.getQItemStackRegistry().getQuestItemStack(quest).toItemStack(quest, owner, owner.getQuestProgressFile().getQuestProgress(quest))); - inventory.setItem(14, yes); - inventory.setItem(15, yes); - inventory.setItem(16, yes); - - return inventory; - } - - @Override - public boolean handleClick(InventoryClickEvent event, MenuController controller) { - if (event.getSlot() == 10 || event.getSlot() == 11 || event.getSlot() == 12) { - controller.openMenu(event.getWhoClicked(), superMenu, 1); - return true; - } else if (event.getSlot() == 14 || event.getSlot() == 15 || event.getSlot() == 16) { - if (owner.cancelQuest(quest)) { - event.getWhoClicked().closeInventory(); - return true; + for (int pointer = 0; pointer < 27; pointer++) { + if (menuElements.containsKey(pointer)) { + inventory.setItem(pointer, menuElements.get(pointer).asItemStack()); } } - return false; - } - public QMenu getSuperMenu() { - return superMenu; + return inventory; } - } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java index dedaf209..e4303652 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java @@ -3,179 +3,54 @@ package com.leonardobishop.quests.bukkit.menu; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; import com.leonardobishop.quests.bukkit.menu.element.CategoryMenuElement; -import com.leonardobishop.quests.bukkit.menu.element.CustomMenuElement; import com.leonardobishop.quests.bukkit.menu.element.MenuElement; -import com.leonardobishop.quests.bukkit.menu.element.SpacerMenuElement; -import com.leonardobishop.quests.bukkit.util.MenuUtils; -import com.leonardobishop.quests.bukkit.util.Messages; -import com.leonardobishop.quests.bukkit.util.StringUtils; import com.leonardobishop.quests.bukkit.util.chat.Chat; import com.leonardobishop.quests.common.player.QPlayer; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import com.leonardobishop.quests.common.quest.Category; +import com.leonardobishop.quests.common.quest.Quest; import org.bukkit.Bukkit; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import java.util.Collections; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * Represents a menu which contains a listing of different categories. */ -public class CategoryQMenu implements QMenu { +public class CategoryQMenu extends PaginatedQMenu { private final BukkitQuestsPlugin plugin; - private final BukkitQuestsConfig config; - private final Int2ObjectOpenHashMap<MenuElement> menuElements = new Int2ObjectOpenHashMap<>(); - private final QPlayer owner; - - private int pageSize = 45; - private int maxElement = 0; - private int pagePrevLocation = -1; - private int pageNextLocation = -1; - private int currentPage = -1; public CategoryQMenu(BukkitQuestsPlugin plugin, QPlayer owner) { - this.plugin = plugin; - this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); - this.owner = owner; - } + super(owner, Chat.legacyColor(plugin.getQuestsConfig().getString("options.guinames.quests-category")), + plugin.getQuestsConfig().getBoolean("options.trim-gui-size"), 54, plugin); - public void populate(List<QuestQMenu> menuQuests) { - if (config.getConfig().isConfigurationSection("custom-elements.categories")) { - for (String s : config.getConfig().getConfigurationSection("custom-elements.categories").getKeys(false)) { - if (!StringUtils.isNumeric(s)) continue; - int slot = Integer.parseInt(s); - int repeat = config.getInt("custom-elements.categories." + s + ".repeat"); - MenuElement menuElement; - if (config.getConfig().contains("custom-elements.categories." + s + ".display")) { - ItemStack is = config.getItem("custom-elements.categories." + s + ".display"); - List<String> commands = plugin.getQuestsConfig().getStringList( "custom-elements.categories." + s + ".commands"); - menuElement = new CustomMenuElement(plugin, owner.getPlayerUUID(), is, commands); - } else if (config.getBoolean("custom-elements.categories." + s + ".spacer", false)) { - menuElement = new SpacerMenuElement(); - } else continue; // user = idiot + this.plugin = plugin; + BukkitQuestsConfig config = (BukkitQuestsConfig) plugin.getQuestsConfig(); - for (int i = 0; i <= repeat; i++) { - menuElements.put(slot + i, menuElement); - } + List<MenuElement> categoryMenuElements = new ArrayList<>(); + for (Category category : plugin.getQuestManager().getCategories()) { + if (category.isHidden()) { + continue; } - } - int slot = 0; - for (QuestQMenu questQMenu : menuQuests) { - while (menuElements.containsKey(slot)) slot++; - if (config.getBoolean("options.gui-hide-categories-nopermission") && plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()).isPermissionRequired()) { - if (!Bukkit.getPlayer(owner.getPlayerUUID()).hasPermission("quests.category." + questQMenu.getCategoryName())) { + if (config.getBoolean("options.gui-hide-categories-nopermission") + && category.isPermissionRequired()) { + if (!Bukkit.getPlayer(owner.getPlayerUUID()).hasPermission("quests.category." + category.getId())) { continue; } } - menuElements.put(slot, new CategoryMenuElement(plugin, owner.getPlayerUUID(), questQMenu)); - slot++; - } - - maxElement = menuElements.size() > 0 ? Collections.max(menuElements.keySet()) + 1 : 0; - - // stop bottom row of pg1 going to pg2 if entire inv contents would fit on pg1 perfectly - if (maxElement > 45 && maxElement <= 54) { - pageSize = 54; - } else { - pageSize = 45; - } - } - - @Override - public QPlayer getOwner() { - return owner; - } - - public Inventory toInventory(int page) { - currentPage = page; - int pageMin = pageSize * (page - 1); - int pageMax = pageSize * page; - String title = Chat.legacyColor(config.getString("options.guinames.quests-category")); - - ItemStack pageIs; - ItemStack pagePrevIs; - ItemStack pageNextIs; - Inventory inventory = Bukkit.createInventory(null, 54, title); - - int highestOnPage = 0; - for (int pointer = pageMin; pointer < pageMax; pointer++) { - if (menuElements.containsKey(pointer)) { - inventory.setItem(pointer - ((page - 1) * pageSize), menuElements.get(pointer).asItemStack()); - if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; + List<Quest> quests = new ArrayList<>(); + for (String questid : category.getRegisteredQuestIds()) { + Quest quest = plugin.getQuestManager().getQuestById(questid); + if (quest != null) { + quests.add(quest); + } } + QuestQMenu questQMenu = new QuestQMenu(plugin, owner, quests, category.getId(), this); + MenuElement menuElement = new CategoryMenuElement(plugin, owner.getPlayerUUID(), category, questQMenu); + categoryMenuElements.add(menuElement); } - pageNextLocation = -1; - pagePrevLocation = -1; - - Map<String, String> pageplaceholders = new HashMap<>(); - pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); - pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); - pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-desc"), pageplaceholders); - pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-prev"), pageplaceholders); - pageNextIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-next"), pageplaceholders); - - if (maxElement > pageSize) { - inventory.setItem(49, pageIs); - if (page != 1) { - inventory.setItem(48, pagePrevIs); - pagePrevLocation = 48; - } - if (Math.ceil((double) maxElement / ((double) pageSize)) != page) { - inventory.setItem(50, pageNextIs); - pageNextLocation = 50; - } - } else if (config.getBoolean("options.trim-gui-size") && page == 1) { - int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); - inventorySize = inventorySize <= 0 ? 9 : inventorySize; - if (inventorySize == 54) { - return inventory; - } - - Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); - - for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { - trimmedInventory.setItem(slot, inventory.getItem(slot)); - } - return trimmedInventory; - } - return inventory; + super.populate("custom-elements.categories", categoryMenuElements, null); } - @Override - public boolean handleClick(InventoryClickEvent event, MenuController controller) { - if (pagePrevLocation == event.getSlot()) { - controller.openMenu(event.getWhoClicked(), this, currentPage - 1); - return true; - - } else if (pageNextLocation == event.getSlot()) { - controller.openMenu(event.getWhoClicked(), this, currentPage + 1); - return true; - - } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { - MenuElement element = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); - if (element instanceof CategoryMenuElement categoryMenuElement) { - QuestQMenu questQMenu = categoryMenuElement.getQuestMenu(); - if (plugin.getMenuController().openQuestCategory(owner, - plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()), questQMenu) != 0) { - Messages.QUEST_CATEGORY_QUEST_PERMISSION.send(event.getWhoClicked()); - } else { - return true; - } - } else if (element instanceof CustomMenuElement customMenuElement) { - for (String command : customMenuElement.getCommands()) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), - command.replace("{player}", event.getWhoClicked().getName())); - } - } - } - return false; - } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/ClickResult.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/ClickResult.java new file mode 100644 index 00000000..c6ba74e9 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/ClickResult.java @@ -0,0 +1,20 @@ +package com.leonardobishop.quests.bukkit.menu; + +public enum ClickResult { + + /** + * Do not do any special operation. + */ + DO_NOTHING, + + /** + * Close the menu. + */ + CLOSE_MENU, + + /** + * Refresh the menu. + */ + REFRESH_PANE + +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java index fa361014..33f086b5 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java @@ -1,10 +1,8 @@ package com.leonardobishop.quests.bukkit.menu; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.menu.element.MenuElement; import com.leonardobishop.quests.bukkit.util.SoundUtils; -import com.leonardobishop.quests.common.player.QPlayer; -import com.leonardobishop.quests.common.quest.Category; -import com.leonardobishop.quests.common.quest.Quest; import org.bukkit.Bukkit; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; @@ -14,7 +12,8 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType; -import java.util.*; +import java.util.HashMap; +import java.util.UUID; public class MenuController implements Listener { @@ -25,10 +24,19 @@ public class MenuController implements Listener { this.plugin = plugin; } - public void openMenu(HumanEntity player, QMenu qMenu, int page) { + public void openMenu(UUID uuid, QMenu qMenu) { + Player player = Bukkit.getPlayer(uuid); + if (player == null) { + return; + } + + openMenu(player, qMenu); + } + + public void openMenu(HumanEntity player, QMenu qMenu) { SoundUtils.playSoundForPlayer((Player) player, plugin.getQuestsConfig().getString("options.sounds.gui.open")); // Bukkit.getScheduler().runTaskLater(plugin, () -> SoundUtils.playSoundForPlayer((Player) player, plugin.getQuestsConfig().getString("options.sounds.gui.open")), 1L); - player.openInventory(qMenu.toInventory(page)); + player.openInventory(qMenu.draw()); tracker.put(player.getUniqueId(), qMenu); } @@ -49,135 +57,43 @@ public class MenuController implements Listener { return; //The clicked inventory is a player inventory type QMenu qMenu = tracker.get(player.getUniqueId()); - if (qMenu.handleClick(event, this)) { - SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.gui.interact")); -// Bukkit.getScheduler().runTaskLater(plugin, () -> SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.gui.interact")), 1L); + MenuElement menuElement = qMenu.getMenuElementAt(event.getSlot()); + if (menuElement == null) { + return; } - } - } - - /** - * Opens a quest listing menu for the player. - * - * @return 0 if success, 1 if no permission, 2 is only data loaded, 3 if player not found - */ - public int openQuestCategory(QPlayer qPlayer, Category category, CategoryQMenu superMenu, boolean backButton) { - Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); - if (player == null) { - return 3; - } - - if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { - return 1; - } - - // Using `this` instead of searching again for this QPlayer - QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, category.getId(), superMenu); - List<Quest> quests = new ArrayList<>(); - for (String questid : category.getRegisteredQuestIds()) { - Quest quest = plugin.getQuestManager().getQuestById(questid); - if (quest != null) { - quests.add(quest); + ClickResult result = menuElement.handleClick(event.getClick()); + if (result == ClickResult.DO_NOTHING) { + return; } - } - questQMenu.populate(quests); - questQMenu.setBackButtonEnabled(backButton); - - openMenu(player, questQMenu, 1); - return 0; - } - - /** - * Opens a specific quest listing menu for the player. - * - * @return 0 if success, 1 if no permission, 2 is only data loaded, 3 if player not found - */ - public int openQuestCategory(QPlayer qPlayer, Category category, QuestQMenu questQMenu) { - Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); - if (player == null) { - return 3; - } - - if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { - return 1; - } - - openMenu(player, questQMenu, 1); - return 0; - } - - /** - * Open the main menu for the player - * - * @param qPlayer player - */ - public void openMainMenu(QPlayer qPlayer) { - Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); - if (player == null) { - return; - } - - if (plugin.getQuestController().getName().equals("normal")) { - if (plugin.getQuestsConfig().getBoolean("options.categories-enabled")) { - CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, qPlayer); - List<QuestQMenu> questMenus = new ArrayList<>(); - for (Category category : plugin.getQuestManager().getCategories()) { - if (category.isHidden()) { - continue; - } - - QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, category.getId(), categoryQMenu); - List<Quest> quests = new ArrayList<>(); - for (String questid : category.getRegisteredQuestIds()) { - Quest quest = plugin.getQuestManager().getQuestById(questid); - if (quest != null) { - quests.add(quest); - } - } - questQMenu.populate(quests); - questMenus.add(questQMenu); - } - categoryQMenu.populate(questMenus); - - openMenu(player, categoryQMenu, 1); - } else { - QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, "", null); - List<Quest> quests = new ArrayList<>(); - for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { - quests.add(entry.getValue()); - } - questQMenu.populate(quests); - questQMenu.setBackButtonEnabled(false); - - openMenu(player, questQMenu, 1); + SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.gui.interact")); + if (result == ClickResult.REFRESH_PANE) { + player.openInventory(qMenu.draw()); + tracker.put(player.getUniqueId(), qMenu); + } else if (result == ClickResult.CLOSE_MENU) { + player.closeInventory(); } } -// } else { -// DailyQMenu dailyQMenu = new DailyQMenu(plugin, this); -// dailyQMenu.populate(); -// plugin.getMenuController().openMenu(player, dailyQMenu, 1); -// } } - /** - * Open the started menu for the player - * - * @param qPlayer player - */ - public void openStartedQuests(QPlayer qPlayer) { - Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); - if (player == null) { - return; - } - - StartedQMenu startedQMenu = new StartedQMenu(plugin, qPlayer); - List<QuestSortWrapper> quests = new ArrayList<>(); - for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { - quests.add(new QuestSortWrapper(plugin, entry.getValue())); - } - startedQMenu.populate(quests); - - openMenu(player, startedQMenu, 1); - } +// /** +// * Open the started menu for the player +// * +// * @param qPlayer player +// */ +// public void openStartedQuests(QPlayer qPlayer) { +// Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); +// if (player == null) { +// return; +// } +// +// StartedQMenu startedQMenu = new StartedQMenu(plugin, qPlayer); +// List<QuestSortWrapper> quests = new ArrayList<>(); +// for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { +// quests.add(new QuestSortWrapper(plugin, entry.getValue())); +// } +// startedQMenu.populate(quests); +// +// openMenu(player, startedQMenu, 1); +// } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/PaginatedQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/PaginatedQMenu.java new file mode 100644 index 00000000..dd094855 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/PaginatedQMenu.java @@ -0,0 +1,207 @@ +package com.leonardobishop.quests.bukkit.menu; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.element.*; +import com.leonardobishop.quests.bukkit.util.StringUtils; +import com.leonardobishop.quests.common.player.QPlayer; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +public abstract class PaginatedQMenu extends QMenu { + + protected final String title; + protected final boolean trim; + private final BukkitQuestsPlugin plugin; + protected int currentPage; + protected int pageSize; + protected int minPage; + protected int maxPage; + + public PaginatedQMenu(QPlayer owner, String title, boolean trim, int pageSize, BukkitQuestsPlugin plugin) { + super(owner); + this.title = title; + this.trim = trim; + this.plugin = plugin; + this.pageSize = pageSize; + this.currentPage = 1; + this.minPage = 1; + this.maxPage = 1; + } + + public int getCurrentPage() { + return currentPage; + } + + public void setCurrentPage(int currentPage) { + this.currentPage = Math.max(minPage, Math.min(maxPage, currentPage)); + } + + public int getMinPage() { + return minPage; + } + + public void setMinPage(int minPage) { + this.minPage = minPage; + } + + public int getMaxPage() { + return maxPage; + } + + public void setMaxPage(int maxPage) { + this.maxPage = maxPage; + } + + public void populate(String customElementsPath, List<MenuElement> menuElementsToFill, MenuElement backMenuElement) { + Player player = Bukkit.getPlayer(owner.getPlayerUUID()); + if (player == null) { + return; + } + + MenuElement[] staticMenuElements = new MenuElement[pageSize]; + int customStaticElements = 0; + MenuElement spacer = new SpacerMenuElement(); + + // populate custom elements first + if (customElementsPath != null) { + if (plugin.getConfig().isConfigurationSection(customElementsPath)) { + for (String s : plugin.getConfig().getConfigurationSection(customElementsPath).getKeys(false)) { + if (!StringUtils.isNumeric(s)) continue; + int slot = Integer.parseInt(s); + int repeat = plugin.getConfig().getInt(customElementsPath + "." + s + ".repeat"); + boolean staticElement = plugin.getConfig().getBoolean(customElementsPath + "." + s + ".static", false); + MenuElement menuElement; + if (plugin.getConfig().contains(customElementsPath + "." + s + ".display")) { + ItemStack is = plugin.getConfiguredItemStack(customElementsPath + "." + s + ".display", plugin.getConfig()); + List<String> commands = plugin.getQuestsConfig().getStringList(customElementsPath + "." + s + ".commands"); + menuElement = new CustomMenuElement(plugin, owner.getPlayerUUID(), player.getName(), is, commands); + } else if (plugin.getConfig().getBoolean(customElementsPath + "." + s + ".spacer", false)) { + menuElement = spacer; + } else continue; // user = idiot + + for (int i = 0; i <= repeat; i++) { + if (staticElement) { + int boundedSlot = slot + i % pageSize; + staticMenuElements[boundedSlot] = menuElement; + customStaticElements++; + } else { + menuElements.put(slot + i, menuElement); + } + } + } + } + } + + // TODO: make these page controls configurable + // if the amount of predicted menu elements is greater than the size of a page, add + // the page controls as menu elements + // this won't check if static elements overlap normal ones first but i don't care + int maxSize = pageSize - (backMenuElement == null ? 0 : 9); + BukkitQuestsConfig config = (BukkitQuestsConfig) plugin.getQuestsConfig(); + if ((menuElements.isEmpty() ? 0 : Collections.max(menuElements.keySet())) + 1 > maxSize + || menuElements.keySet().size() + menuElementsToFill.size() + customStaticElements > maxSize) { + MenuElement pageNextMenuElement = new PageNextMenuElement(config, this); + MenuElement pagePrevMenuElement = new PagePrevMenuElement(config, this); + MenuElement pageDescMenuElement = new PageDescMenuElement(config, this); + staticMenuElements[45] = backMenuElement == null ? spacer : backMenuElement; + staticMenuElements[46] = spacer; + staticMenuElements[47] = spacer; + staticMenuElements[48] = pagePrevMenuElement; + staticMenuElements[49] = pageDescMenuElement; + staticMenuElements[50] = pageNextMenuElement; + staticMenuElements[51] = spacer; + staticMenuElements[52] = spacer; + staticMenuElements[53] = spacer; + + // else find a place for the back button if needed + } else if (backMenuElement != null) { + int row = ((menuElements.keySet().size() + menuElementsToFill.size() + customStaticElements) / 9) + 1; + staticMenuElements[row * 9] = backMenuElement; + } + + boolean staticMenuElementsIsFull = true; + for (MenuElement e : staticMenuElements) { + if (e == null) { + staticMenuElementsIsFull = false; + break; + } + } + if (staticMenuElementsIsFull) { + // moving on will result in an infinite loop + return; + } + + // fill in the remaining menu elements into empty slots + int slot = 0; + for (MenuElement element : menuElementsToFill) { + fillStaticMenuElements(slot, staticMenuElements); + while (menuElements.containsKey(slot)) { + slot++; + fillStaticMenuElements(slot, staticMenuElements); + } + menuElements.put(slot, element); + } + + this.minPage = 1; + this.maxPage = (menuElements.isEmpty() ? 0 : Collections.max(menuElements.keySet())) / pageSize + 1; + } + + private void fillStaticMenuElements(int slot, MenuElement[] staticMenuElements) { + if (slot % pageSize == 0) { + // new page, put in static menu elements + for (int i = 0; i < staticMenuElements.length; i++) { + if (staticMenuElements[i] == null) { + continue; + } + + menuElements.put(slot + i, staticMenuElements[i]); + } + } + } + + @Override + public Inventory draw() { + int pageMin = pageSize * (currentPage - 1); + int pageMax = pageSize * currentPage; + + Inventory inventory = Bukkit.createInventory(null, 54, title); + + int highestOnPage = 0; + for (int pointer = pageMin; pointer < pageMax; pointer++) { + if (menuElements.containsKey(pointer)) { + inventory.setItem(pointer - ((currentPage - 1) * pageSize), menuElements.get(pointer).asItemStack()); + if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; + } + } + + if (trim && currentPage == 1) { + int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); + inventorySize = inventorySize <= 0 ? 9 : inventorySize; + if (inventorySize == 54) { + return inventory; + } + + Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); + + for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { + trimmedInventory.setItem(slot, inventory.getItem(slot)); + } + return trimmedInventory; + } + + return inventory; + } + + @Override + public @Nullable MenuElement getMenuElementAt(int slot) { + int pageOffset = (currentPage - 1) * pageSize; + return super.getMenuElementAt(slot + pageOffset); + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java index 898041f3..0c7a389c 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java @@ -1,13 +1,28 @@ package com.leonardobishop.quests.bukkit.menu; +import com.leonardobishop.quests.bukkit.menu.element.MenuElement; import com.leonardobishop.quests.common.player.QPlayer; -import org.bukkit.event.inventory.InventoryClickEvent; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.bukkit.inventory.Inventory; +import org.jetbrains.annotations.Nullable; -public interface QMenu { +public abstract class QMenu { - QPlayer getOwner(); - Inventory toInventory(int page); - boolean handleClick(InventoryClickEvent event, MenuController controller); + protected final QPlayer owner; + protected final Int2ObjectOpenHashMap<MenuElement> menuElements = new Int2ObjectOpenHashMap<>(); + + public QMenu(QPlayer owner) { + this.owner = owner; + } + + public final QPlayer getOwner() { + return owner; + } + + public @Nullable MenuElement getMenuElementAt(int slot) { + return menuElements.get(slot); + } + + abstract Inventory draw(); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java index dddd8062..a33f344f 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java @@ -2,96 +2,37 @@ package com.leonardobishop.quests.bukkit.menu; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; -import com.leonardobishop.quests.bukkit.menu.element.CustomMenuElement; +import com.leonardobishop.quests.bukkit.menu.element.BackMenuElement; import com.leonardobishop.quests.bukkit.menu.element.MenuElement; import com.leonardobishop.quests.bukkit.menu.element.QuestMenuElement; -import com.leonardobishop.quests.bukkit.menu.element.SpacerMenuElement; -import com.leonardobishop.quests.bukkit.util.MenuUtils; -import com.leonardobishop.quests.bukkit.util.StringUtils; import com.leonardobishop.quests.bukkit.util.chat.Chat; -import com.leonardobishop.quests.common.enums.QuestStartResult; import com.leonardobishop.quests.common.player.QPlayer; import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.common.quest.Quest; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.bukkit.Bukkit; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import java.util.Collections; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; -import java.util.Map; /** * Represents a menu for a specified category (or all if they are disabled), * which contains a listing of different quests. */ -public class QuestQMenu implements QMenu { +public class QuestQMenu extends PaginatedQMenu { - private final BukkitQuestsPlugin plugin; - private final BukkitQuestsConfig config; - private final Int2ObjectOpenHashMap<MenuElement> menuElements = new Int2ObjectOpenHashMap<>(); - private final CategoryQMenu superMenu; private final String categoryName; - private final int pageSize = 45; - private final QPlayer owner; - private final ClickType startClickType; - private final ClickType trackClickType; - private final ClickType cancelClickType; - private int maxElement = 0; - private int backButtonLocation = -1; - private int pagePrevLocation = -1; - private int pageNextLocation = -1; - private int currentPage = -1; - private boolean backButtonEnabled = true; + public QuestQMenu(BukkitQuestsPlugin plugin, QPlayer owner, List<Quest> quests, String categoryName, CategoryQMenu categoryQMenu) { + super(owner, Chat.legacyColor(plugin.getQuestsConfig().getString("options.guinames.quests-menu")), + plugin.getQuestsConfig().getBoolean("options.trim-gui-size"), 54, plugin); - public QuestQMenu(BukkitQuestsPlugin plugin, QPlayer owner, String categoryName, CategoryQMenu superMenu) { - this.plugin = plugin; - this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); - this.owner = owner; + BukkitQuestsConfig config = (BukkitQuestsConfig) plugin.getQuestsConfig(); this.categoryName = categoryName; - this.superMenu = superMenu; - this.startClickType = MenuUtils.getClickType(config, "options.gui-actions.start-quest", "LEFT"); - this.trackClickType = MenuUtils.getClickType(config, "options.gui-actions.track-quest", "MIDDLE"); - this.cancelClickType = MenuUtils.getClickType(config, "options.gui-actions.cancel-quest", "RIGHT"); - } - - public void populate(List<Quest> quests) { - String path; - if (config.getBoolean("options.categories-enabled")) { - path = "custom-elements.c:" + categoryName; - } else { - path = "custom-elements.quests"; - } - if (plugin.getConfig().isConfigurationSection(path)) { - for (String s : plugin.getConfig().getConfigurationSection(path).getKeys(false)) { - if (!StringUtils.isNumeric(s)) continue; - int slot = Integer.parseInt(s); - int repeat = plugin.getConfig().getInt(path + "." + s + ".repeat"); - MenuElement menuElement; - if (plugin.getConfig().contains(path + "." + s + ".display")) { - ItemStack is = plugin.getConfiguredItemStack(path + "." + s + ".display", plugin.getConfig()); - List<String> commands = plugin.getQuestsConfig().getStringList(path + "." + s + ".commands"); - menuElement = new CustomMenuElement(plugin, owner.getPlayerUUID(), is, commands); - } else if (plugin.getConfig().getBoolean(path + "." + s + ".spacer", false)) { - menuElement = new SpacerMenuElement(); - } else continue; // user = idiot + MenuElement backMenuElement = new BackMenuElement(config, owner.getPlayerUUID(), plugin.getMenuController(), categoryQMenu); - for (int i = 0; i <= repeat; i++) { - menuElements.put(slot + i, menuElement); - } - } - } - - Collections.sort(quests); - int slot = 0; + List<MenuElement> filteredQuests = new ArrayList<>(); for (Quest quest : quests) { - while (menuElements.containsKey(slot)) slot++; if (config.getBoolean("options.gui-hide-locked")) { QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); @@ -104,166 +45,20 @@ public class QuestQMenu implements QMenu { continue; } } - menuElements.put(slot, new QuestMenuElement(plugin, owner, quest)); - slot++; + filteredQuests.add(new QuestMenuElement(plugin, quest, this)); } - maxElement = menuElements.size() > 0 ? Collections.max(menuElements.keySet()) + 1 : 0; - } - - @Override - public QPlayer getOwner() { - return owner; + String path; + if (categoryName != null) { + path = "custom-elements.c:" + categoryName; + } else { + path = "custom-elements.quests"; + } + super.populate(path, filteredQuests, backMenuElement); } 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 = Chat.legacyColor(config.getString("options.guinames.quests-menu")); - - ItemStack pageIs; - ItemStack pagePrevIs; - ItemStack pageNextIs; - ItemStack back = config.getItem("gui.back-button"); - - Inventory inventory = Bukkit.createInventory(null, 54, title); - - int highestOnPage = 0; - for (int pointer = pageMin; pointer < pageMax; pointer++) { - if (menuElements.containsKey(pointer)) { - inventory.setItem(pointer - ((page - 1) * pageSize), menuElements.get(pointer).asItemStack()); - if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; - } - } - - pageNextLocation = -1; - pagePrevLocation = -1; - - Map<String, String> pageplaceholders = new HashMap<>(); - pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); - pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); - pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-desc"), pageplaceholders); - pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-prev"), pageplaceholders); - pageNextIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-next"), pageplaceholders); - - if (config.getBoolean("options.categories-enabled") && backButtonEnabled) { - inventory.setItem(45, back); - backButtonLocation = 45; - } - if (maxElement > pageSize) { - inventory.setItem(49, pageIs); - if (page != 1) { - inventory.setItem(48, pagePrevIs); - pagePrevLocation = 48; - } - if (Math.ceil((double) maxElement / ((double) pageSize)) != page) { - inventory.setItem(50, pageNextIs); - pageNextLocation = 50; - } - } else if (config.getBoolean("options.trim-gui-size") && page == 1) { - int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); - inventorySize = inventorySize <= 0 ? 9 : inventorySize; - if (inventorySize == 54) { - return inventory; - } else if (config.getBoolean("options.categories-enabled") && 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 (config.getBoolean("options.categories-enabled")) { - trimmedInventory.setItem(slot, back); - backButtonLocation = slot; - } - break; - } - trimmedInventory.setItem(slot, inventory.getItem(slot)); - } - return trimmedInventory; - } - - return inventory; - } - - @Override - public boolean handleClick(InventoryClickEvent event, MenuController controller) { - //TODO maybe redo this maybe - if (pagePrevLocation == event.getSlot()) { - controller.openMenu(event.getWhoClicked(), this, currentPage - 1); - return true; - } else if (pageNextLocation == event.getSlot()) { - controller.openMenu(event.getWhoClicked(), this, currentPage + 1); - return true; - } else if (config.getBoolean("options.categories-enabled") && backButtonLocation == event.getSlot()) { - controller.openMenu(event.getWhoClicked(), superMenu, 1); - return true; - } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { - MenuElement menuElement = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); - if (menuElement instanceof QuestMenuElement questMenuElement) { - Quest quest = questMenuElement.getQuest(); - if (!owner.hasStartedQuest(quest) && event.getClick() == startClickType) { - if (config.getBoolean("option.gui-close-after-accept", true)) { - if (owner.startQuest(quest) == QuestStartResult.QUEST_SUCCESS) { - event.getWhoClicked().closeInventory(); - } - } - return true; - } else if (event.getClick() == trackClickType) { - MenuUtils.handleMiddleClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); - return true; - } else if (event.getClick() == cancelClickType) { - MenuUtils.handleRightClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); - return true; - } - } else if (menuElement instanceof CustomMenuElement customMenuElement) { - for (String command : customMenuElement.getCommands()) { - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), - command.replace("{player}", event.getWhoClicked().getName())); - } - } - } - return false; - } - - public boolean isBackButtonEnabled() { - return backButtonEnabled; - } - - public void setBackButtonEnabled(boolean backButtonEnabled) { - this.backButtonEnabled = backButtonEnabled; - } - - public int getBackButtonLocation() { - return backButtonLocation; - } - - public CategoryQMenu getSuperMenu() { - return superMenu; - } - } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java index 944a812a..3e5a57e0 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java @@ -1,183 +1,34 @@ package com.leonardobishop.quests.bukkit.menu; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; -import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; -import com.leonardobishop.quests.bukkit.util.MenuUtils; +import com.leonardobishop.quests.bukkit.menu.element.MenuElement; +import com.leonardobishop.quests.bukkit.menu.element.QuestMenuElement; import com.leonardobishop.quests.bukkit.util.chat.Chat; import com.leonardobishop.quests.common.player.QPlayer; -import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.common.quest.Quest; -import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; -import org.bukkit.Bukkit; -import org.bukkit.event.inventory.ClickType; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import java.util.Collections; -import java.util.HashMap; +import java.util.ArrayList; import java.util.List; -import java.util.Map; /** - * Represents a menu listing quests the player has started. + * Represents a menu listing quests a player has started. */ -public class StartedQMenu implements QMenu { +public class StartedQMenu extends PaginatedQMenu { - private final BukkitQuestsPlugin plugin; - private final BukkitQuestsConfig config; - private final Int2ObjectOpenHashMap<String> slotsToQuestIds = new Int2ObjectOpenHashMap<>(); - private final int pageSize = 45; - private final QPlayer owner; - private final ClickType trackClickType; - private final ClickType cancelClickType; + public StartedQMenu(BukkitQuestsPlugin plugin, QPlayer owner, List<Quest> quests) { + super(owner, Chat.legacyColor(plugin.getQuestsConfig().getString("options.guinames.quests-started-menu")), + plugin.getQuestsConfig().getBoolean("options.trim-gui-size"), 54, plugin); - private int pagePrevLocation = -1; - private int pageNextLocation = -1; - private int currentPage = -1; + List<MenuElement> elements = new ArrayList<>(); - public StartedQMenu(BukkitQuestsPlugin plugin, QPlayer owner) { - this.plugin = plugin; - this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); - this.owner = owner; - - this.trackClickType = MenuUtils.getClickType(config, "options.gui-actions.track-quest", "MIDDLE"); - this.cancelClickType = MenuUtils.getClickType(config, "options.gui-actions.cancel-quest", "RIGHT"); - } - - public void populate(List<QuestSortWrapper> quests) { - Collections.sort(quests); - int slot = 0; - for (QuestSortWrapper quest : quests) { - if (owner.hasStartedQuest(quest.getQuest())) { - slotsToQuestIds.put(slot, quest.getQuest().getId()); - slot++; + for (Quest quest : quests) { + if (!owner.hasStartedQuest(quest)) { + continue; } + elements.add(new QuestMenuElement(plugin, quest, this)); } - } - - public Int2ObjectOpenHashMap<String> getSlotsToMenu() { - return slotsToQuestIds; - } - - @Override - public QPlayer getOwner() { - return owner; - } - - public int getPagePrevLocation() { - return pagePrevLocation; - } - public int getPageNextLocation() { - return pageNextLocation; + super.populate(null, elements, null); } - 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 = Chat.legacyColor(config.getString("options.guinames.quests-started-menu")); - - ItemStack pageIs; - ItemStack pagePrevIs; - ItemStack pageNextIs; - ItemStack none = config.getItem("gui.no-started-quests"); - - Inventory inventory = Bukkit.createInventory(null, 54, title); - - int invSlot = 0; - if (!slotsToQuestIds.isEmpty()) { - for (int pointer = pageMin; pointer < pageMax; pointer++) { - if (slotsToQuestIds.containsKey(pointer)) { - Quest quest = plugin.getQuestManager().getQuestById(slotsToQuestIds.get(pointer)); - QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); - - inventory.setItem(invSlot, MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), - plugin.getQItemStackRegistry().getQuestItemStack(quest).toItemStack(quest, owner, questProgress))); - } - invSlot++; - } - } else { - inventory.setItem(4, none); - } - - pageNextLocation = -1; - pagePrevLocation = -1; - - Map<String, String> pageplaceholders = new HashMap<>(); - pageplaceholders.put("{prevpage}", String.valueOf(page - 1)); - pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); - pageplaceholders.put("{page}", String.valueOf(page)); - pageIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-desc"), pageplaceholders); - pageIs.setAmount(Math.min(page, 64)); - pagePrevIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-prev"), pageplaceholders); - pageNextIs = MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), config.getItem("gui.page-next"), 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 (config.getBoolean("options.trim-gui-size") && 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 boolean handleClick(InventoryClickEvent event, MenuController controller) { - if (pagePrevLocation == event.getSlot()) { - controller.openMenu(event.getWhoClicked(), this, currentPage - 1); - return true; - } else if (pageNextLocation == event.getSlot()) { - controller.openMenu(event.getWhoClicked(), this, currentPage + 1); - return true; - } else if (event.getSlot() < pageSize && slotsToQuestIds.containsKey(event.getSlot() + ((currentPage) - 1) * pageSize)) { - - // repeat from above - String questid = slotsToQuestIds.get(event.getSlot() + (((currentPage) - 1) * pageSize)); - Quest quest = plugin.getQuestManager().getQuestById(questid); - if (event.getClick() == trackClickType) { - MenuUtils.handleMiddleClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); - return true; - } else if (event.getClick() == cancelClickType) { - MenuUtils.handleRightClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); - return true; - } - } - return false; - } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/AbortCancelMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/AbortCancelMenuElement.java new file mode 100644 index 00000000..2da74eac --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/AbortCancelMenuElement.java @@ -0,0 +1,39 @@ +package com.leonardobishop.quests.bukkit.menu.element; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.ClickResult; +import com.leonardobishop.quests.bukkit.menu.QMenu; +import com.leonardobishop.quests.common.player.QPlayer; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +public class AbortCancelMenuElement extends MenuElement { + + private final BukkitQuestsPlugin plugin; + private final QPlayer owner; + private final QMenu returnMenu; + + public AbortCancelMenuElement(BukkitQuestsPlugin plugin, QPlayer owner, QMenu returnMenu) { + this.plugin = plugin; + this.owner = owner; + this.returnMenu = returnMenu; + } + + @Override + public ItemStack asItemStack() { + return ((BukkitQuestsConfig) plugin.getQuestsConfig()).getItem("gui.quest-cancel-no"); + } + + @Override + public ClickResult handleClick(ClickType clickType) { + if (clickType == ClickType.LEFT) { + if (returnMenu != null) { + plugin.getMenuController().openMenu(owner.getPlayerUUID(), returnMenu); + } else { + return ClickResult.CLOSE_MENU; + } + } + return ClickResult.DO_NOTHING; + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/BackMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/BackMenuElement.java new file mode 100644 index 00000000..1960c059 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/BackMenuElement.java @@ -0,0 +1,39 @@ +package com.leonardobishop.quests.bukkit.menu.element; + +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.ClickResult; +import com.leonardobishop.quests.bukkit.menu.MenuController; +import com.leonardobishop.quests.bukkit.menu.QMenu; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +import java.util.UUID; + +/** + * literally has the sole purpose of returning Material.AIR + */ +public class BackMenuElement extends MenuElement { + + private final BukkitQuestsConfig config; + private final UUID player; + private final MenuController controller; + private final QMenu previousMenu; + + public BackMenuElement(BukkitQuestsConfig config, UUID player, MenuController controller, QMenu previousMenu) { + this.config = config; + this.player = player; + this.controller = controller; + this.previousMenu = previousMenu; + } + + @Override + public ItemStack asItemStack() { + return config.getItem("gui.back-button"); + } + + @Override + public ClickResult handleClick(ClickType clickType) { + controller.openMenu(player, previousMenu); + return ClickResult.DO_NOTHING; + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CategoryMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CategoryMenuElement.java index ce016d22..adb4617f 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CategoryMenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CategoryMenuElement.java @@ -1,9 +1,14 @@ package com.leonardobishop.quests.bukkit.menu.element; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.menu.ClickResult; import com.leonardobishop.quests.bukkit.menu.QuestQMenu; import com.leonardobishop.quests.bukkit.util.MenuUtils; +import com.leonardobishop.quests.bukkit.util.Messages; import com.leonardobishop.quests.common.quest.Category; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import java.util.UUID; @@ -12,11 +17,13 @@ public class CategoryMenuElement extends MenuElement { private final BukkitQuestsPlugin plugin; private final UUID owner; + private final Category category; private final QuestQMenu questMenu; - public CategoryMenuElement(BukkitQuestsPlugin plugin, UUID owner, QuestQMenu questMenu) { + public CategoryMenuElement(BukkitQuestsPlugin plugin, UUID owner, Category category, QuestQMenu questMenu) { this.plugin = plugin; this.owner = owner; + this.category = category; this.questMenu = questMenu; } @@ -36,4 +43,20 @@ public class CategoryMenuElement extends MenuElement { } return null; } + + @Override + public ClickResult handleClick(ClickType clickType) { + Player player = Bukkit.getPlayer(owner); + if (player == null) { + return ClickResult.DO_NOTHING; + } + + if (category.isPermissionRequired() && !player.hasPermission("quests.category." + category.getId())) { + Messages.QUEST_CATEGORY_QUEST_PERMISSION.send(player); + return ClickResult.DO_NOTHING; + } + + plugin.getMenuController().openMenu(owner, questMenu); + return ClickResult.DO_NOTHING; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/ConfirmCancelMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/ConfirmCancelMenuElement.java new file mode 100644 index 00000000..ddc1e9cc --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/ConfirmCancelMenuElement.java @@ -0,0 +1,44 @@ +package com.leonardobishop.quests.bukkit.menu.element; + +import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.ClickResult; +import com.leonardobishop.quests.bukkit.menu.QMenu; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.quest.Quest; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +public class ConfirmCancelMenuElement extends MenuElement { + + private final BukkitQuestsPlugin plugin; + private final QPlayer owner; + private final Quest quest; + private final QMenu returnMenu; + + public ConfirmCancelMenuElement(BukkitQuestsPlugin plugin, QPlayer owner, Quest quest, QMenu returnMenu) { + this.plugin = plugin; + this.owner = owner; + this.quest = quest; + this.returnMenu = returnMenu; + } + + @Override + public ItemStack asItemStack() { + return ((BukkitQuestsConfig) plugin.getQuestsConfig()).getItem("gui.quest-cancel-yes"); + } + + @Override + public ClickResult handleClick(ClickType clickType) { + if (clickType == ClickType.LEFT) { + if (owner.cancelQuest(quest)) { + if (returnMenu != null) { + plugin.getMenuController().openMenu(owner.getPlayerUUID(), returnMenu); + } else { + return ClickResult.CLOSE_MENU; + } + } + } + return ClickResult.DO_NOTHING; + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CustomMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CustomMenuElement.java index c0125dfe..644ec332 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CustomMenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/CustomMenuElement.java @@ -1,7 +1,10 @@ package com.leonardobishop.quests.bukkit.menu.element; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.menu.ClickResult; import com.leonardobishop.quests.bukkit.util.MenuUtils; +import org.bukkit.Bukkit; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -13,15 +16,16 @@ public class CustomMenuElement extends MenuElement{ private final ItemStack itemStack; private final List<String> commands; + private final String playerName; - public CustomMenuElement(BukkitQuestsPlugin plugin, UUID owner, ItemStack itemStack) { - this.itemStack = MenuUtils.applyPlaceholders(plugin, owner, itemStack); - this.commands = new ArrayList<>(); + public CustomMenuElement(BukkitQuestsPlugin plugin, UUID owner, String name, ItemStack itemStack) { + this(plugin, owner, name, itemStack, new ArrayList<>()); } - public CustomMenuElement(BukkitQuestsPlugin plugin, UUID owner, ItemStack itemStack, List<String> commands) { + public CustomMenuElement(BukkitQuestsPlugin plugin, UUID owner, String name, ItemStack itemStack, List<String> commands) { this.itemStack = MenuUtils.applyPlaceholders(plugin, owner, itemStack); this.commands = commands; + this.playerName = name; } @Override @@ -29,6 +33,15 @@ public class CustomMenuElement extends MenuElement{ return itemStack; } + @Override + public ClickResult handleClick(ClickType clickType) { + for (String command : commands) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), + command.replace("{player}", playerName)); + } + return ClickResult.DO_NOTHING; + } + public List<String> getCommands() { return Collections.unmodifiableList(commands); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/MenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/MenuElement.java index aa7ed46d..0381163a 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/MenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/MenuElement.java @@ -1,9 +1,19 @@ package com.leonardobishop.quests.bukkit.menu.element; +import com.leonardobishop.quests.bukkit.menu.ClickResult; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; public abstract class MenuElement { public abstract ItemStack asItemStack(); + /** + * Handle a click. + * + * @param clickType the type of click + * @return whether the calling menu should be refreshed + */ + public abstract ClickResult handleClick(ClickType clickType); + } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PageDescMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PageDescMenuElement.java new file mode 100644 index 00000000..9c5f1a6b --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PageDescMenuElement.java @@ -0,0 +1,34 @@ +package com.leonardobishop.quests.bukkit.menu.element; + +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.ClickResult; +import com.leonardobishop.quests.bukkit.menu.PaginatedQMenu; +import com.leonardobishop.quests.bukkit.util.MenuUtils; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +public class PageDescMenuElement extends MenuElement { + + private final BukkitQuestsConfig config; + private final PaginatedQMenu menu; + + public PageDescMenuElement(BukkitQuestsConfig config, PaginatedQMenu menu) { + this.config = config; + this.menu = menu; + } + + @Override + public ItemStack asItemStack() { + ItemStack is = config.getItem("gui.page-desc"); + is.setAmount(menu.getCurrentPage()); + + return MenuUtils.applyPlaceholders(null, null, + is, + MenuUtils.fillPagePlaceholders(menu.getCurrentPage())); + } + + @Override + public ClickResult handleClick(ClickType clickType) { + return ClickResult.DO_NOTHING; + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PageNextMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PageNextMenuElement.java new file mode 100644 index 00000000..775242af --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PageNextMenuElement.java @@ -0,0 +1,37 @@ +package com.leonardobishop.quests.bukkit.menu.element; + +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.ClickResult; +import com.leonardobishop.quests.bukkit.menu.PaginatedQMenu; +import com.leonardobishop.quests.bukkit.util.MenuUtils; +import org.bukkit.Material; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +public class PageNextMenuElement extends MenuElement { + + private final BukkitQuestsConfig config; + private final PaginatedQMenu menu; + public PageNextMenuElement(BukkitQuestsConfig config, PaginatedQMenu menu) { + this.config = config; + this.menu = menu; + } + + @Override + public ItemStack asItemStack() { + // hide if on last page + if (menu.getCurrentPage() == menu.getMaxPage()) { + return new ItemStack(Material.AIR); + } + + return MenuUtils.applyPlaceholders(null, null, + config.getItem("gui.page-next"), + MenuUtils.fillPagePlaceholders(menu.getCurrentPage())); + } + + @Override + public ClickResult handleClick(ClickType clickType) { + menu.setCurrentPage(menu.getCurrentPage() + 1); + return ClickResult.REFRESH_PANE; + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PagePrevMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PagePrevMenuElement.java new file mode 100644 index 00000000..1df49a1c --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/PagePrevMenuElement.java @@ -0,0 +1,37 @@ +package com.leonardobishop.quests.bukkit.menu.element; + +import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.ClickResult; +import com.leonardobishop.quests.bukkit.menu.PaginatedQMenu; +import com.leonardobishop.quests.bukkit.util.MenuUtils; +import org.bukkit.Material; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.inventory.ItemStack; + +public class PagePrevMenuElement extends MenuElement { + + private final BukkitQuestsConfig config; + private final PaginatedQMenu menu; + public PagePrevMenuElement(BukkitQuestsConfig config, PaginatedQMenu menu) { + this.config = config; + this.menu = menu; + } + + @Override + public ItemStack asItemStack() { + // hide if on first page + if (menu.getCurrentPage() == menu.getMinPage()) { + return new ItemStack(Material.AIR); + } + + return MenuUtils.applyPlaceholders(null, null, + config.getItem("gui.page-prev"), + MenuUtils.fillPagePlaceholders(menu.getCurrentPage())); + } + + @Override + public ClickResult handleClick(ClickType clickType) { + menu.setCurrentPage(menu.getCurrentPage() - 1); + return ClickResult.REFRESH_PANE; + } +} diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/QuestMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/QuestMenuElement.java index 7496dc56..87e29c87 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/QuestMenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/QuestMenuElement.java @@ -2,6 +2,9 @@ package com.leonardobishop.quests.bukkit.menu.element; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; +import com.leonardobishop.quests.bukkit.menu.CancelQMenu; +import com.leonardobishop.quests.bukkit.menu.ClickResult; +import com.leonardobishop.quests.bukkit.menu.QMenu; import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack; import com.leonardobishop.quests.bukkit.util.Format; import com.leonardobishop.quests.bukkit.util.MenuUtils; @@ -11,6 +14,7 @@ import com.leonardobishop.quests.common.enums.QuestStartResult; import com.leonardobishop.quests.common.player.QPlayer; import com.leonardobishop.quests.common.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.common.quest.Quest; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -25,12 +29,28 @@ public class QuestMenuElement extends MenuElement { private final BukkitQuestsConfig config; private final QPlayer owner; private final Quest quest; + private final QMenu menu; + private final boolean dummy; - public QuestMenuElement(BukkitQuestsPlugin plugin, QPlayer owner, Quest quest) { + private final ClickType startClickType; + private final ClickType trackClickType; + private final ClickType cancelClickType; + + public QuestMenuElement(BukkitQuestsPlugin plugin, Quest quest, QMenu menu) { + this(plugin, quest, menu, false); + } + + public QuestMenuElement(BukkitQuestsPlugin plugin, Quest quest, QMenu menu, boolean dummy) { this.plugin = plugin; this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); - this.owner = owner; + this.menu = menu; + this.owner = menu.getOwner(); this.quest = quest; + this.dummy = dummy; + + this.startClickType = MenuUtils.getClickType(config, "options.gui-actions.start-quest", "LEFT"); + this.trackClickType = MenuUtils.getClickType(config, "options.gui-actions.track-quest", "MIDDLE"); + this.cancelClickType = MenuUtils.getClickType(config, "options.gui-actions.cancel-quest", "RIGHT"); } public QPlayer getOwner() { @@ -52,6 +72,8 @@ public class QuestMenuElement extends MenuElement { long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest); + Map<String, String> placeholders = new HashMap<>(); + ItemStack display; if (status == QuestStartResult.QUEST_LOCKED) { List<String> quests = new ArrayList<>(); for (String requirement : quest.getRequirements()) { @@ -62,7 +84,6 @@ public class QuestMenuElement extends MenuElement { quests.add(Chat.legacyStrip(plugin.getQItemStackRegistry().getQuestItemStack(requirementQuest).getName())); } } - Map<String, String> placeholders = new HashMap<>(); placeholders.put("{quest}", Chat.legacyStrip(qItemStack.getName())); placeholders.put("{questid}", quest.getId()); if (quests.size() > 1 && plugin.getConfig().getBoolean("options.gui-truncate-requirements", true)) { @@ -70,50 +91,90 @@ public class QuestMenuElement extends MenuElement { } else { placeholders.put("{requirements}", String.join(", ", quests)); } - ItemStack display; if (plugin.getQItemStackRegistry().hasQuestLockedItemStack(quest)) { display = plugin.getQItemStackRegistry().getQuestLockedItemStack(quest); } else { display = config.getItem("gui.quest-locked-display"); } - return MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), display, placeholders); } else if (status == QuestStartResult.QUEST_ALREADY_COMPLETED) { - Map<String, String> placeholders = new HashMap<>(); placeholders.put("{quest}", Chat.legacyStrip(qItemStack.getName())); placeholders.put("{questid}", quest.getId()); - ItemStack display; if (plugin.getQItemStackRegistry().hasQuestCompletedItemStack(quest)) { display = plugin.getQItemStackRegistry().getQuestCompletedItemStack(quest); } else { display = config.getItem("gui.quest-completed-display"); } - return MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), display, placeholders); } else if (status == QuestStartResult.QUEST_NO_PERMISSION) { - Map<String, String> placeholders = new HashMap<>(); placeholders.put("{quest}", Chat.legacyStrip(qItemStack.getName())); placeholders.put("{questid}", quest.getId()); - ItemStack display; if (plugin.getQItemStackRegistry().hasQuestPermissionItemStack(quest)) { display = plugin.getQItemStackRegistry().getQuestPermissionItemStack(quest); } else { display = config.getItem("gui.quest-permission-display"); } - return MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), display, placeholders); } else if (cooldown > 0) { - Map<String, String> placeholders = new HashMap<>(); placeholders.put("{time}", Format.formatTime(TimeUnit.SECONDS.convert(cooldown, TimeUnit.MILLISECONDS))); placeholders.put("{quest}", Chat.legacyStrip(qItemStack.getName())); placeholders.put("{questid}", quest.getId()); - ItemStack display; if (plugin.getQItemStackRegistry().hasQuestCooldownItemStack(quest)) { display = plugin.getQItemStackRegistry().getQuestCooldownItemStack(quest); } else { display = config.getItem("gui.quest-cooldown-display"); } - return MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), display, placeholders); } else { return MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), qItemStack.toItemStack(quest, owner, questProgress)); } + return MenuUtils.applyPlaceholders(plugin, owner.getPlayerUUID(), display, placeholders); } + @Override + public ClickResult handleClick(ClickType clickType) { + if (dummy) { + return ClickResult.DO_NOTHING; + } + + boolean close = config.getBoolean("options.gui-close-after-accept", true); + if (!owner.hasStartedQuest(quest) && clickType == startClickType) { + if (owner.startQuest(quest) == QuestStartResult.QUEST_SUCCESS) { + return close ? ClickResult.CLOSE_MENU : ClickResult.REFRESH_PANE; + } + + } else if (clickType == trackClickType) { + if (owner.hasStartedQuest(quest)) { + if (!plugin.getQuestsConfig().getBoolean("options.allow-quest-track")) { + return ClickResult.DO_NOTHING; + } + + String tracked = owner.getPlayerPreferences().getTrackedQuestId(); + + if (quest.getId().equals(tracked)) { + owner.trackQuest(null); + } else { + owner.trackQuest(quest); + } + return close ? ClickResult.CLOSE_MENU : ClickResult.REFRESH_PANE; + } + + } else if (clickType == cancelClickType) { + if (owner.hasStartedQuest(quest)) { + if (!plugin.getQuestsConfig().getBoolean("options.allow-quest-cancel") + || plugin.getConfig().getBoolean("options.quest-autostart") + || quest.isAutoStartEnabled() + || !quest.isCancellable()) { + return ClickResult.DO_NOTHING; + } + + if (plugin.getQuestsConfig().getBoolean("options.gui-confirm-cancel", true)) { + CancelQMenu cancelQMenu = new CancelQMenu(plugin, menu, owner, quest); + plugin.getMenuController().openMenu(owner.getPlayerUUID(), cancelQMenu); + } else { + if (menu.getOwner().cancelQuest(quest)) { + return close ? ClickResult.CLOSE_MENU : ClickResult.REFRESH_PANE; + } + } + } + } + + return ClickResult.DO_NOTHING; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/SpacerMenuElement.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/SpacerMenuElement.java index a4c5d69a..6f450cb6 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/SpacerMenuElement.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/element/SpacerMenuElement.java @@ -1,6 +1,8 @@ package com.leonardobishop.quests.bukkit.menu.element; +import com.leonardobishop.quests.bukkit.menu.ClickResult; import org.bukkit.Material; +import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; /** @@ -12,4 +14,9 @@ public class SpacerMenuElement extends MenuElement { public ItemStack asItemStack() { return new ItemStack(Material.AIR); } + + @Override + public ClickResult handleClick(ClickType clickType) { + return ClickResult.DO_NOTHING; + } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java index 3379883f..3ef5024c 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java @@ -2,9 +2,12 @@ package com.leonardobishop.quests.bukkit.util; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; -import com.leonardobishop.quests.bukkit.menu.CancelQMenu; -import com.leonardobishop.quests.bukkit.menu.MenuController; -import com.leonardobishop.quests.bukkit.menu.QMenu; +import com.leonardobishop.quests.bukkit.menu.CategoryQMenu; +import com.leonardobishop.quests.bukkit.menu.QuestQMenu; +import com.leonardobishop.quests.bukkit.menu.QuestSortWrapper; +import com.leonardobishop.quests.bukkit.menu.StartedQMenu; +import com.leonardobishop.quests.common.player.QPlayer; +import com.leonardobishop.quests.common.quest.Category; import com.leonardobishop.quests.common.quest.Quest; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -12,26 +15,29 @@ import org.bukkit.event.inventory.ClickType; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import javax.annotation.Nullable; import java.util.*; +import java.util.stream.Collectors; public class MenuUtils { - public static ItemStack applyPlaceholders(BukkitQuestsPlugin plugin, UUID owner, ItemStack is) { + public static ItemStack applyPlaceholders(@Nullable BukkitQuestsPlugin plugin, @Nullable UUID owner, ItemStack is) { return applyPlaceholders(plugin, owner, is, Collections.emptyMap()); } - public static ItemStack applyPlaceholders(BukkitQuestsPlugin plugin, UUID owner, ItemStack is, Map<String, String> placeholders) { + public static ItemStack applyPlaceholders(@Nullable BukkitQuestsPlugin plugin, @Nullable UUID owner, ItemStack is, Map<String, String> placeholders) { ItemStack newItemStack = is.clone(); List<String> lore = newItemStack.getItemMeta().getLore(); List<String> newLore = new ArrayList<>(); ItemMeta ism = newItemStack.getItemMeta(); - Player player = Bukkit.getPlayer(owner); + Player player = owner == null ? null : Bukkit.getPlayer(owner); + boolean usePAPI = player != null && plugin != null && plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi"); if (lore != null) { for (String s : lore) { for (Map.Entry<String, String> entry : placeholders.entrySet()) { s = s.replace(entry.getKey(), entry.getValue()); } - if (plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { + if (usePAPI) { s = plugin.getPlaceholderAPIProcessor().apply(player, s); } newLore.add(s); @@ -40,7 +46,7 @@ public class MenuUtils { for (Map.Entry<String, String> entry : placeholders.entrySet()) { ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); } - if (plugin.getQuestsConfig().getBoolean("options.gui-use-placeholderapi")) { + if (usePAPI) { ism.setDisplayName(plugin.getPlaceholderAPIProcessor().apply(player, ism.getDisplayName())); } ism.setLore(newLore); @@ -48,38 +54,72 @@ public class MenuUtils { return newItemStack; } - public static void handleMiddleClick(BukkitQuestsPlugin plugin, QMenu menu, Quest quest, Player player, MenuController controller) { - if (menu.getOwner().hasStartedQuest(quest)) { - if (!plugin.getQuestsConfig().getBoolean("options.allow-quest-track")) return; - - String tracked = menu.getOwner().getPlayerPreferences().getTrackedQuestId(); + /** + * Open the main menu for the player + * + * @param qPlayer player + */ + public static void openMainMenu(BukkitQuestsPlugin plugin, QPlayer qPlayer) { + Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); + if (player == null) { + return; + } - if (quest.getId().equals(tracked)) { - menu.getOwner().trackQuest(null); - } else { - menu.getOwner().trackQuest(quest); + if (plugin.getQuestsConfig().getBoolean("options.categories-enabled")) { + CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, qPlayer); + plugin.getMenuController().openMenu(player, categoryQMenu); + } else { + List<Quest> quests = new ArrayList<>(); + for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { + quests.add(entry.getValue()); } - player.closeInventory(); + QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, quests, null, null); + plugin.getMenuController().openMenu(player, questQMenu); } +// } else { +// DailyQMenu dailyQMenu = new DailyQMenu(plugin, this); +// dailyQMenu.populate(); +// plugin.getMenuController().openMenu(player, dailyQMenu, 1); +// } } - public static void handleRightClick(BukkitQuestsPlugin plugin, QMenu menu, Quest quest, Player player, MenuController controller) { - if (menu.getOwner().hasStartedQuest(quest)) { - if (!plugin.getQuestsConfig().getBoolean("options.allow-quest-cancel") - || plugin.getConfig().getBoolean("options.quest-autostart") - || quest.isAutoStartEnabled() - || !quest.isCancellable()) { - return; - } - if (plugin.getQuestsConfig().getBoolean("options.gui-confirm-cancel", true)) { - CancelQMenu cancelQMenu = new CancelQMenu(plugin, menu, menu.getOwner(), quest); - controller.openMenu(player, cancelQMenu, 1); - } else { - if (menu.getOwner().cancelQuest(quest)) { - player.closeInventory(); - } + public static void openQuestCategory(BukkitQuestsPlugin plugin, QPlayer qPlayer, Category category, CategoryQMenu superMenu) { + Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); + if (player == null) { + return; + } + + List<Quest> quests = new ArrayList<>(); + for (String questid : category.getRegisteredQuestIds()) { + Quest quest = plugin.getQuestManager().getQuestById(questid); + if (quest != null) { + quests.add(quest); } } + QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, quests, category.getId(), superMenu); + plugin.getMenuController().openMenu(player, questQMenu); + } + + /** + * Open the started menu for the player + * + * @param qPlayer player + */ + public static void openStartedQuests(BukkitQuestsPlugin plugin, QPlayer qPlayer) { + Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID()); + if (player == null) { + return; + } + + List<QuestSortWrapper> quests = new ArrayList<>(); + for (Map.Entry<String, Quest> entry : plugin.getQuestManager().getQuests().entrySet()) { + quests.add(new QuestSortWrapper(plugin, entry.getValue())); + } + Collections.sort(quests); + + StartedQMenu startedQMenu = new StartedQMenu(plugin, qPlayer, quests.stream().map(QuestSortWrapper::getQuest).collect(Collectors.toList())); + + plugin.getMenuController().openMenu(player, startedQMenu); } public static ClickType getClickType(BukkitQuestsConfig config, String path, String def) { @@ -91,4 +131,14 @@ public class MenuUtils { } } + + public static Map<String, String> fillPagePlaceholders(int page) { + Map<String, String> placeholders = new HashMap<>(); + placeholders.put("{prevpage}", String.valueOf(page - 1)); + placeholders.put("{nextpage}", String.valueOf(page + 1)); + placeholders.put("{page}", String.valueOf(page)); + + return placeholders; + } + } |
