From 79f65f6c587e45d4f43eceace6fbbbc4da99fed2 Mon Sep 17 00:00:00 2001 From: MaksyKun <77341370+MaksyKun@users.noreply.github.com> Date: Sun, 26 Jan 2025 00:45:11 +0100 Subject: [PATCH] add enchants into existing items (#283) Co-authored-by: Travja --- .../object/VanillaWrapperListener.java | 24 ++++++++++ .../itemgenerator/ItemGeneratorManager.java | 46 ++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/src/main/java/studio/magemonkey/divinity/manager/listener/object/VanillaWrapperListener.java b/src/main/java/studio/magemonkey/divinity/manager/listener/object/VanillaWrapperListener.java index a582a4d3..b6b22617 100644 --- a/src/main/java/studio/magemonkey/divinity/manager/listener/object/VanillaWrapperListener.java +++ b/src/main/java/studio/magemonkey/divinity/manager/listener/object/VanillaWrapperListener.java @@ -5,12 +5,15 @@ import org.bukkit.entity.*; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; +import org.bukkit.event.enchantment.PrepareItemEnchantEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageModifier; import org.bukkit.event.entity.EntityShootBowEvent; import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; +import org.bukkit.event.inventory.PrepareGrindstoneEvent; import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; import org.bukkit.metadata.FixedMetadataValue; @@ -33,6 +36,7 @@ import studio.magemonkey.divinity.manager.damage.DamageMeta; import studio.magemonkey.divinity.modules.list.arrows.ArrowManager; import studio.magemonkey.divinity.modules.list.arrows.ArrowManager.QArrow; +import studio.magemonkey.divinity.modules.list.itemgenerator.ItemGeneratorManager; import studio.magemonkey.divinity.stats.EntityStats; import studio.magemonkey.divinity.stats.ProjectileStats; import studio.magemonkey.divinity.stats.items.ItemStats; @@ -471,4 +475,24 @@ private static void scaleValuesWithCore(LivingEntity damager, }); } } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onAnvilUse(PrepareAnvilEvent e) { + ItemStack result = e.getResult(); + if (result == null) return; + ItemGeneratorManager.updateGeneratorItemLore(result); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onEnchantingTable(PrepareItemEnchantEvent e) { + ItemStack result = e.getItem(); + ItemGeneratorManager.updateGeneratorItemLore(result); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onGrindStone(PrepareGrindstoneEvent e) { + ItemStack result = e.getResult(); + if (result == null) return; + ItemGeneratorManager.updateGeneratorItemLore(result); + } } diff --git a/src/main/java/studio/magemonkey/divinity/modules/list/itemgenerator/ItemGeneratorManager.java b/src/main/java/studio/magemonkey/divinity/modules/list/itemgenerator/ItemGeneratorManager.java index d1b8f27b..5cc4c40b 100644 --- a/src/main/java/studio/magemonkey/divinity/modules/list/itemgenerator/ItemGeneratorManager.java +++ b/src/main/java/studio/magemonkey/divinity/modules/list/itemgenerator/ItemGeneratorManager.java @@ -10,6 +10,7 @@ import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BlockStateMeta; import org.bukkit.inventory.meta.ItemMeta; @@ -31,6 +32,7 @@ import studio.magemonkey.codex.util.random.Rnd; import studio.magemonkey.divinity.Divinity; import studio.magemonkey.divinity.config.Config; +import studio.magemonkey.divinity.config.EngineCfg; import studio.magemonkey.divinity.hooks.EHook; import studio.magemonkey.divinity.hooks.external.FabledHook; import studio.magemonkey.divinity.modules.EModule; @@ -828,7 +830,8 @@ protected ItemStack build(int itemLvl, int uses, @Nullable ItemType mat) { item.setItemMeta(meta); // Add enchants - int enchRoll = Rnd.get(this.getMinEnchantments(), this.getMaxEnchantments()); + int enchRoll = + Rnd.get(this.getMinEnchantments(), this.getMaxEnchantments()); int enchCount = 0; List> enchants = new ArrayList<>(this.enchantsList.entrySet()); Collections.shuffle(enchants); @@ -1279,4 +1282,45 @@ private static List interpolatePrefixWithAllSuffixes(String modifiedName return names; } + + public static void updateGeneratorItemLore(ItemStack item) { + if (item.getItemMeta() == null) return; + String itemId = Divinity.getInstance().getModuleCache().getTierManager().getItemId(item); + if (itemId == null) return; + ItemGeneratorManager.GeneratorItem reference = + Divinity.getInstance().getModuleCache().getTierManager().getItemById(itemId); + if (reference == null) return; + + ItemMeta meta = item.getItemMeta(); + List lore = meta.getLore(); + if (lore == null) return; + + // Iterate through all enchantments and make sure we delete all existent lore entries + // Note: If there was no %ENCHANTS% before, we add it here since we need it later + for (Enchantment enchantment : Enchantment.values()) { + String value = EngineCfg.LORE_STYLE_ENCHANTMENTS_FORMAT_MAIN + .replace("%name%", Divinity.getInstance().lang().getEnchantment(enchantment)) + .replace("%value%", ""); + lore.removeIf(line -> { + if (!lore.contains("%ENCHANTS%") && line.contains(value)) { + if (lore.contains(line)) + lore.set(lore.indexOf(line), "%ENCHANTS%"); + return false; + } + return line.contains(value); + }); + } + + // If the item had no enchantments before, but the itemflag is no set either, add %ENCHANTS% to the lore with ignored order + if (!lore.contains("%ENCHANTS%") + && !reference.getFlags().contains(ItemFlag.HIDE_ENCHANTS) + && reference.getLore().contains("%ENCHANTS%")) + lore.add("%ENCHANTS%"); + + meta.setLore(lore); + item.setItemMeta(meta); + + // If everythings fine now, the lore should contain %ENCHANTS% which can be replaced by the enchantments now + LoreUT.replaceEnchants(item); + } }