diff options
| author | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2021-03-05 16:43:02 +0000 |
|---|---|---|
| committer | LMBishop <13875753+LMBishop@users.noreply.github.com> | 2021-03-05 16:43:02 +0000 |
| commit | 8c01972de0549f8cc4ee6597ec53ee8660a331ab (patch) | |
| tree | 3d761b5292ca3e01dce078bd88771b9b6ad05a3c | |
| parent | fd416af7f16ffa0dfba4fdd6730341714bec18a2 (diff) | |
Add custom items to GUIv2.15.1
- Closes #107, closes #102, closes #77
12 files changed, 423 insertions, 165 deletions
diff --git a/build.gradle b/build.gradle index ed737eda..fa702f47 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group = 'com.leonardobishop' -version = '2.15' +version = '2.15.1' processResources { from(sourceSets.main.resources.srcDirs) { diff --git a/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java b/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java new file mode 100644 index 00000000..c1192c10 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/MenuUtil.java @@ -0,0 +1,50 @@ +package com.leonardobishop.quests.menu; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.util.Options; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class MenuUtil { + + public static ItemStack applyPlaceholders(Quests plugin, UUID owner, ItemStack is) { + return applyPlaceholders(plugin, owner, is, Collections.emptyMap()); + } + + public static ItemStack applyPlaceholders(Quests plugin, 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); + if (lore != null) { + for (String s : lore) { + for (Map.Entry<String, String> 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<String, String> 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/QMenu.java b/src/main/java/com/leonardobishop/quests/menu/QMenu.java index 1efc34e8..b20ddadd 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QMenu.java +++ b/src/main/java/com/leonardobishop/quests/menu/QMenu.java @@ -10,7 +10,6 @@ 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 index 607f6cf6..69c46374 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java @@ -31,7 +31,6 @@ public class QMenuCancel implements QMenu { /* ignored */ } - @Override public HashMap<Integer, String> getSlotsToMenu() { return slotsToQuestIds; } diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java b/src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java index a9301b7e..da06ae91 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java @@ -2,10 +2,16 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.menu.object.CategoryMenuElement; +import com.leonardobishop.quests.menu.object.CustomMenuElement; +import com.leonardobishop.quests.menu.object.MenuElement; +import com.leonardobishop.quests.menu.object.QuestMenuElement; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.quests.Category; +import com.leonardobishop.quests.util.Items; import com.leonardobishop.quests.util.Messages; import com.leonardobishop.quests.util.Options; +import org.apache.commons.lang.math.NumberUtils; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -14,9 +20,11 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import java.awt.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Menu list of categories. @@ -25,30 +33,47 @@ public class QMenuCategory implements QMenu { private final Quests plugin; private final int pageSize = 45; - private final HashMap<Integer, QMenuQuest> slotsToMenuQuest = new HashMap<>(); + private final HashMap<Integer, MenuElement> menuElements = new HashMap<>(); private final QPlayer owner; + private int maxElement = 0; + private int pagePrevLocation = -1; + private int pageNextLocation = -1; + private int currentPage = -1; + public QMenuCategory(Quests plugin, QPlayer owner) { this.plugin = plugin; this.owner = owner; } public void populate(List<QMenuQuest> menuQuests) { + if (plugin.getConfig().isConfigurationSection("custom-elements.categories")) { + for (String s : plugin.getConfig().getConfigurationSection("custom-elements.categories").getKeys(false)) { + if (!NumberUtils.isNumber(s)) continue; + int slot = Integer.parseInt(s); + int repeat = plugin.getConfig().getInt("custom-elements.categories." + s + ".repeat"); + ItemStack is = plugin.getItemStack("custom-elements.categories." + s + ".display", plugin.getConfig()); + + for (int i = 0; i <= repeat; i++) { + menuElements.put(slot + i, new CustomMenuElement(is)); + } + } + } int slot = 0; for (QMenuQuest qMenuQuest : menuQuests) { + while (menuElements.containsKey(slot)) slot++; if (Options.GUI_HIDE_CATEGORIES_NOPERMISSION.getBooleanValue() && Quests.get().getQuestManager().getCategoryById(qMenuQuest.getCategoryName()).isPermissionRequired()) { if (!Bukkit.getPlayer(owner.getUuid()).hasPermission("quests.category." + qMenuQuest.getCategoryName())) { continue; } } - slotsToMenuQuest.put(slot, qMenuQuest); + menuElements.put(slot, new CategoryMenuElement(plugin, owner.getUuid(), qMenuQuest)); slot++; } - } - @Override - public HashMap<Integer, QMenuQuest> getSlotsToMenu() { - return slotsToMenuQuest; + for (Integer integer : menuElements.keySet()) { + if (integer + 1 > maxElement) maxElement = integer + 1; + } } @Override @@ -57,34 +82,48 @@ public class QMenuCategory implements QMenu { } public Inventory toInventory(int page) { + currentPage = page; int pageMin = pageSize * (page - 1); int pageMax = pageSize * page; String title = Options.color(Options.GUITITLE_QUESTS_CATEGORY.getStringValue()); - ItemStack pageIs = new ItemStack(Material.DIRT); - + ItemStack pageIs; + ItemStack pagePrevIs; + ItemStack pageNextIs; Inventory inventory = Bukkit.createInventory(null, 54, title); + int highestOnPage = 0; 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())); - } + if (menuElements.containsKey(pointer)) { + inventory.setItem(pointer - ((page - 1) * pageSize), menuElements.get(pointer).asItemStack()); + if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; } } - inventory.setItem(49, replaceItemStack(pageIs)); + pageNextLocation = -1; + pagePrevLocation = -1; - if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { - int slotsUsed = 0; - for (int pointer = 0; pointer < pageMax; pointer++) { - if (inventory.getItem(pointer) != null) { - slotsUsed++; - } - } + 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 = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs.setAmount(Math.min(page, 64)); + pagePrevIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_PREV.getItem(), pageplaceholders); + pageNextIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_NEXT.getItem(), pageplaceholders); - int inventorySize = (slotsUsed >= 54) ? 54 : slotsUsed + (9 - slotsUsed % 9) * Math.min(1, slotsUsed % 9); + if (maxElement > pageSize) { + inventory.setItem(49, pageIs); + if (page != 1) { + inventory.setItem(48, pagePrevIs); + pagePrevLocation = 48; + } + if (Math.ceil((double) maxElement / ((double) pageSize)) != page) { + inventory.setItem(50, pageNextIs); + pageNextLocation = 50; + } + } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { + int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); inventorySize = inventorySize <= 0 ? 9 : inventorySize; if (inventorySize == 54) { return inventory; @@ -92,50 +131,35 @@ public class QMenuCategory implements QMenu { Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); - for (int slot = 0; slot < pageMax; slot++) { - if (slot >= trimmedInventory.getSize()) { - break; - } + for (int slot = 0; slot < trimmedInventory.getSize(); slot++) { trimmedInventory.setItem(slot, inventory.getItem(slot)); } return trimmedInventory; - } else { - return inventory; } - + return inventory; } @Override public void handleClick(InventoryClickEvent event, MenuController controller) { - if (this.getSlotsToMenu().containsKey(event.getSlot())) { - QMenuQuest qMenuQuest = this.getSlotsToMenu().get(event.getSlot()); + if (pagePrevLocation == 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()); - } - } - } + event.getWhoClicked().openInventory(this.toInventory(currentPage - 1)); - public ItemStack replaceItemStack(ItemStack is) { - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - ItemStack newItemStack = is.clone(); - List<String> lore = newItemStack.getItemMeta().getLore(); - List<String> 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); + } else if (pageNextLocation == event.getSlot()) { + controller.getBuffer().add(event.getWhoClicked().getUniqueId()); + event.getWhoClicked().openInventory(this.toInventory(currentPage + 1)); + + } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { + MenuElement element = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); + if (element instanceof CategoryMenuElement) { + CategoryMenuElement categoryMenuElement = (CategoryMenuElement) element; + QMenuQuest qMenuQuest = categoryMenuElement.getQuestMenu(); + controller.getBuffer().add(event.getWhoClicked().getUniqueId()); + if (this.getOwner().openCategory(plugin.getQuestManager().getCategoryById(qMenuQuest.getCategoryName()), qMenuQuest) != 0) { + controller.getBuffer().remove(event.getWhoClicked().getUniqueId()); + event.getWhoClicked().sendMessage(Messages.QUEST_CATEGORY_PERMISSION.getMessage()); } } - ism.setLore(newLore); - newItemStack.setItemMeta(ism); - return newItemStack; } - return is; } - } diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java b/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java index bbdd6f60..7a2b8f69 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java @@ -3,11 +3,15 @@ package com.leonardobishop.quests.menu; import com.leonardobishop.quests.Quests; import com.leonardobishop.quests.api.enums.QuestStartResult; import com.leonardobishop.quests.events.MenuController; +import com.leonardobishop.quests.menu.object.CustomMenuElement; +import com.leonardobishop.quests.menu.object.MenuElement; +import com.leonardobishop.quests.menu.object.QuestMenuElement; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.quests.Quest; import com.leonardobishop.quests.util.Items; import com.leonardobishop.quests.util.Options; +import org.apache.commons.lang.math.NumberUtils; import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.inventory.ClickType; @@ -21,6 +25,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -29,12 +34,13 @@ import java.util.concurrent.TimeUnit; public class QMenuQuest implements QMenu { private final Quests plugin; - private final HashMap<Integer, String> slotsToQuestIds = new HashMap<>(); + private final HashMap<Integer, MenuElement> menuElements = new HashMap<>(); private final QMenuCategory superMenu; private final String categoryName; private final int pageSize = 45; private final QPlayer owner; + private int maxElement = 0; private int backButtonLocation = -1; private int pagePrevLocation = -1; private int pageNextLocation = -1; @@ -49,9 +55,29 @@ public class QMenuQuest implements QMenu { } public void populate(List<Quest> quests) { + String path; + if (Options.CATEGORIES_ENABLED.getBooleanValue()) { + path = "custom-elements.c:" + categoryName; + } else { + path = "custom-elements.quests"; + } + if (plugin.getConfig().isConfigurationSection(path)) { + for (String s : plugin.getConfig().getConfigurationSection(path).getKeys(false)) { + if (!NumberUtils.isNumber(s)) continue; + int slot = Integer.parseInt(s); + int repeat = plugin.getConfig().getInt(path + "." + s + ".repeat"); + ItemStack is = plugin.getItemStack(path + "." + s + ".display", plugin.getConfig()); + + for (int i = 0; i <= repeat; i++) { + menuElements.put(slot + i, new CustomMenuElement(is)); + } + } + } + Collections.sort(quests); int slot = 0; for (Quest quest : quests) { + while (menuElements.containsKey(slot)) slot++; if (Options.GUI_HIDE_LOCKED.getBooleanValue()) { QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); @@ -64,14 +90,13 @@ public class QMenuQuest implements QMenu { continue; } } - slotsToQuestIds.put(slot, quest.getId()); + menuElements.put(slot, new QuestMenuElement(plugin, owner, quest.getId())); slot++; } - } - @Override - public HashMap<Integer, String> getSlotsToMenu() { - return slotsToQuestIds; + for (Integer integer : menuElements.keySet()) { + if (integer + 1 > maxElement) maxElement = integer + 1; + } } @Override @@ -112,44 +137,12 @@ public class QMenuQuest implements QMenu { Inventory inventory = Bukkit.createInventory(null, 54, title); - int invSlot = 0; + int highestOnPage = 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<String> quests = new ArrayList<>(); - for (String requirement : quest.getRequirements()) { - quests.add(Quests.get().getQuestManager().getQuestById(requirement).getDisplayNameStripped()); - } - Map<String, String> 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<String, String> 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<String, String> 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<String, String> 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))); - } + if (menuElements.containsKey(pointer)) { + inventory.setItem(pointer - ((page - 1) * pageSize), menuElements.get(pointer).asItemStack()); + if (pointer + 1 > highestOnPage) highestOnPage = pointer + 1; } - invSlot++; } pageNextLocation = -1; @@ -160,6 +153,7 @@ public class QMenuQuest implements QMenu { pageplaceholders.put("{nextpage}", String.valueOf(page + 1)); pageplaceholders.put("{page}", String.valueOf(page)); pageIs = replaceItemStack(Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs.setAmount(Math.min(page, 64)); pagePrevIs = replaceItemStack(Items.PAGE_PREV.getItem(), pageplaceholders); pageNextIs = replaceItemStack(Items.PAGE_NEXT.getItem(), pageplaceholders); @@ -167,25 +161,18 @@ public class QMenuQuest implements QMenu { inventory.setItem(45, back); backButtonLocation = 45; } - if (slotsToQuestIds.size() > pageSize) { + if (maxElement > pageSize) { inventory.setItem(49, pageIs); if (page != 1) { inventory.setItem(48, pagePrevIs); pagePrevLocation = 48; } - if (Math.ceil((double) slotsToQuestIds.size() / ((double) 45)) != page) { + if (Math.ceil((double) maxElement / ((double) pageSize)) != 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); + int inventorySize = highestOnPage + (9 - highestOnPage % 9) * Math.min(1, highestOnPage % 9); inventorySize = inventorySize <= 0 ? 9 : inventorySize; if (inventorySize == 54) { return inventory; @@ -213,35 +200,37 @@ public class QMenuQuest implements QMenu { @Override public void handleClick(InventoryClickEvent event, MenuController controller) { - if (this.getPagePrevLocation() == event.getSlot()) { + //TODO make everything a menu element cuz this is jank + if (pagePrevLocation == event.getSlot()) { controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(this.toInventory(this.getCurrentPage() - 1)); + event.getWhoClicked().openInventory(this.toInventory(currentPage - 1)); - } else if (this.getPageNextLocation() == event.getSlot()) { + } else if (pageNextLocation == event.getSlot()) { controller.getBuffer().add(event.getWhoClicked().getUniqueId()); - event.getWhoClicked().openInventory(this.toInventory(this.getCurrentPage() + 1)); + event.getWhoClicked().openInventory(this.toInventory(currentPage + 1)); - } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && this.getBackButtonLocation() == event.getSlot()) { + } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonLocation == event.getSlot()) { QMenuCategory qMenuCategory = this.getSuperMenu(); controller.getBuffer().add(event.getWhoClicked().getUniqueId()); event.getWhoClicked().openInventory(qMenuCategory.toInventory(1)); controller.getTracker().put(event.getWhoClicked().getUniqueId(), qMenuCategory); - } else if (event.getSlot() < 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.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { + MenuElement menuElement = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); + if (menuElement instanceof QuestMenuElement) { + QuestMenuElement questMenuElement = (QuestMenuElement) menuElement; + Quest quest = plugin.getQuestManager().getQuestById(questMenuElement.getQuestId()); + if (event.getClick() == ClickType.LEFT) { + if (Options.QUEST_AUTOSTART.getBooleanValue()) return; + if (this.getOwner().getQuestProgressFile().startQuest(quest) == QuestStartResult.QUEST_SUCCESS) { + event.getWhoClicked().closeInventory(); //TODO Option to keep the menu open + } + } else if (event.getClick() == ClickType.MIDDLE && Options.ALLOW_QUEST_TRACK.getBooleanValue()) { + controller.middleClickQuest(this, quest, Bukkit.getPlayer(this.getOwner().getUuid())); + } else if (event.getClick() == ClickType.RIGHT && Options.ALLOW_QUEST_CANCEL.getBooleanValue() + && this.getOwner().getQuestProgressFile().hasStartedQuest(quest)) { + controller.rightClickQuest(this, quest, Bukkit.getPlayer(this.getOwner().getUuid())); } - } 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())); } } } diff --git a/src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java b/src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java index eb3d82aa..fbbfae69 100644 --- a/src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java +++ b/src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java @@ -48,7 +48,6 @@ public class QMenuStarted implements QMenu { } } - @Override public HashMap<Integer, String> getSlotsToMenu() { return slotsToQuestIds; } @@ -94,7 +93,7 @@ public class QMenuStarted implements QMenu { Quest quest = Quests.get().getQuestManager().getQuestById(slotsToQuestIds.get(pointer)); QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); - inventory.setItem(invSlot, replaceItemStack(Quests.get().getQuestManager().getQuestById( + inventory.setItem(invSlot, MenuUtil.applyPlaceholders(plugin, owner.getUuid(), plugin.getQuestManager().getQuestById( quest.getId()).getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress))); } invSlot++; @@ -110,9 +109,10 @@ public class QMenuStarted implements QMenu { 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); + pageIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_DESCRIPTION.getItem(), pageplaceholders); + pageIs.setAmount(Math.min(page, 64)); + pagePrevIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_PREV.getItem(), pageplaceholders); + pageNextIs = MenuUtil.applyPlaceholders(plugin, owner.getUuid(), Items.PAGE_NEXT.getItem(), pageplaceholders); if (slotsToQuestIds.size() > pageSize) { inventory.setItem(49, pageIs); @@ -173,36 +173,4 @@ public class QMenuStarted implements QMenu { } } } - - public ItemStack replaceItemStack(ItemStack is) { - return replaceItemStack(is, Collections.emptyMap()); - } - - public ItemStack replaceItemStack(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.getUuid()); - if (lore != null) { - for (String s : lore) { - for (Map.Entry<String, String> 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<String, String> entry : placeholders.entrySet()) { - ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); - if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { - ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); - } - } - ism.setLore(newLore); - newItemStack.setItemMeta(ism); - return newItemStack; - } } diff --git a/src/main/java/com/leonardobishop/quests/menu/object/CategoryMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/object/CategoryMenuElement.java new file mode 100644 index 00000000..be71ef91 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/object/CategoryMenuElement.java @@ -0,0 +1,65 @@ +package com.leonardobishop.quests.menu.object; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.menu.QMenuQuest; +import com.leonardobishop.quests.quests.Category; +import com.leonardobishop.quests.util.Options; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class CategoryMenuElement extends MenuElement { + + private final Quests plugin; + private final UUID owner; + private final QMenuQuest questMenu; + + public CategoryMenuElement(Quests plugin, UUID owner, QMenuQuest questMenu) { + this.plugin = plugin; + this.owner = owner; + this.questMenu = questMenu; + } + + public UUID getOwner() { + return owner; + } + + public QMenuQuest getQuestMenu() { + return questMenu; + } + + @Override + public ItemStack asItemStack() { + Category category = plugin.getQuestManager().getCategoryById(questMenu.getCategoryName()); + if (category != null) { + return replaceItemStack(category.getDisplayItem()); + } + return null; + } + + private ItemStack replaceItemStack(ItemStack is) { + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + ItemStack newItemStack = is.clone(); + List<String> lore = newItemStack.getItemMeta().getLore(); + List<String> newLore = new ArrayList<>(); + ItemMeta ism = newItemStack.getItemMeta(); + Player player = Bukkit.getPlayer(owner); + ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); + if (lore != null) { + for (String s : lore) { + s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); + newLore.add(s); + } + } + ism.setLore(newLore); + newItemStack.setItemMeta(ism); + return newItemStack; + } + return is; + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/object/CustomMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/object/CustomMenuElement.java new file mode 100644 index 00000000..d88a0cf9 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/object/CustomMenuElement.java @@ -0,0 +1,17 @@ +package com.leonardobishop.quests.menu.object; + +import org.bukkit.inventory.ItemStack; + +public class CustomMenuElement extends MenuElement{ + + private ItemStack itemStack; + + public CustomMenuElement(ItemStack itemStack) { + this.itemStack = itemStack; + } + + @Override + public ItemStack asItemStack() { + return itemStack; + } +} diff --git a/src/main/java/com/leonardobishop/quests/menu/object/MenuElement.java b/src/main/java/com/leonardobishop/quests/menu/object/MenuElement.java new file mode 100644 index 00000000..9d5cceb6 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/object/MenuElement.java @@ -0,0 +1,9 @@ +package com.leonardobishop.quests.menu.object; + +import org.bukkit.inventory.ItemStack; + +public abstract class MenuElement { + + public abstract ItemStack asItemStack(); + +} diff --git a/src/main/java/com/leonardobishop/quests/menu/object/QuestMenuElement.java b/src/main/java/com/leonardobishop/quests/menu/object/QuestMenuElement.java new file mode 100644 index 00000000..9adc8fa2 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/menu/object/QuestMenuElement.java @@ -0,0 +1,108 @@ +package com.leonardobishop.quests.menu.object; + +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.player.QPlayer; +import com.leonardobishop.quests.player.questprogressfile.QuestProgress; +import com.leonardobishop.quests.quests.Quest; +import com.leonardobishop.quests.util.Items; +import com.leonardobishop.quests.util.Options; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +public class QuestMenuElement extends MenuElement { + + private final Quests plugin; + private final QPlayer owner; + private final String questId; + + public QuestMenuElement(Quests plugin, QPlayer owner, String questId) { + this.plugin = plugin; + this.owner = owner; + this.questId = questId; + } + + public QPlayer getOwner() { + return owner; + } + + public String getQuestId() { + return questId; + } + + @Override + public ItemStack asItemStack() { + Quest quest = plugin.getQuestManager().getQuestById(questId); + QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest); + long cooldown = owner.getQuestProgressFile().getCooldownFor(quest); + if (!owner.getQuestProgressFile().hasMetRequirements(quest)) { + List<String> quests = new ArrayList<>(); + for (String requirement : quest.getRequirements()) { + quests.add(Quests.get().getQuestManager().getQuestById(requirement).getDisplayNameStripped()); + } + Map<String, String> placeholders = new HashMap<>(); + placeholders.put("{quest}", quest.getDisplayNameStripped()); + placeholders.put("{requirements}", String.join(", ", quests)); + ItemStack is = replaceItemStack(Items.QUEST_LOCKED.getItem(), placeholders); + return is; + } else if (!quest.isRepeatable() && questProgress.isCompletedBefore()) { + Map<String, String> placeholders = new HashMap<>(); + placeholders.put("{quest}", quest.getDisplayNameStripped()); + ItemStack is = replaceItemStack(Items.QUEST_COMPLETED.getItem(), placeholders); + return is; + } else if (quest.isPermissionRequired() && !Bukkit.getPlayer(owner.getUuid()).hasPermission("quests.quest." + quest.getId())) { + Map<String, String> placeholders = new HashMap<>(); + placeholders.put("{quest}", quest.getDisplayNameStripped()); + ItemStack is = replaceItemStack(Items.QUEST_PERMISSION.getItem(), placeholders); + return is; + } else if (cooldown > 0) { + Map<String, String> placeholders = new HashMap<>(); + placeholders.put("{time}", Quests.get().convertToFormat(TimeUnit.SECONDS.convert(cooldown, TimeUnit.MILLISECONDS))); + placeholders.put("{quest}", quest.getDisplayNameStripped()); + ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders); + return is; + } else { + return replaceItemStack(quest.getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress)); + } + } + + private ItemStack replaceItemStack(ItemStack is) { + return replaceItemStack(is, Collections.emptyMap()); + } + + private ItemStack replaceItemStack(ItemStack is, Map<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.getUuid()); + if (lore != null) { + for (String s : lore) { + for (Map.Entry<String, String> 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<String, String> 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/resources/config.yml b/src/main/resources/config.yml index 0f7e4a46..6f941bea 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -131,6 +131,36 @@ gui: quest-cancel-background: type: "GRAY_STAINED_GLASS_PANE" +# Here you can add custom items to the quest menu +# Categories & quests will fill empty slots +#custom-elements: +# "categories": # apply to the categories menu (the main menu by default) +# 0: # <--- slot 1, note the slots start from 0! so 0 = slot 1 in this case +# display: +# name: "&cExample Custom Item (slot 1)" +# lore: +# - "&7This is a custom item which can be added" +# - "&7to your menus. This is purely cosmetic." +# type: "DIAMOND_BLOCK" +# 1: +# display: +# name: "&cExample Custom Item (slots 2 - 5)" +# lore: +# - "&7This is a custom item which can be added" +# - "&7to your menus, but in slot 2 and repeated" +# - "&73 times." +# - "&7This is purely cosmetic." +# type: "NETHERRACK" +# repeat: 3 # repeats for 3 more slots +# "c:examples": # apply to the category "examples" +# 0: +# display: +# name: "&cExample Custom Item (slot 1)" +# lore: +# - "&7This is a custom item which can be added" +# - "&7to your menus. This is purely cosmetic." +# type: "EMERALD_BLOCK" + options: # If categories are disabled, quests will be put into one big gui. categories-enabled: true |
