aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/me/fatpigsarefat/quests/obj
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/me/fatpigsarefat/quests/obj')
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/Items.java26
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/Messages.java58
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/Options.java53
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/misc/QItemStack.java114
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/misc/QMenu.java12
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuCategory.java92
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuDaily.java121
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuQuest.java224
-rw-r--r--src/main/java/me/fatpigsarefat/quests/obj/misc/creator/QMenuCreator.java70
9 files changed, 770 insertions, 0 deletions
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/Items.java b/src/main/java/me/fatpigsarefat/quests/obj/Items.java
new file mode 100644
index 00000000..1ffeabc8
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/Items.java
@@ -0,0 +1,26 @@
+package me.fatpigsarefat.quests.obj;
+
+import me.fatpigsarefat.quests.Quests;
+import org.bukkit.inventory.ItemStack;
+
+public enum Items {
+
+ BACK_BUTTON("gui.back-button"),
+ QUEST_LOCKED("gui.quest-locked-display"),
+ QUEST_COOLDOWN("gui.quest-cooldown-display"),
+ QUEST_COMPLETED("gui.quest-completed-display"),
+ PAGE_PREV("gui.page-prev"),
+ PAGE_NEXT("gui.page-next"),
+ PAGE_DESCRIPTION("gui.page-desc");
+
+ String path;
+
+ Items(String path) {
+ this.path = path;
+ }
+
+ public ItemStack getItem() {
+ return Quests.getInstance().getItemStack(path);
+ }
+
+}
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/Messages.java b/src/main/java/me/fatpigsarefat/quests/obj/Messages.java
new file mode 100644
index 00000000..ddcb23cb
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/Messages.java
@@ -0,0 +1,58 @@
+package me.fatpigsarefat.quests.obj;
+
+import me.fatpigsarefat.quests.Quests;
+import org.bukkit.ChatColor;
+
+public enum Messages {
+
+ QUEST_START("messages.quest-start"),
+ QUEST_COMPLETE("messages.quest-complete"),
+ QUEST_CANCEL("messages.quest-cancel"),
+ QUEST_START_LIMIT("messages.quest-start-limit"),
+ QUEST_START_DISABLED("messages.quest-start-disabled"),
+ QUEST_START_LOCKED("messages.quest-start-locked"),
+ QUEST_START_COOLDOWN("messages.quest-start-cooldown"),
+ QUEST_CANCEL_NOTSTARTED("messages.quest-cancel-notstarted"),
+ QUEST_UPDATER("messages.quest-updater"),
+ COMMAND_QUEST_START_DOESNTEXIST("messages.command-quest-start-doesntexist"),
+ COMMAND_QUEST_OPENCATEGORY_ADMIN_SUCCESS("messages.command-quest-opencategory-admin-success"),
+ COMMAND_QUEST_OPENQUESTS_ADMIN_SUCCESS("messages.command-quest-openquests-admin-success"),
+ COMMAND_QUEST_ADMIN_PLAYERNOTFOUND("messages.command-quest-admin-playernotfound"),
+ COMMAND_CATEGORY_OPEN_DOESNTEXIST("messages.command-category-open-doesntexist"),
+ COMMAND_CATEGORY_OPEN_DISABLED("messages.command-category-open-disabled"),
+ COMMAND_QUEST_START_ADMIN_SUCCESS("messages.command-quest-start-admin-success"),
+ COMMAND_TASKVIEW_ADMIN_FAIL("messages.command-taskview-admin-fail"),
+ COMMAND_QUEST_START_ADMIN_FAIL("messages.command-quest-start-admin-fail"),
+ TITLE_QUEST_START_TITLE("titles.quest-start.title"),
+ TITLE_QUEST_START_SUBTITLE("titles.quest-start.subtitle"),
+ TITLE_QUEST_COMPLETE_TITLE("titles.quest-complete.title"),
+ TITLE_QUEST_COMPLETE_SUBTITLE("titles.quest-complete.subtitle"),
+ BETA_REMINDER("messages.beta-reminder"),
+ COMMAND_QUEST_ADMIN_LOADDATA("messages.command-quest-admin-loaddata"),
+ COMMAND_QUEST_ADMIN_NODATA("messages.command-quest-admin-nodata"),
+ COMMAND_QUEST_ADMIN_FULLRESET("messages.command-quest-admin-fullreset"),
+ COMMAND_QUEST_ADMIN_START_FAILLOCKED("messages.command-quest-admin-start-faillocked"),
+ COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN("messages.command-quest-admin-start-failcooldown"),
+ COMMAND_QUEST_ADMIN_START_FAILCOMPLETE("messages.command-quest-admin-start-failcomplete"),
+ COMMAND_QUEST_ADMIN_START_FAILLIMIT("messages.command-quest-admin-start-faillimit"),
+ COMMAND_QUEST_ADMIN_START_SUCCESS("messages.command-quest-admin-start-success"),
+ COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS("messages.command-quest-admin-complete-success"),
+ COMMAND_QUEST_ADMIN_RESET_SUCCESS("messages.command-quest-admin-reset-success");
+
+ private String path;
+
+ Messages(String path) {
+ this.path = path;
+ }
+
+ public String getMessage() {
+ if (Quests.getInstance().getConfig().contains(path)) {
+ String message = Quests.getInstance().getConfig().getString(path);
+ if (message != null) {
+ return ChatColor.translateAlternateColorCodes('&', message);
+ }
+ }
+ return path;
+ }
+
+}
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/Options.java b/src/main/java/me/fatpigsarefat/quests/obj/Options.java
new file mode 100644
index 00000000..920f1132
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/Options.java
@@ -0,0 +1,53 @@
+package me.fatpigsarefat.quests.obj;
+
+import me.fatpigsarefat.quests.Quests;
+import org.bukkit.ChatColor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public enum Options {
+
+ CATEGORIES_ENABLED("options.categories-enabled"),
+ TRIM_GUI_SIZE("options.trim-gui-size"),
+ QUESTS_START_LIMIT("options.quest-started-limit"),
+ TITLES_ENABLED("options.titles-enabled"),
+ GUI_HIDE_LOCKED("options.gui-hide-locked"),
+ GUITITLE_QUESTS_CATEGORY("options.guinames.quests-category"),
+ GUITITLE_QUESTS("options.guinames.quests-menu"),
+ GUITITLE_DAILY_QUESTS("options.guinames.daily-quests"),
+ ALLOW_QUEST_CANCEL("options.allow-quest-cancel");
+
+ private String path;
+
+ Options(String path) {
+ this.path = path;
+ }
+
+ public int getIntValue() {
+ return Quests.getInstance().getConfig().getInt(path);
+ }
+
+ public String getStringValue() {
+ return Quests.getInstance().getConfig().getString(path);
+ }
+
+ public boolean getBooleanValue() {
+ return Quests.getInstance().getConfig().getBoolean(path);
+ }
+
+ public List<String> getStringListValue() {
+ return Quests.getInstance().getConfig().getStringList(path);
+ }
+
+ public static String color(String s) {
+ return ChatColor.translateAlternateColorCodes('&', s);
+ }
+ public static List<String> color(List<String> s) {
+ List<String> colored = new ArrayList<>();
+ for (String line : s) {
+ colored.add(ChatColor.translateAlternateColorCodes('&', line));
+ }
+ return colored;
+ }
+}
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/misc/QItemStack.java b/src/main/java/me/fatpigsarefat/quests/obj/misc/QItemStack.java
new file mode 100644
index 00000000..81cefc3b
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/misc/QItemStack.java
@@ -0,0 +1,114 @@
+package me.fatpigsarefat.quests.obj.misc;
+
+import me.fatpigsarefat.quests.player.questprogressfile.QuestProgress;
+import org.bukkit.Material;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.inventory.ItemFlag;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class QItemStack {
+
+ private String name;
+ private List<String> loreNormal;
+ private List<String> loreStarted;
+ private Material type;
+ private int data;
+
+ public QItemStack(String name, List<String> loreNormal, List<String> loreStarted, Material type, int data) {
+ this.name = name;
+ this.loreNormal = loreNormal;
+ this.loreStarted = loreStarted;
+ this.type = type;
+ this.data = data;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public List<String> getLoreNormal() {
+ return loreNormal;
+ }
+
+ public void setLoreNormal(List<String> loreNormal) {
+ this.loreNormal = loreNormal;
+ }
+
+ public List<String> getLoreStarted() {
+ return loreStarted;
+ }
+
+ public void setLoreStarted(List<String> loreStarted) {
+ this.loreStarted = loreStarted;
+ }
+
+ public Material getType() {
+ return type;
+ }
+
+ public void setType(Material type) {
+ this.type = type;
+ }
+
+ public int getData() {
+ return data;
+ }
+
+ public void setData(int data) {
+ this.data = data;
+ }
+
+ public ItemStack toItemStack(QuestProgress questProgress) {
+ ItemStack is = new ItemStack(type, 1, (short) data);
+ ItemMeta ism = is.getItemMeta();
+ ism.setDisplayName(name);
+ List<String> formattedLore = new ArrayList<>();
+ List<String> tempLore = new ArrayList<>();
+ tempLore.addAll(loreNormal);
+ if (questProgress != null && questProgress.isStarted()) {
+ tempLore.addAll(loreStarted);
+ ism.addEnchant(Enchantment.ARROW_INFINITE, 1, true);
+ try {
+ ism.addItemFlags(ItemFlag.HIDE_ENCHANTS);
+ ism.addItemFlags(ItemFlag.HIDE_ATTRIBUTES);
+ } catch (Exception ignored) {
+
+ }
+ }
+ if (questProgress != null) {
+ for (String s : tempLore) {
+ Matcher m = Pattern.compile("\\{([^}]+)\\}").matcher(s);
+ while (m.find()) {
+ String[] parts = m.group(1).split(":");
+ if (parts.length > 1) {
+ if (questProgress.getTaskProgress(parts[0]) == null) {
+ continue;
+ }
+ if (parts[1].equals("progress")) {
+ String str = String.valueOf(questProgress.getTaskProgress(parts[0]).getProgress());
+ s = s.replace("{" + m.group(1) + "}", (str.equals("null") ? String.valueOf(0) : str));
+ }
+ if (parts[1].equals("complete")) {
+ String str = String.valueOf(questProgress.getTaskProgress(parts[0]).isCompleted());
+ s = s.replace("{" + m.group(1) + "}", str);
+ }
+ }
+ }
+ formattedLore.add(s);
+ }
+ }
+ ism.setLore(formattedLore);
+ is.setItemMeta(ism);
+ return is;
+ }
+}
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenu.java b/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenu.java
new file mode 100644
index 00000000..13629600
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenu.java
@@ -0,0 +1,12 @@
+package me.fatpigsarefat.quests.obj.misc;
+
+import me.fatpigsarefat.quests.player.QPlayer;
+
+import java.util.HashMap;
+
+public interface QMenu {
+
+ QPlayer getOwner();
+ HashMap<?, ?> getSlotsToMenu();
+
+}
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuCategory.java b/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuCategory.java
new file mode 100644
index 00000000..61d1ac57
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuCategory.java
@@ -0,0 +1,92 @@
+package me.fatpigsarefat.quests.obj.misc;
+
+import me.fatpigsarefat.quests.Quests;
+import me.fatpigsarefat.quests.obj.Options;
+import me.fatpigsarefat.quests.player.QPlayer;
+import me.fatpigsarefat.quests.quests.Category;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+
+import java.util.HashMap;
+import java.util.List;
+
+public class QMenuCategory implements QMenu {
+
+ private final int pageSize = 45;
+ private HashMap<Integer, QMenuQuest> slotsToMenuQuest = new HashMap<>();
+ private QPlayer owner;
+
+ public QMenuCategory(QPlayer owner) {
+ this.owner = owner;
+ }
+
+ public void populate(List<QMenuQuest> menuQuests) {
+ int slot = 0;
+ for (QMenuQuest qMenuQuest : menuQuests) {
+ slotsToMenuQuest.put(slot, qMenuQuest);
+ slot++;
+ }
+ }
+
+ @Override
+ public HashMap<Integer, QMenuQuest> getSlotsToMenu() {
+ return slotsToMenuQuest;
+ }
+
+ @Override
+ public QPlayer getOwner() {
+ return owner;
+ }
+
+ public Inventory toInventory(int page) {
+ int pageMin = pageSize * (page - 1);
+ int pageMax = pageSize * page;
+ String title = Options.GUITITLE_QUESTS_CATEGORY.getStringValue();
+
+ ItemStack pageIs = new ItemStack(Material.DIRT);
+
+ Inventory inventory = Bukkit.createInventory(null, 54, title);
+
+ for (int pointer = pageMin; pointer < pageMax; pointer++) {
+ if (slotsToMenuQuest.containsKey(pointer)) {
+ Category category = Quests.getQuestManager().getCategoryById(slotsToMenuQuest.get(pointer).getCategoryName());
+ if (category != null) {
+ inventory.setItem(pointer, category.getDisplayItem());
+ }
+ }
+ }
+
+ inventory.setItem(49, pageIs);
+
+ if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) {
+ int slotsUsed = 0;
+ for (int pointer = 0; pointer < pageMax; pointer++) {
+ if (inventory.getItem(pointer) != null) {
+ slotsUsed++;
+ }
+ }
+
+ int inventorySize = (slotsUsed >= 54) ? 54 : slotsUsed + (9 - slotsUsed % 9) * Math.min(1, slotsUsed % 9);
+ inventorySize = inventorySize <= 0 ? 9 : inventorySize;
+ if (inventorySize == 54) {
+ return inventory;
+ }
+
+ Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title);
+
+ for (int slot = 0; slot < pageMax; slot++) {
+ if (slot >= trimmedInventory.getSize()){
+ break;
+ }
+ trimmedInventory.setItem(slot, inventory.getItem(slot));
+ }
+ return trimmedInventory;
+ } else {
+ return inventory;
+ }
+
+ }
+
+}
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuDaily.java b/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuDaily.java
new file mode 100644
index 00000000..9b50f7ee
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuDaily.java
@@ -0,0 +1,121 @@
+package me.fatpigsarefat.quests.obj.misc;
+
+import me.fatpigsarefat.quests.Quests;
+import me.fatpigsarefat.quests.obj.Items;
+import me.fatpigsarefat.quests.obj.Options;
+import me.fatpigsarefat.quests.player.QPlayer;
+import me.fatpigsarefat.quests.player.questprogressfile.QuestProgress;
+import me.fatpigsarefat.quests.quests.Quest;
+import org.bukkit.Bukkit;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public class QMenuDaily implements QMenu {
+
+ private HashMap<Integer, String> slotsToQuestIds = new HashMap<>();
+ private int backButtonLocation = -1;
+ private boolean backButtonEnabled = true;
+ private QMenuCategory superMenu;
+ private String categoryName;
+ private final int pageSize = 45;
+ private QPlayer owner;
+
+ public QMenuDaily(QPlayer owner, QMenuCategory superMenu) {
+ this.owner = owner;
+ this.superMenu = superMenu;
+ }
+
+ public void populate(List<Quest> quests) {
+ int slot = 11;
+ for (Quest quest : quests) {
+ slotsToQuestIds.put(slot, quest.getId());
+ slot++;
+ if (slot == 16) {
+ break;
+ }
+ }
+ }
+
+ @Override
+ public HashMap<Integer, String> getSlotsToMenu() {
+ return slotsToQuestIds;
+ }
+
+ @Override
+ public QPlayer getOwner() {
+ return owner;
+ }
+
+ public String getCategoryName() {
+ return categoryName;
+ }
+
+ public Inventory toInventory(int page) {
+ int pageMin = pageSize * (page - 1);
+ int pageMax = pageSize * page;
+ String title = Options.GUITITLE_DAILY_QUESTS.toString();
+
+ Inventory inventory = Bukkit.createInventory(null, 27, title);
+
+ //TODO daily quests
+
+// int invSlot = 11;
+// for (int pointer = pageMin; pointer < pageMax; pointer++) {
+// if (slotsToQuestIds.containsKey(pointer)) {
+// Quest quest = Quests.getQuestManager().getQuestById(slotsToQuestIds.get(pointer));
+// QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest);
+// long cooldown = owner.getQuestProgressFile().getCooldownFor(quest);
+// if (!owner.getQuestProgressFile().hasMetRequirements(quest)) {
+// List<String> quests = new ArrayList<>();
+// for (String requirement : quest.getRequirements()) {
+// quests.add(Quests.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 (cooldown > 0) {
+// Map<String, String> placeholders = new HashMap<>();
+// placeholders.put("{time}", Quests.convertToFormat(TimeUnit.MINUTES.convert(cooldown, TimeUnit.MILLISECONDS)));
+// placeholders.put("{quest}", quest.getDisplayNameStripped());
+// ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders);
+// inventory.setItem(invSlot, is);
+// } else {
+// inventory.setItem(invSlot, Quests.getQuestManager().getQuestById(quest.getId()).getDisplayItem().toItemStack(questProgress));
+// }
+// }
+// invSlot++;
+// }
+
+ return inventory;
+ }
+
+ public ItemStack replaceItemStack(ItemStack is, Map<String, String> placeholders) {
+ ItemStack newItemStack = is.clone();
+ List<String> lore = newItemStack.getItemMeta().getLore();
+ List<String> newLore = new ArrayList<>();
+ for (String s : lore) {
+ for (Map.Entry<String, String> entry : placeholders.entrySet()) {
+ s = s.replace(entry.getKey(), entry.getValue());
+ }
+ newLore.add(s);
+ }
+ ItemMeta ism = newItemStack.getItemMeta();
+ ism.setLore(newLore);
+ newItemStack.setItemMeta(ism);
+ return newItemStack;
+ }
+}
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuQuest.java b/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuQuest.java
new file mode 100644
index 00000000..50e264e7
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/misc/QMenuQuest.java
@@ -0,0 +1,224 @@
+package me.fatpigsarefat.quests.obj.misc;
+
+import me.fatpigsarefat.quests.Quests;
+import me.fatpigsarefat.quests.obj.Items;
+import me.fatpigsarefat.quests.obj.Options;
+import me.fatpigsarefat.quests.player.QPlayer;
+import me.fatpigsarefat.quests.player.questprogressfile.QuestProgress;
+import me.fatpigsarefat.quests.quests.Quest;
+import org.bukkit.Bukkit;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+public class QMenuQuest implements QMenu {
+
+ private HashMap<Integer, String> slotsToQuestIds = new HashMap<>();
+ private int backButtonLocation = -1;
+ private int pagePrevLocation = -1;
+ private int pageNextLocation = -1;
+ private int currentPage = -1;
+ private boolean backButtonEnabled = true;
+ private QMenuCategory superMenu;
+ private String categoryName;
+ private final int pageSize = 45;
+ private QPlayer owner;
+
+ public QMenuQuest(QPlayer owner, String categoryName, QMenuCategory superMenu) {
+ this.owner = owner;
+ this.categoryName = categoryName;
+ this.superMenu = superMenu;
+ }
+
+ public void populate(List<Quest> quests) {
+ int slot = 0;
+ for (Quest quest : quests) {
+ if (Options.GUI_HIDE_LOCKED.getBooleanValue()) {
+ QuestProgress questProgress = owner.getQuestProgressFile().getQuestProgress(quest);
+ long cooldown = owner.getQuestProgressFile().getCooldownFor(quest);
+ if (!owner.getQuestProgressFile().hasMetRequirements(quest) || (!quest.isRepeatable() && questProgress.isCompletedBefore()) || cooldown > 0) {
+ continue;
+ }
+ }
+ slotsToQuestIds.put(slot, quest.getId());
+ slot++;
+ }
+ }
+
+ @Override
+ public HashMap<Integer, String> getSlotsToMenu() {
+ return slotsToQuestIds;
+ }
+
+ @Override
+ public QPlayer getOwner() {
+ return owner;
+ }
+
+ public String getCategoryName() {
+ return categoryName;
+ }
+
+ public int getPagePrevLocation() {
+ return pagePrevLocation;
+ }
+
+ public int getPageNextLocation() {
+ return pageNextLocation;
+ }
+
+ public int getCurrentPage() {
+ return currentPage;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public Inventory toInventory(int page) {
+ currentPage = page;
+ int pageMin = pageSize * (page - 1);
+ int pageMax = pageSize * page;
+ String title = Options.GUITITLE_QUESTS.getStringValue();
+
+ ItemStack pageIs;
+ ItemStack pagePrevIs;
+ ItemStack pageNextIs;
+ ItemStack back = Items.BACK_BUTTON.getItem();
+
+ Inventory inventory = Bukkit.createInventory(null, 54, title);
+
+ int invSlot = 0;
+ for (int pointer = pageMin; pointer < pageMax; pointer++) {
+ if (slotsToQuestIds.containsKey(pointer)) {
+ Quest quest = Quests.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.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 (cooldown > 0) {
+ Map<String, String> placeholders = new HashMap<>();
+ placeholders.put("{time}", Quests.convertToFormat(TimeUnit.MINUTES.convert(cooldown, TimeUnit.MILLISECONDS)));
+ placeholders.put("{quest}", quest.getDisplayNameStripped());
+ ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders);
+ inventory.setItem(invSlot, is);
+ } else {
+ inventory.setItem(invSlot, Quests.getQuestManager().getQuestById(quest.getId()).getDisplayItem().toItemStack(questProgress));
+ }
+ }
+ invSlot++;
+ }
+
+ 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 = replaceItemStack(Items.PAGE_DESCRIPTION.getItem(), pageplaceholders);
+ pagePrevIs = replaceItemStack(Items.PAGE_PREV.getItem(), pageplaceholders);
+ pageNextIs = replaceItemStack(Items.PAGE_NEXT.getItem(), pageplaceholders);
+
+ if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) {
+ inventory.setItem(45, back);
+ backButtonLocation = 45;
+ }
+ if (slotsToQuestIds.size() > pageSize) {
+ inventory.setItem(49, pageIs);
+ if (page != 1) {
+ inventory.setItem(48, pagePrevIs);
+ pagePrevLocation = 48;
+ }
+ if (Math.ceil((double) slotsToQuestIds.size() / ((double) 45)) != page) {
+ inventory.setItem(50, pageNextIs);
+ pageNextLocation = 50;
+ }
+ } else if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) {
+ int slotsUsed = 0;
+ for (int pointer = 0; pointer < pageMax; pointer++) {
+ if (inventory.getItem(pointer) != null) {
+ slotsUsed++;
+ }
+ }
+
+ int inventorySize = (slotsUsed >= 54) ? 54 : slotsUsed + (9 - slotsUsed % 9) * Math.min(1, slotsUsed % 9);
+ inventorySize = inventorySize <= 0 ? 9 : inventorySize;
+ if (inventorySize == 54) {
+ return inventory;
+ } else if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) {
+ inventorySize += 9;
+ }
+
+ Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title);
+
+ for (int slot = 0; slot < trimmedInventory.getSize(); slot++) {
+ if (slot >= (trimmedInventory.getSize() - 9) && backButtonEnabled){
+ if (Options.CATEGORIES_ENABLED.getBooleanValue()) {
+ trimmedInventory.setItem(slot, back);
+ backButtonLocation = slot;
+ }
+ break;
+ }
+ trimmedInventory.setItem(slot, inventory.getItem(slot));
+ }
+ return trimmedInventory;
+ }
+
+ return inventory;
+ }
+
+ public boolean isBackButtonEnabled() {
+ return backButtonEnabled;
+ }
+
+ public void setBackButtonEnabled(boolean backButtonEnabled) {
+ this.backButtonEnabled = backButtonEnabled;
+ }
+
+ public int getBackButtonLocation() {
+ return backButtonLocation;
+ }
+
+ public QMenuCategory getSuperMenu() {
+ return superMenu;
+ }
+
+ public ItemStack replaceItemStack(ItemStack is, Map<String, String> placeholders) {
+ ItemStack newItemStack = is.clone();
+ List<String> lore = newItemStack.getItemMeta().getLore();
+ List<String> newLore = new ArrayList<>();
+ ItemMeta ism = newItemStack.getItemMeta();
+ if (lore != null) {
+ for (String s : lore) {
+ for (Map.Entry<String, String> entry : placeholders.entrySet()) {
+ s = s.replace(entry.getKey(), entry.getValue());
+ ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue()));
+ }
+ newLore.add(s);
+ }
+ }
+ ism.setLore(newLore);
+ newItemStack.setItemMeta(ism);
+ return newItemStack;
+ }
+}
diff --git a/src/main/java/me/fatpigsarefat/quests/obj/misc/creator/QMenuCreator.java b/src/main/java/me/fatpigsarefat/quests/obj/misc/creator/QMenuCreator.java
new file mode 100644
index 00000000..0436e203
--- /dev/null
+++ b/src/main/java/me/fatpigsarefat/quests/obj/misc/creator/QMenuCreator.java
@@ -0,0 +1,70 @@
+package me.fatpigsarefat.quests.obj.misc.creator;
+
+import me.fatpigsarefat.quests.obj.misc.QMenu;
+import me.fatpigsarefat.quests.player.QPlayer;
+import org.bukkit.Bukkit;
+import org.bukkit.ChatColor;
+import org.bukkit.Material;
+import org.bukkit.inventory.Inventory;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+public class QMenuCreator implements QMenu {
+
+ private QPlayer owner;
+
+ public QMenuCreator(QPlayer owner) {
+ this.owner = owner;
+ }
+
+ @Override
+ public HashMap<Integer, String> getSlotsToMenu() {
+ return null;
+ }
+
+ @Override
+ public QPlayer getOwner() {
+ return owner;
+ }
+
+ public Inventory toInventory(int page) {
+ String title = "Quest Creator";
+
+ Inventory inventory = Bukkit.createInventory(null, 9, title);
+
+ ItemStack newQuest = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 5);
+ ItemMeta newQuestM = newQuest.getItemMeta();
+ List<String> newQuestL = new ArrayList<>();
+ newQuestM.setDisplayName(ChatColor.GREEN.toString() + ChatColor.BOLD + "New Quest");
+ newQuestL.add(ChatColor.GRAY + "Click to make a new quest.");
+ newQuestM.setLore(newQuestL);
+ newQuest.setItemMeta(newQuestM);
+
+ ItemStack editQuest = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 1);
+ ItemMeta editQuestM = editQuest.getItemMeta();
+ List<String> editQuestL = new ArrayList<>();
+ editQuestM.setDisplayName(ChatColor.GREEN.toString() + ChatColor.BOLD + "Edit Quest");
+ editQuestL.add(ChatColor.GRAY + "Click to edit an existing quest.");
+ editQuestM.setLore(editQuestL);
+ editQuest.setItemMeta(editQuestM);
+
+ ItemStack removeQuest = new ItemStack(Material.STAINED_GLASS_PANE, 1, (short) 14);
+ ItemMeta removeQuestM = removeQuest.getItemMeta();
+ List<String> removeQuestL = new ArrayList<>();
+ removeQuestM.setDisplayName(ChatColor.GREEN.toString() + ChatColor.BOLD + "Delete Quest");
+ removeQuestL.add(ChatColor.GRAY + "Click to delete an existing quest.");
+ removeQuestM.setLore(removeQuestL);
+ removeQuest.setItemMeta(removeQuestM);
+
+ inventory.setItem(2, newQuest);
+ inventory.setItem(4, editQuest);
+ inventory.setItem(6, removeQuest);
+
+ return inventory;
+ }
+
+}