From 9d155f39132b4a5d6211e936494240fcdb4459f7 Mon Sep 17 00:00:00 2001 From: LMBishop <13875753+LMBishop@users.noreply.github.com> Date: Fri, 5 Feb 2021 14:49:11 +0000 Subject: Added option to parse PAPI for Quest GUI items - Closes #124 - Moved some things about --- .../java/com/leonardobishop/quests/Quests.java | 26 ++- .../leonardobishop/quests/QuestsConfigLoader.java | 4 +- .../quests/hooks/itemgetter/ItemGetter.java | 48 +++++ .../quests/hooks/itemgetter/ItemGetterLatest.java | 239 +++++++++++++++++++++ .../quests/hooks/itemgetter/ItemGetter_1_13.java | 229 ++++++++++++++++++++ .../hooks/itemgetter/ItemGetter_Late_1_8.java | 161 ++++++++++++++ .../quests/hooks/papi/PlaceholderAPIHook.java | 12 ++ .../leonardobishop/quests/hooks/title/Title.java | 8 + .../quests/hooks/title/Title_Bukkit.java | 12 ++ .../quests/hooks/title/Title_BukkitNoTimings.java | 13 ++ .../quests/hooks/title/Title_Other.java | 11 + .../quests/itemgetter/ItemGetter.java | 48 ----- .../quests/itemgetter/ItemGetterLatest.java | 239 --------------------- .../quests/itemgetter/ItemGetter_1_13.java | 229 -------------------- .../quests/itemgetter/ItemGetter_Late_1_8.java | 161 -------------- .../com/leonardobishop/quests/obj/Options.java | 1 + .../leonardobishop/quests/obj/misc/QItemStack.java | 17 +- .../quests/obj/misc/QMenuCancel.java | 18 -- .../quests/obj/misc/QMenuCategory.java | 34 ++- .../leonardobishop/quests/obj/misc/QMenuDaily.java | 16 -- .../leonardobishop/quests/obj/misc/QMenuQuest.java | 23 +- .../com/leonardobishop/quests/player/QPlayer.java | 8 +- .../com/leonardobishop/quests/title/Title.java | 8 - .../leonardobishop/quests/title/Title_Bukkit.java | 12 -- .../quests/title/Title_BukkitNoTimings.java | 13 -- .../leonardobishop/quests/title/Title_Other.java | 11 - src/main/resources/config.yml | 2 + 27 files changed, 826 insertions(+), 777 deletions(-) create mode 100644 src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter.java create mode 100644 src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetterLatest.java create mode 100644 src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_1_13.java create mode 100644 src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_Late_1_8.java create mode 100644 src/main/java/com/leonardobishop/quests/hooks/papi/PlaceholderAPIHook.java create mode 100644 src/main/java/com/leonardobishop/quests/hooks/title/Title.java create mode 100644 src/main/java/com/leonardobishop/quests/hooks/title/Title_Bukkit.java create mode 100644 src/main/java/com/leonardobishop/quests/hooks/title/Title_BukkitNoTimings.java create mode 100644 src/main/java/com/leonardobishop/quests/hooks/title/Title_Other.java delete mode 100644 src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java delete mode 100644 src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java delete mode 100644 src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java delete mode 100644 src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java delete mode 100644 src/main/java/com/leonardobishop/quests/title/Title.java delete mode 100644 src/main/java/com/leonardobishop/quests/title/Title_Bukkit.java delete mode 100644 src/main/java/com/leonardobishop/quests/title/Title_BukkitNoTimings.java delete mode 100644 src/main/java/com/leonardobishop/quests/title/Title_Other.java (limited to 'src') diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java index ad5a1798..d03d0a1b 100644 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ b/src/main/java/com/leonardobishop/quests/Quests.java @@ -6,10 +6,11 @@ import com.leonardobishop.quests.commands.CommandQuests; import com.leonardobishop.quests.events.EventInventory; import com.leonardobishop.quests.events.EventPlayerJoin; import com.leonardobishop.quests.events.EventPlayerLeave; -import com.leonardobishop.quests.itemgetter.ItemGetter; -import com.leonardobishop.quests.itemgetter.ItemGetterLatest; -import com.leonardobishop.quests.itemgetter.ItemGetter_1_13; -import com.leonardobishop.quests.itemgetter.ItemGetter_Late_1_8; +import com.leonardobishop.quests.hooks.itemgetter.ItemGetter; +import com.leonardobishop.quests.hooks.itemgetter.ItemGetterLatest; +import com.leonardobishop.quests.hooks.itemgetter.ItemGetter_1_13; +import com.leonardobishop.quests.hooks.itemgetter.ItemGetter_Late_1_8; +import com.leonardobishop.quests.hooks.papi.PlaceholderAPIHook; import com.leonardobishop.quests.obj.Messages; import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.QPlayerManager; @@ -18,10 +19,10 @@ import com.leonardobishop.quests.quests.tasktypes.TaskType; import com.leonardobishop.quests.quests.tasktypes.TaskTypeManager; import com.leonardobishop.quests.quests.tasktypes.types.*; import com.leonardobishop.quests.quests.tasktypes.types.dependent.*; -import com.leonardobishop.quests.title.Title; -import com.leonardobishop.quests.title.Title_Bukkit; -import com.leonardobishop.quests.title.Title_BukkitNoTimings; -import com.leonardobishop.quests.title.Title_Other; +import com.leonardobishop.quests.hooks.title.Title; +import com.leonardobishop.quests.hooks.title.Title_Bukkit; +import com.leonardobishop.quests.hooks.title.Title_BukkitNoTimings; +import com.leonardobishop.quests.hooks.title.Title_Other; import com.leonardobishop.quests.updater.Updater; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.Bukkit; @@ -47,6 +48,7 @@ public class Quests extends JavaPlugin { private QuestsConfigLoader questsConfigLoader; private QuestsLogger questsLogger; private PlaceholderExpansion placeholder; + private PlaceholderAPIHook placeholderAPIHook; private boolean brokenConfig = false; private BukkitTask questAutosaveTask; @@ -195,6 +197,10 @@ public class Quests extends JavaPlugin { } }); + if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { + this.placeholderAPIHook = new PlaceholderAPIHook(); + } + // this intentionally should not be documented boolean ignoreUpdates = false; try { @@ -211,6 +217,10 @@ public class Quests extends JavaPlugin { } } + public PlaceholderAPIHook getPlaceholderAPIHook() { + return placeholderAPIHook; + } + @Override public void onDisable() { for (TaskType taskType : getTaskTypeManager().getTaskTypes()) { diff --git a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java b/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java index cd9c1345..b6517e5e 100644 --- a/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java +++ b/src/main/java/com/leonardobishop/quests/QuestsConfigLoader.java @@ -1,6 +1,6 @@ package com.leonardobishop.quests; -import com.leonardobishop.quests.itemgetter.ItemGetter; +import com.leonardobishop.quests.hooks.itemgetter.ItemGetter; import com.leonardobishop.quests.obj.Options; import com.leonardobishop.quests.obj.misc.QItemStack; import com.leonardobishop.quests.quests.Category; @@ -301,7 +301,7 @@ public class QuestsConfigLoader { ItemStack is = plugin.getItemStack(path, config, ItemGetter.Filter.DISPLAY_NAME, ItemGetter.Filter.LORE, ItemGetter.Filter.ENCHANTMENTS, ItemGetter.Filter.ITEM_FLAGS); - return new QItemStack(name, loreNormal, loreStarted, is); + return new QItemStack(plugin, name, loreNormal, loreStarted, is); } public enum ConfigProblemDescriptions { diff --git a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter.java b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter.java new file mode 100644 index 00000000..a0d7545e --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter.java @@ -0,0 +1,48 @@ +package com.leonardobishop.quests.hooks.itemgetter; + +import com.leonardobishop.quests.Quests; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.inventory.ItemStack; + +public interface ItemGetter { + + /** + * Gets an ItemStack from a configuration. + * Implementations should specific to the server version. + * + * @param path the path to where the item is defined in the config (null if item is defined in second param) + * @param config the configuration file + * @param plugin Quests plugin instance + * @param excludes exclude certain fields in the configuration + * @return {@link org.bukkit.inventory.ItemStack} + */ + ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes); + + /** + * Gets an ItemStack from a given string (which represents a material). + * For pre-1.13 server implementations, the string may use a data code. + * + * @param material the string + * @return {@link org.bukkit.inventory.ItemStack} + */ + ItemStack getItemStack(String material, Quests plugin); + + /** + * Validates a material from a string. + * For pre-1.13 server implementations, the string may use a data code. + * + * @param material the string + * @return true if it a material + */ + boolean isValidMaterial(String material); + + enum Filter { + DISPLAY_NAME, + LORE, + ENCHANTMENTS, + ITEM_FLAGS, + UNBREAKABLE, + ATTRIBUTE_MODIFIER, + CUSTOM_MODEL_DATA; + } +} \ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetterLatest.java b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetterLatest.java new file mode 100644 index 00000000..c33baac7 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetterLatest.java @@ -0,0 +1,239 @@ +package com.leonardobishop.quests.hooks.itemgetter; + +import com.leonardobishop.quests.Quests; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; + +public class ItemGetterLatest implements ItemGetter { + + /* + supporting: + - name + - material + - lore + - enchantments (NamespacedKey) + - itemflags + - unbreakable + - attribute modifier + - custom model data + + requires at least API version 1.14 + */ + @Override + public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { + if (path != null && !path.equals("")) { + path = path + "."; + } + List filters = Arrays.asList(excludes); + + String cName = config.getString(path + "name", path + "name"); + String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); + boolean hasCustomModelData = config.contains(path + "custommodeldata"); + int customModelData = config.getInt(path + "custommodeldata", 0); + boolean unbreakable = config.getBoolean(path + "unbreakable", false); + List cLore = config.getStringList(path + "lore"); + List cItemFlags = config.getStringList(path + "itemflags"); + boolean hasAttributeModifiers = config.contains(path + "attributemodifiers"); + List> cAttributeModifiers = config.getMapList(path + "attributemodifiers"); + + String name; + Material type = null; + int data = 0; + + // material + ItemStack is = getItemStack(cType, plugin); + ItemMeta ism = is.getItemMeta(); + + // name + if (!filters.contains(Filter.DISPLAY_NAME)) { + name = ChatColor.translateAlternateColorCodes('&', cName); + ism.setDisplayName(name); + } + + // lore + if (!filters.contains(Filter.LORE)) { + List lore = new ArrayList<>(); + if (cLore != null) { + for (String s : cLore) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + } + ism.setLore(lore); + } + + // attribute modifiers + if (!filters.contains(Filter.ATTRIBUTE_MODIFIER)) { + if (hasAttributeModifiers) { + for (Map attr : cAttributeModifiers) { + String cAttribute = (String) attr.get("attribute"); + Attribute attribute = null; + for (Attribute enumattr : Attribute.values()) { + if (enumattr.toString().equals(cAttribute)) { + attribute = enumattr; + break; + } + } + + if (attribute == null) continue; + + Map configurationSection = (Map) attr.get("modifier"); + + String cUUID = (String) configurationSection.get("uuid"); + String cModifierName = (String) configurationSection.get("name"); + String cModifierOperation = (String) configurationSection.get("operation"); + double cAmount; + try { + Object cAmountObj = configurationSection.get("amount"); + if (cAmountObj instanceof Integer) { + cAmount = ((Integer) cAmountObj).doubleValue(); + } else { + cAmount = (Double) cAmountObj; + } + } catch (Exception e) { + cAmount = 1; + } + String cEquipmentSlot = (String) configurationSection.get("equipmentslot"); + + UUID uuid = null; + if (cUUID != null) { + try { + uuid = UUID.fromString(cUUID); + } catch (Exception ignored) { + // ignored + } + } + EquipmentSlot equipmentSlot = null; + if (cEquipmentSlot != null) { + try { + equipmentSlot = EquipmentSlot.valueOf(cEquipmentSlot); + } catch (Exception ignored) { + // ignored + } + } + AttributeModifier.Operation operation = AttributeModifier.Operation.ADD_NUMBER; + try { + operation = AttributeModifier.Operation.valueOf(cModifierOperation); + } catch (Exception ignored) { + // ignored + } + + AttributeModifier modifier; + if (uuid == null) { + modifier = new AttributeModifier(cModifierName, cAmount, operation); + } else if (equipmentSlot == null) { + modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation); + } else { + modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation, equipmentSlot); + } + + ism.addAttributeModifier(attribute, modifier); + } + } + } + + // item flags + if (!filters.contains(Filter.ITEM_FLAGS)) { + if (config.isSet(path + "itemflags")) { + for (String flag : cItemFlags) { + for (ItemFlag iflag : ItemFlag.values()) { + if (iflag.toString().equals(flag)) { + ism.addItemFlags(iflag); + break; + } + } + } + } + } + + // custom model data + if (!filters.contains(Filter.CUSTOM_MODEL_DATA)) { + if (hasCustomModelData) { + ism.setCustomModelData(customModelData); + } + } + + // unbreakable + if (!filters.contains(Filter.UNBREAKABLE)) { + ism.setUnbreakable(unbreakable); + } + + // enchantments + if (!filters.contains(Filter.ENCHANTMENTS)) { + if (config.isSet(path + "enchantments")) { + for (String key : config.getStringList(path + "enchantments")) { + String[] split = key.split(":"); + if (split.length < 2) { + plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); + continue; + } + String namespace = split[0]; + String ench = split[1]; + String levelName; + if (split.length >= 3) { + levelName = split[2]; + } else { + levelName = "1"; + } + + NamespacedKey namespacedKey; + try { + namespacedKey = new NamespacedKey(namespace, ench); + } catch (Exception e) { + plugin.getQuestsLogger().debug("Unrecognised namespace: " + namespace); + continue; + } + Enchantment enchantment; + if ((enchantment = Enchantment.getByKey(namespacedKey)) == null) { + plugin.getQuestsLogger().debug("Unrecognised enchantment: " + namespacedKey); + continue; + } + + int level; + try { + level = Integer.parseInt(levelName); + } catch (NumberFormatException e) { + level = 1; + } + + is.addUnsafeEnchantment(enchantment, level); + } + } + } + + is.setItemMeta(ism); + return is; + } + + @Override + public ItemStack getItemStack(String material, Quests plugin) { + Material type; + try { + type = Material.valueOf(material); + } catch (Exception e) { + plugin.getQuestsLogger().debug("Unrecognised material: " + material); + type = Material.STONE; + } + return new ItemStack(type, 1); + } + + @Override + public boolean isValidMaterial(String material) { + try { + Material.valueOf(material); + return true; + } catch (IllegalArgumentException ex) { + return false; + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_1_13.java b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_1_13.java new file mode 100644 index 00000000..0e0850cd --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_1_13.java @@ -0,0 +1,229 @@ +package com.leonardobishop.quests.hooks.itemgetter; + +import com.leonardobishop.quests.Quests; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; + +public class ItemGetter_1_13 implements ItemGetter { + /* + reads the following: + - name + - material + - lore + - enchantments (NamespacedKey) + - itemflags + - unbreakable + - attribute modifier + + requires at least API version 1.13 + */ + @Override + public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { + if (path != null && !path.equals("")) { + path = path + "."; + } + List filters = Arrays.asList(excludes); + + String cName = config.getString(path + "name", path + "name"); + String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); + boolean unbreakable = config.getBoolean(path + "unbreakable", false); + List cLore = config.getStringList(path + "lore"); + List cItemFlags = config.getStringList(path + "itemflags"); + boolean hasAttributeModifiers = config.contains(path + "attributemodifiers"); + List> cAttributeModifiers = config.getMapList(path + "attributemodifiers"); + + String name; + Material type = null; + int data = 0; + + // material + ItemStack is = getItemStack(cType, plugin); + ItemMeta ism = is.getItemMeta(); + + // name + if (!filters.contains(Filter.DISPLAY_NAME)) { + name = ChatColor.translateAlternateColorCodes('&', cName); + ism.setDisplayName(name); + } + + // lore + if (!filters.contains(Filter.LORE)) { + List lore = new ArrayList<>(); + if (cLore != null) { + for (String s : cLore) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + } + ism.setLore(lore); + } + + // attribute modifiers + if (!filters.contains(Filter.ATTRIBUTE_MODIFIER)) { + if (hasAttributeModifiers) { + for (Map attr : cAttributeModifiers) { + String cAttribute = (String) attr.get("attribute"); + Attribute attribute = null; + for (Attribute enumattr : Attribute.values()) { + if (enumattr.toString().equals(cAttribute)) { + attribute = enumattr; + break; + } + } + + if (attribute == null) continue; + + Map configurationSection = (Map) attr.get("modifier"); + + String cUUID = (String) configurationSection.get("uuid"); + String cModifierName = (String) configurationSection.get("name"); + String cModifierOperation = (String) configurationSection.get("operation"); + double cAmount; + try { + Object cAmountObj = configurationSection.get("amount"); + if (cAmountObj instanceof Integer) { + cAmount = ((Integer) cAmountObj).doubleValue(); + } else { + cAmount = (Double) cAmountObj; + } + } catch (Exception e) { + cAmount = 1; + } + String cEquipmentSlot = (String) configurationSection.get("equipmentslot"); + + UUID uuid = null; + if (cUUID != null) { + try { + uuid = UUID.fromString(cUUID); + } catch (Exception ignored) { + // ignored + } + } + EquipmentSlot equipmentSlot = null; + if (cEquipmentSlot != null) { + try { + equipmentSlot = EquipmentSlot.valueOf(cEquipmentSlot); + } catch (Exception ignored) { + // ignored + } + } + AttributeModifier.Operation operation = AttributeModifier.Operation.ADD_NUMBER; + try { + operation = AttributeModifier.Operation.valueOf(cModifierOperation); + } catch (Exception ignored) { + // ignored + } + + AttributeModifier modifier; + if (uuid == null) { + modifier = new AttributeModifier(cModifierName, cAmount, operation); + } else if (equipmentSlot == null) { + modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation); + } else { + modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation, equipmentSlot); + } + + ism.addAttributeModifier(attribute, modifier); + } + } + } + + // item flags + if (!filters.contains(Filter.ITEM_FLAGS)) { + if (config.isSet(path + "itemflags")) { + for (String flag : cItemFlags) { + for (ItemFlag iflag : ItemFlag.values()) { + if (iflag.toString().equals(flag)) { + ism.addItemFlags(iflag); + break; + } + } + } + } + } + + + // unbreakable + if (!filters.contains(Filter.UNBREAKABLE)) { + ism.setUnbreakable(unbreakable); + } + + // enchantments + if (!filters.contains(Filter.ENCHANTMENTS)) { + if (config.isSet(path + "enchantments")) { + for (String key : config.getStringList(path + "enchantments")) { + String[] split = key.split(":"); + if (split.length < 2) { + plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); + continue; + } + String namespace = split[0]; + String ench = split[1]; + String levelName; + if (split.length >= 3) { + levelName = split[2]; + } else { + levelName = "1"; + } + + NamespacedKey namespacedKey; + try { + namespacedKey = new NamespacedKey(namespace, ench); + } catch (Exception e) { + plugin.getQuestsLogger().debug("Unrecognised namespace: " + namespace); + continue; + } + Enchantment enchantment; + if ((enchantment = Enchantment.getByKey(namespacedKey)) == null) { + plugin.getQuestsLogger().debug("Unrecognised enchantment: " + namespacedKey); + continue; + } + + int level; + try { + level = Integer.parseInt(levelName); + } catch (NumberFormatException e) { + level = 1; + } + + is.addUnsafeEnchantment(enchantment, level); + } + } + } + + is.setItemMeta(ism); + return is; + } + + @Override + public ItemStack getItemStack(String material, Quests plugin) { + Material type; + try { + type = Material.valueOf(material); + } catch (Exception e) { + plugin.getQuestsLogger().debug("Unrecognised material: " + material); + type = Material.STONE; + } + return new ItemStack(type, 1); + } + + @Override + public boolean isValidMaterial(String material) { + try { + Material.valueOf(material); + return true; + } catch (IllegalArgumentException ex) { + return false; + } + } +} diff --git a/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_Late_1_8.java b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_Late_1_8.java new file mode 100644 index 00000000..f3523b70 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/itemgetter/ItemGetter_Late_1_8.java @@ -0,0 +1,161 @@ +package com.leonardobishop.quests.hooks.itemgetter; + +import com.leonardobishop.quests.Quests; +import org.apache.commons.lang.StringUtils; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +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.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +public class ItemGetter_Late_1_8 implements ItemGetter { + /* + reads the following: + - name + - material (+ DATA) + - lore + - enchantments (NOT NamespacedKey) + - itemflags + + requires at least API version 1.8 (?) + */ + @Override + public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes) { + if (path != null && !path.equals("")) { + path = path + "."; + } + List filters = Arrays.asList(excludes); + + + String cName = config.getString(path + "name", path + "name"); + String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); + List cLore = config.getStringList(path + "lore"); + List cItemFlags = config.getStringList(path + "itemflags"); + + String name; + Material type = null; + int data = 0; + + // material + ItemStack is = getItemStack(cType, plugin); + ItemMeta ism = is.getItemMeta(); + + // lore + if (!filters.contains(Filter.LORE)) { + List lore = new ArrayList<>(); + if (cLore != null) { + for (String s : cLore) { + lore.add(ChatColor.translateAlternateColorCodes('&', s)); + } + } + ism.setLore(lore); + } + + // name + if (!filters.contains(Filter.DISPLAY_NAME)) { + name = ChatColor.translateAlternateColorCodes('&', cName); + ism.setDisplayName(name); + } + + + // item flags + if (!filters.contains(Filter.ITEM_FLAGS)) { + if (config.isSet(path + "itemflags")) { + for (String flag : cItemFlags) { + for (ItemFlag iflag : ItemFlag.values()) { + if (iflag.toString().equals(flag)) { + ism.addItemFlags(iflag); + break; + } + } + } + } + } + + // enchantments + if (!filters.contains(Filter.ENCHANTMENTS)) { + if (config.isSet(path + "enchantments")) { + for (String key : config.getStringList(path + "enchantments")) { + String[] split = key.split(":"); + String ench = split[0]; + String levelName; + if (split.length >= 2) { + levelName = split[1]; + } else { + levelName = "1"; + } + + Enchantment enchantment; + if ((enchantment = Enchantment.getByName(ench)) == null) { + plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); + continue; + } + + int level; + try { + level = Integer.parseInt(levelName); + } catch (NumberFormatException e) { + level = 1; + } + + is.addUnsafeEnchantment(enchantment, level); + } + } + } + + is.setItemMeta(ism); + return is; + } + + + @Override + public ItemStack getItemStack(String material, Quests plugin) { + Material type = null; + int data = 0; + + if (Material.getMaterial(material) != null) { + type = Material.getMaterial(material); + } else if (material.contains(":")) { + String[] parts = material.split(Pattern.quote(":")); + if (parts.length > 1) { + if (Material.getMaterial(parts[0]) != null) { + type = Material.getMaterial(parts[0]); + } + if (StringUtils.isNumeric(parts[1])) { + data = Integer.parseInt(parts[1]); + } + } + } + + if (type == null) { + plugin.getQuestsLogger().debug("Unrecognised material: " + material); + type = Material.STONE; + } + return new ItemStack(type, 1, (short) data); + } + + @Override + public boolean isValidMaterial(String material) { + Material type = null; + + if (Material.getMaterial(material) != null) { + type = Material.getMaterial(material); + } else if (material.contains(":")) { + String[] parts = material.split(Pattern.quote(":")); + if (parts.length > 1) { + if (Material.getMaterial(parts[0]) != null) { + type = Material.getMaterial(parts[0]); + } + } + } + + return !(type == null); + } +} diff --git a/src/main/java/com/leonardobishop/quests/hooks/papi/PlaceholderAPIHook.java b/src/main/java/com/leonardobishop/quests/hooks/papi/PlaceholderAPIHook.java new file mode 100644 index 00000000..4612d0af --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/papi/PlaceholderAPIHook.java @@ -0,0 +1,12 @@ +package com.leonardobishop.quests.hooks.papi; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; + +public class PlaceholderAPIHook { + + public String replacePlaceholders(Player player, String text) { + return PlaceholderAPI.setPlaceholders(player, text); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/hooks/title/Title.java b/src/main/java/com/leonardobishop/quests/hooks/title/Title.java new file mode 100644 index 00000000..030d7455 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/title/Title.java @@ -0,0 +1,8 @@ +package com.leonardobishop.quests.hooks.title; + +import org.bukkit.entity.Player; + +public interface Title { + + void sendTitle(Player player, String message, String submessage); +} \ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/hooks/title/Title_Bukkit.java b/src/main/java/com/leonardobishop/quests/hooks/title/Title_Bukkit.java new file mode 100644 index 00000000..0f46771a --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/title/Title_Bukkit.java @@ -0,0 +1,12 @@ +package com.leonardobishop.quests.hooks.title; + +import org.bukkit.entity.Player; + +public class Title_Bukkit implements Title { + + // new title function with timings + @Override + public void sendTitle(Player player, String message, String submessage) { + player.sendTitle(message, submessage, 10, 100, 10); + } +} diff --git a/src/main/java/com/leonardobishop/quests/hooks/title/Title_BukkitNoTimings.java b/src/main/java/com/leonardobishop/quests/hooks/title/Title_BukkitNoTimings.java new file mode 100644 index 00000000..92ffdd16 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/title/Title_BukkitNoTimings.java @@ -0,0 +1,13 @@ +package com.leonardobishop.quests.hooks.title; + +import org.bukkit.entity.Player; + +public class Title_BukkitNoTimings implements Title { + + // this one is for 1.8, 1.9 and 1.10 where there was no timings method + @Override + public void sendTitle(Player player, String message, String submessage) { + player.sendTitle(message, submessage); + } + +} diff --git a/src/main/java/com/leonardobishop/quests/hooks/title/Title_Other.java b/src/main/java/com/leonardobishop/quests/hooks/title/Title_Other.java new file mode 100644 index 00000000..ab7b7bf2 --- /dev/null +++ b/src/main/java/com/leonardobishop/quests/hooks/title/Title_Other.java @@ -0,0 +1,11 @@ +package com.leonardobishop.quests.hooks.title; + +import org.bukkit.entity.Player; + +public class Title_Other implements Title { + + @Override + public void sendTitle(Player player, String message, String submessage) { + // title function does not exist + } +} diff --git a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java deleted file mode 100644 index 444d63dc..00000000 --- a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.leonardobishop.quests.itemgetter; - -import com.leonardobishop.quests.Quests; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.inventory.ItemStack; - -public interface ItemGetter { - - /** - * Gets an ItemStack from a configuration. - * Implementations should specific to the server version. - * - * @param path the path to where the item is defined in the config (null if item is defined in second param) - * @param config the configuration file - * @param plugin Quests plugin instance - * @param excludes exclude certain fields in the configuration - * @return {@link org.bukkit.inventory.ItemStack} - */ - ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes); - - /** - * Gets an ItemStack from a given string (which represents a material). - * For pre-1.13 server implementations, the string may use a data code. - * - * @param material the string - * @return {@link org.bukkit.inventory.ItemStack} - */ - ItemStack getItemStack(String material, Quests plugin); - - /** - * Validates a material from a string. - * For pre-1.13 server implementations, the string may use a data code. - * - * @param material the string - * @return true if it a material - */ - boolean isValidMaterial(String material); - - enum Filter { - DISPLAY_NAME, - LORE, - ENCHANTMENTS, - ITEM_FLAGS, - UNBREAKABLE, - ATTRIBUTE_MODIFIER, - CUSTOM_MODEL_DATA; - } -} \ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java deleted file mode 100644 index 8208417f..00000000 --- a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetterLatest.java +++ /dev/null @@ -1,239 +0,0 @@ -package com.leonardobishop.quests.itemgetter; - -import com.leonardobishop.quests.Quests; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeModifier; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.*; - -public class ItemGetterLatest implements ItemGetter { - - /* - supporting: - - name - - material - - lore - - enchantments (NamespacedKey) - - itemflags - - unbreakable - - attribute modifier - - custom model data - - requires at least API version 1.14 - */ - @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { - if (path != null && !path.equals("")) { - path = path + "."; - } - List filters = Arrays.asList(excludes); - - String cName = config.getString(path + "name", path + "name"); - String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); - boolean hasCustomModelData = config.contains(path + "custommodeldata"); - int customModelData = config.getInt(path + "custommodeldata", 0); - boolean unbreakable = config.getBoolean(path + "unbreakable", false); - List cLore = config.getStringList(path + "lore"); - List cItemFlags = config.getStringList(path + "itemflags"); - boolean hasAttributeModifiers = config.contains(path + "attributemodifiers"); - List> cAttributeModifiers = config.getMapList(path + "attributemodifiers"); - - String name; - Material type = null; - int data = 0; - - // material - ItemStack is = getItemStack(cType, plugin); - ItemMeta ism = is.getItemMeta(); - - // name - if (!filters.contains(Filter.DISPLAY_NAME)) { - name = ChatColor.translateAlternateColorCodes('&', cName); - ism.setDisplayName(name); - } - - // lore - if (!filters.contains(Filter.LORE)) { - List lore = new ArrayList<>(); - if (cLore != null) { - for (String s : cLore) { - lore.add(ChatColor.translateAlternateColorCodes('&', s)); - } - } - ism.setLore(lore); - } - - // attribute modifiers - if (!filters.contains(Filter.ATTRIBUTE_MODIFIER)) { - if (hasAttributeModifiers) { - for (Map attr : cAttributeModifiers) { - String cAttribute = (String) attr.get("attribute"); - Attribute attribute = null; - for (Attribute enumattr : Attribute.values()) { - if (enumattr.toString().equals(cAttribute)) { - attribute = enumattr; - break; - } - } - - if (attribute == null) continue; - - Map configurationSection = (Map) attr.get("modifier"); - - String cUUID = (String) configurationSection.get("uuid"); - String cModifierName = (String) configurationSection.get("name"); - String cModifierOperation = (String) configurationSection.get("operation"); - double cAmount; - try { - Object cAmountObj = configurationSection.get("amount"); - if (cAmountObj instanceof Integer) { - cAmount = ((Integer) cAmountObj).doubleValue(); - } else { - cAmount = (Double) cAmountObj; - } - } catch (Exception e) { - cAmount = 1; - } - String cEquipmentSlot = (String) configurationSection.get("equipmentslot"); - - UUID uuid = null; - if (cUUID != null) { - try { - uuid = UUID.fromString(cUUID); - } catch (Exception ignored) { - // ignored - } - } - EquipmentSlot equipmentSlot = null; - if (cEquipmentSlot != null) { - try { - equipmentSlot = EquipmentSlot.valueOf(cEquipmentSlot); - } catch (Exception ignored) { - // ignored - } - } - AttributeModifier.Operation operation = AttributeModifier.Operation.ADD_NUMBER; - try { - operation = AttributeModifier.Operation.valueOf(cModifierOperation); - } catch (Exception ignored) { - // ignored - } - - AttributeModifier modifier; - if (uuid == null) { - modifier = new AttributeModifier(cModifierName, cAmount, operation); - } else if (equipmentSlot == null) { - modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation); - } else { - modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation, equipmentSlot); - } - - ism.addAttributeModifier(attribute, modifier); - } - } - } - - // item flags - if (!filters.contains(Filter.ITEM_FLAGS)) { - if (config.isSet(path + "itemflags")) { - for (String flag : cItemFlags) { - for (ItemFlag iflag : ItemFlag.values()) { - if (iflag.toString().equals(flag)) { - ism.addItemFlags(iflag); - break; - } - } - } - } - } - - // custom model data - if (!filters.contains(Filter.CUSTOM_MODEL_DATA)) { - if (hasCustomModelData) { - ism.setCustomModelData(customModelData); - } - } - - // unbreakable - if (!filters.contains(Filter.UNBREAKABLE)) { - ism.setUnbreakable(unbreakable); - } - - // enchantments - if (!filters.contains(Filter.ENCHANTMENTS)) { - if (config.isSet(path + "enchantments")) { - for (String key : config.getStringList(path + "enchantments")) { - String[] split = key.split(":"); - if (split.length < 2) { - plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); - continue; - } - String namespace = split[0]; - String ench = split[1]; - String levelName; - if (split.length >= 3) { - levelName = split[2]; - } else { - levelName = "1"; - } - - NamespacedKey namespacedKey; - try { - namespacedKey = new NamespacedKey(namespace, ench); - } catch (Exception e) { - plugin.getQuestsLogger().debug("Unrecognised namespace: " + namespace); - continue; - } - Enchantment enchantment; - if ((enchantment = Enchantment.getByKey(namespacedKey)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + namespacedKey); - continue; - } - - int level; - try { - level = Integer.parseInt(levelName); - } catch (NumberFormatException e) { - level = 1; - } - - is.addUnsafeEnchantment(enchantment, level); - } - } - } - - is.setItemMeta(ism); - return is; - } - - @Override - public ItemStack getItemStack(String material, Quests plugin) { - Material type; - try { - type = Material.valueOf(material); - } catch (Exception e) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); - type = Material.STONE; - } - return new ItemStack(type, 1); - } - - @Override - public boolean isValidMaterial(String material) { - try { - Material.valueOf(material); - return true; - } catch (IllegalArgumentException ex) { - return false; - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java deleted file mode 100644 index 08a48e2e..00000000 --- a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_1_13.java +++ /dev/null @@ -1,229 +0,0 @@ -package com.leonardobishop.quests.itemgetter; - -import com.leonardobishop.quests.Quests; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.attribute.Attribute; -import org.bukkit.attribute.AttributeModifier; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.EquipmentSlot; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.*; - -public class ItemGetter_1_13 implements ItemGetter { - /* - reads the following: - - name - - material - - lore - - enchantments (NamespacedKey) - - itemflags - - unbreakable - - attribute modifier - - requires at least API version 1.13 - */ - @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, ItemGetter.Filter... excludes) { - if (path != null && !path.equals("")) { - path = path + "."; - } - List filters = Arrays.asList(excludes); - - String cName = config.getString(path + "name", path + "name"); - String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); - boolean unbreakable = config.getBoolean(path + "unbreakable", false); - List cLore = config.getStringList(path + "lore"); - List cItemFlags = config.getStringList(path + "itemflags"); - boolean hasAttributeModifiers = config.contains(path + "attributemodifiers"); - List> cAttributeModifiers = config.getMapList(path + "attributemodifiers"); - - String name; - Material type = null; - int data = 0; - - // material - ItemStack is = getItemStack(cType, plugin); - ItemMeta ism = is.getItemMeta(); - - // name - if (!filters.contains(Filter.DISPLAY_NAME)) { - name = ChatColor.translateAlternateColorCodes('&', cName); - ism.setDisplayName(name); - } - - // lore - if (!filters.contains(Filter.LORE)) { - List lore = new ArrayList<>(); - if (cLore != null) { - for (String s : cLore) { - lore.add(ChatColor.translateAlternateColorCodes('&', s)); - } - } - ism.setLore(lore); - } - - // attribute modifiers - if (!filters.contains(Filter.ATTRIBUTE_MODIFIER)) { - if (hasAttributeModifiers) { - for (Map attr : cAttributeModifiers) { - String cAttribute = (String) attr.get("attribute"); - Attribute attribute = null; - for (Attribute enumattr : Attribute.values()) { - if (enumattr.toString().equals(cAttribute)) { - attribute = enumattr; - break; - } - } - - if (attribute == null) continue; - - Map configurationSection = (Map) attr.get("modifier"); - - String cUUID = (String) configurationSection.get("uuid"); - String cModifierName = (String) configurationSection.get("name"); - String cModifierOperation = (String) configurationSection.get("operation"); - double cAmount; - try { - Object cAmountObj = configurationSection.get("amount"); - if (cAmountObj instanceof Integer) { - cAmount = ((Integer) cAmountObj).doubleValue(); - } else { - cAmount = (Double) cAmountObj; - } - } catch (Exception e) { - cAmount = 1; - } - String cEquipmentSlot = (String) configurationSection.get("equipmentslot"); - - UUID uuid = null; - if (cUUID != null) { - try { - uuid = UUID.fromString(cUUID); - } catch (Exception ignored) { - // ignored - } - } - EquipmentSlot equipmentSlot = null; - if (cEquipmentSlot != null) { - try { - equipmentSlot = EquipmentSlot.valueOf(cEquipmentSlot); - } catch (Exception ignored) { - // ignored - } - } - AttributeModifier.Operation operation = AttributeModifier.Operation.ADD_NUMBER; - try { - operation = AttributeModifier.Operation.valueOf(cModifierOperation); - } catch (Exception ignored) { - // ignored - } - - AttributeModifier modifier; - if (uuid == null) { - modifier = new AttributeModifier(cModifierName, cAmount, operation); - } else if (equipmentSlot == null) { - modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation); - } else { - modifier = new AttributeModifier(uuid, cModifierName, cAmount, operation, equipmentSlot); - } - - ism.addAttributeModifier(attribute, modifier); - } - } - } - - // item flags - if (!filters.contains(Filter.ITEM_FLAGS)) { - if (config.isSet(path + "itemflags")) { - for (String flag : cItemFlags) { - for (ItemFlag iflag : ItemFlag.values()) { - if (iflag.toString().equals(flag)) { - ism.addItemFlags(iflag); - break; - } - } - } - } - } - - - // unbreakable - if (!filters.contains(Filter.UNBREAKABLE)) { - ism.setUnbreakable(unbreakable); - } - - // enchantments - if (!filters.contains(Filter.ENCHANTMENTS)) { - if (config.isSet(path + "enchantments")) { - for (String key : config.getStringList(path + "enchantments")) { - String[] split = key.split(":"); - if (split.length < 2) { - plugin.getQuestsLogger().debug("Enchantment does not follow format {namespace}:{name}:{level} : " + key); - continue; - } - String namespace = split[0]; - String ench = split[1]; - String levelName; - if (split.length >= 3) { - levelName = split[2]; - } else { - levelName = "1"; - } - - NamespacedKey namespacedKey; - try { - namespacedKey = new NamespacedKey(namespace, ench); - } catch (Exception e) { - plugin.getQuestsLogger().debug("Unrecognised namespace: " + namespace); - continue; - } - Enchantment enchantment; - if ((enchantment = Enchantment.getByKey(namespacedKey)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + namespacedKey); - continue; - } - - int level; - try { - level = Integer.parseInt(levelName); - } catch (NumberFormatException e) { - level = 1; - } - - is.addUnsafeEnchantment(enchantment, level); - } - } - } - - is.setItemMeta(ism); - return is; - } - - @Override - public ItemStack getItemStack(String material, Quests plugin) { - Material type; - try { - type = Material.valueOf(material); - } catch (Exception e) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); - type = Material.STONE; - } - return new ItemStack(type, 1); - } - - @Override - public boolean isValidMaterial(String material) { - try { - Material.valueOf(material); - return true; - } catch (IllegalArgumentException ex) { - return false; - } - } -} diff --git a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java b/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java deleted file mode 100644 index 33389165..00000000 --- a/src/main/java/com/leonardobishop/quests/itemgetter/ItemGetter_Late_1_8.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.leonardobishop.quests.itemgetter; - -import com.leonardobishop.quests.Quests; -import org.apache.commons.lang.StringUtils; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.configuration.ConfigurationSection; -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.Arrays; -import java.util.List; -import java.util.regex.Pattern; - -public class ItemGetter_Late_1_8 implements ItemGetter { - /* - reads the following: - - name - - material (+ DATA) - - lore - - enchantments (NOT NamespacedKey) - - itemflags - - requires at least API version 1.8 (?) - */ - @Override - public ItemStack getItem(String path, ConfigurationSection config, Quests plugin, Filter... excludes) { - if (path != null && !path.equals("")) { - path = path + "."; - } - List filters = Arrays.asList(excludes); - - - String cName = config.getString(path + "name", path + "name"); - String cType = config.getString(path + "item", config.getString(path + "type", path + "item")); - List cLore = config.getStringList(path + "lore"); - List cItemFlags = config.getStringList(path + "itemflags"); - - String name; - Material type = null; - int data = 0; - - // material - ItemStack is = getItemStack(cType, plugin); - ItemMeta ism = is.getItemMeta(); - - // lore - if (!filters.contains(Filter.LORE)) { - List lore = new ArrayList<>(); - if (cLore != null) { - for (String s : cLore) { - lore.add(ChatColor.translateAlternateColorCodes('&', s)); - } - } - ism.setLore(lore); - } - - // name - if (!filters.contains(Filter.DISPLAY_NAME)) { - name = ChatColor.translateAlternateColorCodes('&', cName); - ism.setDisplayName(name); - } - - - // item flags - if (!filters.contains(Filter.ITEM_FLAGS)) { - if (config.isSet(path + "itemflags")) { - for (String flag : cItemFlags) { - for (ItemFlag iflag : ItemFlag.values()) { - if (iflag.toString().equals(flag)) { - ism.addItemFlags(iflag); - break; - } - } - } - } - } - - // enchantments - if (!filters.contains(Filter.ENCHANTMENTS)) { - if (config.isSet(path + "enchantments")) { - for (String key : config.getStringList(path + "enchantments")) { - String[] split = key.split(":"); - String ench = split[0]; - String levelName; - if (split.length >= 2) { - levelName = split[1]; - } else { - levelName = "1"; - } - - Enchantment enchantment; - if ((enchantment = Enchantment.getByName(ench)) == null) { - plugin.getQuestsLogger().debug("Unrecognised enchantment: " + ench); - continue; - } - - int level; - try { - level = Integer.parseInt(levelName); - } catch (NumberFormatException e) { - level = 1; - } - - is.addUnsafeEnchantment(enchantment, level); - } - } - } - - is.setItemMeta(ism); - return is; - } - - - @Override - public ItemStack getItemStack(String material, Quests plugin) { - Material type = null; - int data = 0; - - if (Material.getMaterial(material) != null) { - type = Material.getMaterial(material); - } else if (material.contains(":")) { - String[] parts = material.split(Pattern.quote(":")); - if (parts.length > 1) { - if (Material.getMaterial(parts[0]) != null) { - type = Material.getMaterial(parts[0]); - } - if (StringUtils.isNumeric(parts[1])) { - data = Integer.parseInt(parts[1]); - } - } - } - - if (type == null) { - plugin.getQuestsLogger().debug("Unrecognised material: " + material); - type = Material.STONE; - } - return new ItemStack(type, 1, (short) data); - } - - @Override - public boolean isValidMaterial(String material) { - Material type = null; - - if (Material.getMaterial(material) != null) { - type = Material.getMaterial(material); - } else if (material.contains(":")) { - String[] parts = material.split(Pattern.quote(":")); - if (parts.length > 1) { - if (Material.getMaterial(parts[0]) != null) { - type = Material.getMaterial(parts[0]); - } - } - } - - return !(type == null); - } -} diff --git a/src/main/java/com/leonardobishop/quests/obj/Options.java b/src/main/java/com/leonardobishop/quests/obj/Options.java index 807269bd..b3afc73f 100644 --- a/src/main/java/com/leonardobishop/quests/obj/Options.java +++ b/src/main/java/com/leonardobishop/quests/obj/Options.java @@ -15,6 +15,7 @@ public enum Options { GUI_HIDE_LOCKED("options.gui-hide-locked"), GUI_HIDE_QUESTS_NOPERMISSION("options.gui-hide-quests-nopermission"), GUI_HIDE_CATEGORIES_NOPERMISSION("options.gui-hide-categories-nopermission"), + GUI_USE_PLACEHOLDERAPI("options.gui-use-placeholderapi"), GUITITLE_QUESTS_CATEGORY("options.guinames.quests-category"), GUITITLE_QUESTS("options.guinames.quests-menu"), GUITITLE_DAILY_QUESTS("options.guinames.daily-quests"), diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java b/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java index f7eca148..20bb3eb7 100644 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java +++ b/src/main/java/com/leonardobishop/quests/obj/misc/QItemStack.java @@ -1,9 +1,13 @@ package com.leonardobishop.quests.obj.misc; +import com.leonardobishop.quests.Quests; +import com.leonardobishop.quests.obj.Options; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.player.questprogressfile.QuestProgressFile; import com.leonardobishop.quests.quests.Quest; +import org.bukkit.Bukkit; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -15,12 +19,15 @@ import java.util.regex.Pattern; public class QItemStack { + private final Quests plugin; + private String name; private List loreNormal; private List loreStarted; private ItemStack startingItemStack; - public QItemStack(String name, List loreNormal, List loreStarted, ItemStack startingItemStack) { + public QItemStack(Quests plugin, String name, List loreNormal, List loreStarted, ItemStack startingItemStack) { + this.plugin = plugin; this.name = name; this.loreNormal = loreNormal; this.loreStarted = loreStarted; @@ -66,6 +73,8 @@ public class QItemStack { ism.setDisplayName(name); List formattedLore = new ArrayList<>(); List tempLore = new ArrayList<>(loreNormal); + + Player player = Bukkit.getPlayer(questProgressFile.getPlayerUUID()); if (questProgressFile.hasStartedQuest(quest)) { tempLore.addAll(loreStarted); ism.addEnchant(Enchantment.ARROW_INFINITE, 1, true); @@ -76,6 +85,9 @@ public class QItemStack { } } + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); + } if (questProgress != null) { for (String s : tempLore) { Matcher m = Pattern.compile("\\{([^}]+)}").matcher(s); @@ -95,6 +107,9 @@ public class QItemStack { } } } + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); + } formattedLore.add(s); } } diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java index 703827fd..72445aaf 100644 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java +++ b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCancel.java @@ -77,22 +77,4 @@ public class QMenuCancel implements QMenu { return superMenu; } - public ItemStack replaceItemStack(ItemStack is, Map placeholders) { - ItemStack newItemStack = is.clone(); - List lore = newItemStack.getItemMeta().getLore(); - List newLore = new ArrayList<>(); - ItemMeta ism = newItemStack.getItemMeta(); - if (lore != null) { - for (String s : lore) { - for (Map.Entry entry : placeholders.entrySet()) { - s = s.replace(entry.getKey(), entry.getValue()); - ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); - } - newLore.add(s); - } - } - ism.setLore(newLore); - newItemStack.setItemMeta(ism); - return newItemStack; - } } diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCategory.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCategory.java index 24d708e2..86f4d57f 100644 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCategory.java +++ b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuCategory.java @@ -6,9 +6,12 @@ import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.quests.Category; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.entity.Player; 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; @@ -17,11 +20,13 @@ import java.util.List; */ public class QMenuCategory implements QMenu { + private final Quests plugin; private final int pageSize = 45; private final HashMap slotsToMenuQuest = new HashMap<>(); private final QPlayer owner; - public QMenuCategory(QPlayer owner) { + public QMenuCategory(Quests plugin, QPlayer owner) { + this.plugin = plugin; this.owner = owner; } @@ -61,12 +66,12 @@ public class QMenuCategory implements QMenu { if (slotsToMenuQuest.containsKey(pointer)) { Category category = Quests.get().getQuestManager().getCategoryById(slotsToMenuQuest.get(pointer).getCategoryName()); if (category != null) { - inventory.setItem(pointer, category.getDisplayItem()); + inventory.setItem(pointer, replaceItemStack(category.getDisplayItem())); } } } - inventory.setItem(49, pageIs); + inventory.setItem(49, replaceItemStack(pageIs)); if (Options.TRIM_GUI_SIZE.getBooleanValue() && page == 1) { int slotsUsed = 0; @@ -85,7 +90,7 @@ public class QMenuCategory implements QMenu { Inventory trimmedInventory = Bukkit.createInventory(null, inventorySize, title); for (int slot = 0; slot < pageMax; slot++) { - if (slot >= trimmedInventory.getSize()){ + if (slot >= trimmedInventory.getSize()) { break; } trimmedInventory.setItem(slot, inventory.getItem(slot)); @@ -97,4 +102,25 @@ public class QMenuCategory implements QMenu { } + public ItemStack replaceItemStack(ItemStack is) { + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + ItemStack newItemStack = is.clone(); + List lore = newItemStack.getItemMeta().getLore(); + List newLore = new ArrayList<>(); + ItemMeta ism = newItemStack.getItemMeta(); + Player player = Bukkit.getPlayer(owner.getUuid()); + ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); + if (lore != null) { + for (String s : lore) { + s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); + newLore.add(s); + } + } + ism.setLore(newLore); + newItemStack.setItemMeta(ism); + return newItemStack; + } + return is; + } + } diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuDaily.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuDaily.java index 5277d195..0e0cc132 100644 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuDaily.java +++ b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuDaily.java @@ -99,22 +99,6 @@ public class QMenuDaily implements QMenu { return Bukkit.createInventory(null, 27, title); } - public ItemStack replaceItemStack(ItemStack is, Map placeholders) { - ItemStack newItemStack = is.clone(); - List lore = newItemStack.getItemMeta().getLore(); - List newLore = new ArrayList<>(); - for (String s : lore) { - for (Map.Entry 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; - } - //Implement too public QMenuCategory getSuperMenu() { return this.superMenu; diff --git a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java index 243e08d2..dbaf23ff 100644 --- a/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java +++ b/src/main/java/com/leonardobishop/quests/obj/misc/QMenuQuest.java @@ -7,6 +7,7 @@ import com.leonardobishop.quests.player.QPlayer; import com.leonardobishop.quests.player.questprogressfile.QuestProgress; import com.leonardobishop.quests.quests.Quest; import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -19,6 +20,7 @@ import java.util.concurrent.TimeUnit; */ public class QMenuQuest implements QMenu { + private final Quests plugin; private final HashMap slotsToQuestIds = new HashMap<>(); private final QMenuCategory superMenu; private final String categoryName; @@ -31,7 +33,8 @@ public class QMenuQuest implements QMenu { private int currentPage = -1; private boolean backButtonEnabled = true; - public QMenuQuest(QPlayer owner, String categoryName, QMenuCategory superMenu) { + public QMenuQuest(Quests plugin, QPlayer owner, String categoryName, QMenuCategory superMenu) { + this.plugin = plugin; this.owner = owner; this.categoryName = categoryName; this.superMenu = superMenu; @@ -134,7 +137,8 @@ public class QMenuQuest implements QMenu { ItemStack is = replaceItemStack(Items.QUEST_COOLDOWN.getItem(), placeholders); inventory.setItem(invSlot, is); } else { - inventory.setItem(invSlot, Quests.get().getQuestManager().getQuestById(quest.getId()).getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress)); + inventory.setItem(invSlot, replaceItemStack(Quests.get().getQuestManager().getQuestById( + quest.getId()).getDisplayItem().toItemStack(quest, owner.getQuestProgressFile(), questProgress))); } } invSlot++; @@ -215,20 +219,33 @@ public class QMenuQuest implements QMenu { return superMenu; } + public ItemStack replaceItemStack(ItemStack is) { + return replaceItemStack(is, Collections.emptyMap()); + } + public ItemStack replaceItemStack(ItemStack is, Map placeholders) { ItemStack newItemStack = is.clone(); List lore = newItemStack.getItemMeta().getLore(); List newLore = new ArrayList<>(); ItemMeta ism = newItemStack.getItemMeta(); + Player player = Bukkit.getPlayer(owner.getUuid()); if (lore != null) { for (String s : lore) { for (Map.Entry entry : placeholders.entrySet()) { s = s.replace(entry.getKey(), entry.getValue()); - ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + s = plugin.getPlaceholderAPIHook().replacePlaceholders(player, s); + } } newLore.add(s); } } + for (Map.Entry entry : placeholders.entrySet()) { + ism.setDisplayName(ism.getDisplayName().replace(entry.getKey(), entry.getValue())); + if (plugin.getPlaceholderAPIHook() != null && Options.GUI_USE_PLACEHOLDERAPI.getBooleanValue()) { + ism.setDisplayName(plugin.getPlaceholderAPIHook().replacePlaceholders(player, ism.getDisplayName())); + } + } ism.setLore(newLore); newItemStack.setItemMeta(ism); return newItemStack; diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayer.java b/src/main/java/com/leonardobishop/quests/player/QPlayer.java index 84653040..6c270fa1 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayer.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayer.java @@ -46,7 +46,7 @@ public class QPlayer { } // Using `this` instead of searching again for this QPlayer - QMenuQuest qMenuQuest = new QMenuQuest(this, category.getId(), superMenu); + QMenuQuest qMenuQuest = new QMenuQuest(plugin, this, category.getId(), superMenu); List quests = new ArrayList<>(); for (String questid : category.getRegisteredQuestIds()) { Quest quest = plugin.getQuestManager().getQuestById(questid); @@ -87,10 +87,10 @@ public class QPlayer { } if (Options.CATEGORIES_ENABLED.getBooleanValue()) { - QMenuCategory qMenuCategory = new QMenuCategory(plugin.getPlayerManager().getPlayer(player.getUniqueId())); + QMenuCategory qMenuCategory = new QMenuCategory(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId())); List questMenus = new ArrayList<>(); for (Category category : plugin.getQuestManager().getCategories()) { - QMenuQuest qMenuQuest = new QMenuQuest(plugin.getPlayerManager().getPlayer(player.getUniqueId()), category.getId(), qMenuCategory); + QMenuQuest qMenuQuest = new QMenuQuest(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), category.getId(), qMenuCategory); List quests = new ArrayList<>(); for (String questid : category.getRegisteredQuestIds()) { Quest quest = plugin.getQuestManager().getQuestById(questid); @@ -106,7 +106,7 @@ public class QPlayer { player.openInventory(qMenuCategory.toInventory(1)); EventInventory.track(player.getUniqueId(), qMenuCategory); } else { - QMenuQuest qMenuQuest = new QMenuQuest(plugin.getPlayerManager().getPlayer(player.getUniqueId()), "", null); + QMenuQuest qMenuQuest = new QMenuQuest(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), "", null); List quests = new ArrayList<>(); for (Map.Entry entry : plugin.getQuestManager().getQuests().entrySet()) { quests.add(entry.getValue()); diff --git a/src/main/java/com/leonardobishop/quests/title/Title.java b/src/main/java/com/leonardobishop/quests/title/Title.java deleted file mode 100644 index 232c3b36..00000000 --- a/src/main/java/com/leonardobishop/quests/title/Title.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.leonardobishop.quests.title; - -import org.bukkit.entity.Player; - -public interface Title { - - void sendTitle(Player player, String message, String submessage); -} \ No newline at end of file diff --git a/src/main/java/com/leonardobishop/quests/title/Title_Bukkit.java b/src/main/java/com/leonardobishop/quests/title/Title_Bukkit.java deleted file mode 100644 index d05f815b..00000000 --- a/src/main/java/com/leonardobishop/quests/title/Title_Bukkit.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.leonardobishop.quests.title; - -import org.bukkit.entity.Player; - -public class Title_Bukkit implements Title { - - // new title function with timings - @Override - public void sendTitle(Player player, String message, String submessage) { - player.sendTitle(message, submessage, 10, 100, 10); - } -} diff --git a/src/main/java/com/leonardobishop/quests/title/Title_BukkitNoTimings.java b/src/main/java/com/leonardobishop/quests/title/Title_BukkitNoTimings.java deleted file mode 100644 index 6bbbc32f..00000000 --- a/src/main/java/com/leonardobishop/quests/title/Title_BukkitNoTimings.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.leonardobishop.quests.title; - -import org.bukkit.entity.Player; - -public class Title_BukkitNoTimings implements Title { - - // this one is for 1.8, 1.9 and 1.10 where there was no timings method - @Override - public void sendTitle(Player player, String message, String submessage) { - player.sendTitle(message, submessage); - } - -} diff --git a/src/main/java/com/leonardobishop/quests/title/Title_Other.java b/src/main/java/com/leonardobishop/quests/title/Title_Other.java deleted file mode 100644 index e4e998b9..00000000 --- a/src/main/java/com/leonardobishop/quests/title/Title_Other.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.leonardobishop.quests.title; - -import org.bukkit.entity.Player; - -public class Title_Other implements Title { - - @Override - public void sendTitle(Player player, String message, String submessage) { - // title function does not exist - } -} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index bee451fa..7e6e77d1 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -151,6 +151,8 @@ options: gui-hide-quests-nopermission: false # Hide categories which a player cannot open due to permissions. gui-hide-categories-nopermission: false + # Replace placeholders from PlaceholderAPI in Quests GUI items + gui-use-placeholderapi: false # Make it so players do not have to start quest themselves quest-autostart: false # How much quests should log, 0 = errors only, 1 = warnings, 2 = info, 3 = debug -- cgit v1.2.3-70-g09d2