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