aboutsummaryrefslogtreecommitdiffstats
path: root/src/me/fatpigsarefat/quests/obj
diff options
context:
space:
mode:
Diffstat (limited to 'src/me/fatpigsarefat/quests/obj')
-rw-r--r--src/me/fatpigsarefat/quests/obj/Items.java23
-rw-r--r--src/me/fatpigsarefat/quests/obj/Messages.java45
-rw-r--r--src/me/fatpigsarefat/quests/obj/Options.java48
-rw-r--r--src/me/fatpigsarefat/quests/obj/misc/QItemStack.java108
-rw-r--r--src/me/fatpigsarefat/quests/obj/misc/QMenu.java12
-rw-r--r--src/me/fatpigsarefat/quests/obj/misc/QMenuCategory.java92
-rw-r--r--src/me/fatpigsarefat/quests/obj/misc/QMenuQuest.java177
7 files changed, 505 insertions, 0 deletions
diff --git a/src/me/fatpigsarefat/quests/obj/Items.java b/src/me/fatpigsarefat/quests/obj/Items.java
new file mode 100644
index 00000000..c8f8b7b8
--- /dev/null
+++ b/src/me/fatpigsarefat/quests/obj/Items.java
@@ -0,0 +1,23 @@
+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");
+
+ String path;
+
+ Items(String path) {
+ this.path = path;
+ }
+
+ public ItemStack getItem() {
+ return Quests.getInstance().getItemStack(path);
+ }
+
+}
diff --git a/src/me/fatpigsarefat/quests/obj/Messages.java b/src/me/fatpigsarefat/quests/obj/Messages.java
new file mode 100644
index 00000000..60eac35d
--- /dev/null
+++ b/src/me/fatpigsarefat/quests/obj/Messages.java
@@ -0,0 +1,45 @@
+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_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_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");
+
+ 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 path;
+ }
+ }
+ return path;
+ }
+
+}
diff --git a/src/me/fatpigsarefat/quests/obj/Options.java b/src/me/fatpigsarefat/quests/obj/Options.java
new file mode 100644
index 00000000..d4b63499
--- /dev/null
+++ b/src/me/fatpigsarefat/quests/obj/Options.java
@@ -0,0 +1,48 @@
+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");
+
+ 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/me/fatpigsarefat/quests/obj/misc/QItemStack.java b/src/me/fatpigsarefat/quests/obj/misc/QItemStack.java
new file mode 100644
index 00000000..efde9f51
--- /dev/null
+++ b/src/me/fatpigsarefat/quests/obj/misc/QItemStack.java
@@ -0,0 +1,108 @@
+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;
+ }
+
+ 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 {
+ is.getItemMeta().addItemFlags(ItemFlag.HIDE_ENCHANTS);
+ } 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));
+ }
+ }
+ }
+ formattedLore.add(s);
+ }
+ }
+ ism.setLore(formattedLore);
+ is.setItemMeta(ism);
+ return is;
+ }
+}
diff --git a/src/me/fatpigsarefat/quests/obj/misc/QMenu.java b/src/me/fatpigsarefat/quests/obj/misc/QMenu.java
new file mode 100644
index 00000000..13629600
--- /dev/null
+++ b/src/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/me/fatpigsarefat/quests/obj/misc/QMenuCategory.java b/src/me/fatpigsarefat/quests/obj/misc/QMenuCategory.java
new file mode 100644
index 00000000..449f81d6
--- /dev/null
+++ b/src/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 = "Quest Categories";
+
+ ItemStack pageIs = new ItemStack(Material.DIRT);
+
+ Inventory inventory = Bukkit.createInventory(null, 54, title); //TODO make configurable 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/me/fatpigsarefat/quests/obj/misc/QMenuQuest.java b/src/me/fatpigsarefat/quests/obj/misc/QMenuQuest.java
new file mode 100644
index 00000000..4df9df89
--- /dev/null
+++ b/src/me/fatpigsarefat/quests/obj/misc/QMenuQuest.java
@@ -0,0 +1,177 @@
+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.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;
+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 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) {
+ 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 Inventory toInventory(int page) {
+ int pageMin = pageSize * (page - 1);
+ int pageMax = pageSize * page;
+ String title = "Quests";
+
+ ItemStack pageIs = new ItemStack(Material.DIRT);
+ ItemStack back = Items.BACK_BUTTON.getItem();
+
+ Inventory inventory = Bukkit.createInventory(null, 54, title); //TODO make configurable 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++;
+ }
+
+ inventory.setItem(49, pageIs);
+
+ if (Options.CATEGORIES_ENABLED.getBooleanValue() && backButtonEnabled) {
+ inventory.setItem(45, back);
+ backButtonLocation = 45;
+ }
+
+ 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;
+ } else {
+ return inventory;
+ }
+
+ //TODO add page controls
+ }
+
+ 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<>();
+ 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;
+ }
+}