summaryrefslogtreecommitdiffstats
path: root/src/main/java/com/leonardobishop/quests
diff options
context:
space:
mode:
authorLMBishop <13875753+LMBishop@users.noreply.github.com>2021-03-05 16:43:02 +0000
committerLMBishop <13875753+LMBishop@users.noreply.github.com>2021-03-05 16:43:02 +0000
commit8c01972de0549f8cc4ee6597ec53ee8660a331ab (patch)
tree3d761b5292ca3e01dce078bd88771b9b6ad05a3c /src/main/java/com/leonardobishop/quests
parentfd416af7f16ffa0dfba4fdd6730341714bec18a2 (diff)
Add custom items to GUIv2.15.1
- Closes #107, closes #102, closes #77
Diffstat (limited to 'src/main/java/com/leonardobishop/quests')
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/MenuUtil.java50
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/QMenu.java1
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/QMenuCancel.java1
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/QMenuCategory.java132
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/QMenuQuest.java131
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/QMenuStarted.java42
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/object/CategoryMenuElement.java65
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/object/CustomMenuElement.java17
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/object/MenuElement.java9
-rw-r--r--src/main/java/com/leonardobishop/quests/menu/object/QuestMenuElement.java108
10 files changed, 392 insertions, 164 deletions
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;
+ }
+}