diff --git a/MMOItems-API/pom.xml b/MMOItems-API/pom.xml index eebb6233..eeaa37af 100644 --- a/MMOItems-API/pom.xml +++ b/MMOItems-API/pom.xml @@ -197,11 +197,11 @@ provided true - + - n3kas + net.advancedplugins ae.api - 5.7.6 + 8.7.4 provided true diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/build/LoreBuilder.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/build/LoreBuilder.java index 6b6f74ef..92b9a1ff 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/build/LoreBuilder.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/api/item/build/LoreBuilder.java @@ -56,6 +56,17 @@ public class LoreBuilder extends Buildable> { lore.add(index, element); } + /** + * Inserts specific lines at a specific index in the item lore. + * Used by custom enchantment plugins to add enchant display to item lore. + * + * @param index Index of insertion + * @param elements Strings to insert + */ + public void insert(int index, @NotNull Collection elements) { + lore.addAll(index, elements); + } + /** * Inserts a list of strings in the item lore. The lines are added only if a * line #item-stat-id# can be found in the lore format. diff --git a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/enchants/advanced_enchants/AdvancedEnchantsStat.java b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/enchants/advanced_enchants/AdvancedEnchantsStat.java index 5af50906..09f33af2 100644 --- a/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/enchants/advanced_enchants/AdvancedEnchantsStat.java +++ b/MMOItems-API/src/main/java/net/Indyuce/mmoitems/comp/enchants/advanced_enchants/AdvancedEnchantsStat.java @@ -3,74 +3,69 @@ package net.Indyuce.mmoitems.comp.enchants.advanced_enchants; import io.lumine.mythic.lib.api.item.ItemTag; import io.lumine.mythic.lib.api.item.SupportedNBTTagValues; import io.lumine.mythic.lib.api.util.ui.SilentNumbers; +import io.lumine.mythic.lib.util.annotation.BackwardsCompatibility; import io.lumine.mythic.lib.version.VersionMaterial; import net.Indyuce.mmoitems.api.item.build.ItemStackBuilder; import net.Indyuce.mmoitems.api.item.mmoitem.ReadMMOItem; import net.Indyuce.mmoitems.gui.edition.EditionInventory; import net.Indyuce.mmoitems.stat.data.random.RandomStatData; -import net.Indyuce.mmoitems.stat.data.type.StatData; import net.Indyuce.mmoitems.stat.type.InternalStat; import net.Indyuce.mmoitems.stat.type.ItemStat; -import net.advancedplugins.ae.enchanthandler.enchantments.AEnchants; -import net.advancedplugins.ae.enchanthandler.enchantments.AdvancedEnchantment; +import net.advancedplugins.ae.api.AEAPI; +import org.apache.commons.lang3.Validate; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -import java.util.Map; import java.util.Optional; /** * List of enchantments in an item yes */ public class AdvancedEnchantsStat extends ItemStat, AdvancedEnchantMap> implements InternalStat { + private final Plugin ae; + private final String aeNamespace; + public AdvancedEnchantsStat() { super("ADVANCED_ENCHANTS", VersionMaterial.EXPERIENCE_BOTTLE.toMaterial(), "Advanced Enchants", new String[]{"The AEnchants of this item. Format:", "\u00a7e[internal_name] [level]"}, new String[]{"!miscellaneous", "!block", "all"}); + + ae = Bukkit.getPluginManager().getPlugin("AdvancedEnchantments"); + Validate.notNull(ae, "Could not find plugin AdvancedEnchants"); + aeNamespace = new NamespacedKey(ae, "any").getNamespace(); } @Override - public RandomStatData whenInitialized(Object object) { + public RandomStatData whenInitialized(Object object) { throw new RuntimeException("Not supported"); } @Override public void whenApplied(@NotNull ItemStackBuilder item, @NotNull AdvancedEnchantMap data) { - // Do that - Map aes = data.enchants; - // Enchant the item - for (String ench : aes.keySet()) { - - Integer lvl = aes.get(ench); + data.enchants.forEach((ench, lvl) -> { // Skip trash - if (ench == null || lvl == null || ench.isEmpty()) - continue; - - // Find the actual enchantment and include lore - AdvancedEnchantment instance = AEnchants.matchEnchant(ench); - if (instance == null) - return; + if (ench == null || lvl == null || ench.isEmpty()) return; // Add lore and tag - item.getLore().insert(0, instance.getDisplay(lvl)); - item.addItemTag(getEnchantTag(ench, lvl)); - } + item.getLore().insert(0, AEAPI.getEnchantLore(ench, lvl)); + item.getMeta().getPersistentDataContainer().set(new NamespacedKey(ae, AE_KEY_PREFIX + ench), PersistentDataType.INTEGER, lvl); + }); } @NotNull @Override public ArrayList getAppliedNBT(@NotNull AdvancedEnchantMap data) { - ArrayList array = new ArrayList<>(); - Map aes = ((AdvancedEnchantMap) data).enchants; - - for (String ench : aes.keySet()) - array.add(getEnchantTag(ench, aes.get(ench))); - - return array; + // Stat history is not supported + return new ArrayList<>(); } @Override @@ -94,74 +89,50 @@ public class AdvancedEnchantsStat extends ItemStat relevantTags = new ArrayList<>(); + final AdvancedEnchantMap enchants = new AdvancedEnchantMap(); + + // Backwards compatibility for (String tag : mmoitem.getNBT().getTags()) { + if (tag == null) continue; + if (!tag.startsWith(LEGACY_AE_KEY_PREFIX)) continue; - // Valid tag? - if (tag == null) { - continue; - } - if (tag.startsWith(AE_TAG)) { - - ItemTag thatTag = ItemTag.getTagAtPath(tag, mmoitem.getNBT(), SupportedNBTTagValues.DOUBLE); - - // Not null? - if (thatTag != null) { - - relevantTags.add(new ItemTag(tag, SilentNumbers.round((Double) thatTag.getValue()))); - } - } + final String enchantTag = tag.substring(LEGACY_AE_KEY_PREFIX.length()); + final int lvl = mmoitem.getNBT().getInteger(tag); + enchants.enchants.put(enchantTag, lvl); } - // Generate data - StatData data = getLoadedNBT(relevantTags); + for (NamespacedKey nsk : meta.getPersistentDataContainer().getKeys()) { + if (!nsk.getNamespace().equals(aeNamespace)) continue; - // Valid? - if (data != null) + final String tag = nsk.getKey(); + if (!tag.startsWith(AE_KEY_PREFIX)) continue; - // This data has the enchantments that used to be stored in the item. - mmoitem.setData(this, data); + final Integer lvlInteger = meta.getPersistentDataContainer().get(nsk, PersistentDataType.INTEGER); + if (lvlInteger == null || lvlInteger == 0) continue; + + final String enchantTag = tag.substring(AE_KEY_PREFIX.length()); + enchants.enchants.put(enchantTag, lvlInteger); + } + + // Not empty? + if (!enchants.enchants.isEmpty()) mmoitem.setData(this, enchants); } @Nullable @Override public AdvancedEnchantMap getLoadedNBT(@NotNull ArrayList storedTags) { - AdvancedEnchantMap enchants = new AdvancedEnchantMap(); - - // Yes - for (ItemTag tag : storedTags) { - if (tag == null || !(tag.getValue() instanceof Integer)) - continue; - - // Path must be valid - int spc = tag.getPath().indexOf(AE_TAG + ";"); - if (spc < 0) - continue; - - // Crop - String enchantment = tag.getPath().substring(AE_TAG.length() + 1 + spc); - int value = (int) tag.getValue(); - - // Save enchant in map - enchants.enchants.put(enchantment, value); - } - - // Thats it - return enchants.enchants.size() == 0 ? null : enchants; + // Stat history is not supported + return null; } }