diff --git a/Core/pom.xml b/Core/pom.xml index 11f6598..1aa7dea 100644 --- a/Core/pom.xml +++ b/Core/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.0.3 + 3.3.0.4 4.0.0 @@ -45,27 +45,27 @@ su.nightexpress.excellentenchants NMS - 3.3.0.3 + 3.3.0.4 su.nightexpress.excellentenchants V1_17_R1 - 3.3.0.3 + 3.3.0.4 su.nightexpress.excellentenchants V1_18_R2 - 3.3.0.3 + 3.3.0.4 su.nightexpress.excellentenchants V1_19_R1 - 3.3.0.3 + 3.3.0.4 su.nightexpress.excellentenchants V1_19_R2 - 3.3.0.3 + 3.3.0.4 fr.neatmonster diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ExcellentEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ExcellentEnchant.java index 7d1b016..4070b41 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ExcellentEnchant.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ExcellentEnchant.java @@ -420,6 +420,11 @@ public abstract class ExcellentEnchant extends Enchantment implements IEnchantme return EnchantManager.isEnchantmentFullOfCharges(item, this); } + @Override + public int getCharges(@NotNull ItemStack item) { + return EnchantManager.getEnchantmentCharges(item, this); + } + @Override public void consumeCharges(@NotNull ItemStack item) { EnchantManager.consumeEnchantmentCharges(item, this); diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java index 5fec1c7..962dd98 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java @@ -70,6 +70,8 @@ public interface IEnchantment { boolean isChargesFuel(@NotNull ItemStack item); + int getCharges(@NotNull ItemStack item); + boolean isFullOfCharges(@NotNull ItemStack item); boolean isOutOfCharges(@NotNull ItemStack item); diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantRegrowth.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantRegrowth.java index c7b6773..95cebf0 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantRegrowth.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantRegrowth.java @@ -131,7 +131,11 @@ public class EnchantRegrowth extends ExcellentEnchant implements PassiveEnchant, public void action() { for (LivingEntity entity : this.getEntities()) { EnchantManager.getEquippedEnchants(entity, EnchantRegrowth.class).forEach((item, enchants) -> { - enchants.forEach((enchant, level) -> enchant.onTrigger(entity, item, level)); + enchants.forEach((enchant, level) -> { + if (enchant.onTrigger(entity, item, level)) { + enchant.consumeCharges(item); + } + }); }); } } diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantAnvilListener.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantAnvilListener.java index d302896..1e2e33a 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantAnvilListener.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantAnvilListener.java @@ -19,6 +19,7 @@ import su.nightexpress.excellentenchants.ExcellentEnchantsAPI; import su.nightexpress.excellentenchants.api.enchantment.ExcellentEnchant; import su.nightexpress.excellentenchants.enchantment.EnchantManager; +import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; @@ -56,7 +57,7 @@ public class EnchantAnvilListener extends AbstractListener { private boolean handleRename(@NotNull PrepareAnvilEvent e, @NotNull ItemStack first, @NotNull ItemStack second, @NotNull ItemStack result) { - if (!second.getType().isAir()) return false; + if (!second.getType().isAir() && (second.getType() == first.getType() || second.getType() == Material.ENCHANTED_BOOK)) return false; if (result.getType() != first.getType()) return false; ItemStack result2 = new ItemStack(result); @@ -71,16 +72,22 @@ public class EnchantAnvilListener extends AbstractListener { @NotNull ItemStack first, @NotNull ItemStack second, @NotNull ItemStack result) { if (second.getType().isAir()) return false; - Set chargeable = EnchantManager.getExcellentEnchantments(first).keySet().stream() + Set chargeables = EnchantManager.getExcellentEnchantments(first).keySet().stream() .filter(en -> en.isChargesEnabled() && en.isChargesFuel(second) && !en.isFullOfCharges(first)) .collect(Collectors.toSet()); - if (chargeable.isEmpty()) return false; + if (chargeables.isEmpty()) return false; ItemStack result2 = new ItemStack(first); - chargeable.forEach(enchant -> EnchantManager.rechargeEnchantmentCharges(result2, enchant)); - PDCUtil.setData(result2, RECHARGED, true); + + int count = 0; + while (count < second.getAmount() && !chargeables.stream().allMatch(en -> en.isFullOfCharges(result2))) { + chargeables.forEach(enchant -> EnchantManager.rechargeEnchantmentCharges(result2, enchant)); + count++; + } + + PDCUtil.setData(result2, RECHARGED, count); e.setResult(result2); - this.plugin.runTask(c -> e.getInventory().setRepairCost(chargeable.size()), false); + this.plugin.runTask(c -> e.getInventory().setRepairCost(chargeables.size()), false); return true; } @@ -92,12 +99,14 @@ public class EnchantAnvilListener extends AbstractListener { ItemStack result2 = new ItemStack(result.getType().isAir() ? first : result); Map enchantments = EnchantManager.getExcellentEnchantments(first); + Map charges = new HashMap<>(enchantments.keySet().stream().collect(Collectors.toMap(k -> k, v -> v.getCharges(first)))); AtomicInteger repairCost = new AtomicInteger(e.getInventory().getRepairCost()); // Merge only if it's Item + Item, Item + Enchanted book or Enchanted Book + Enchanted Book if (second.getType() == Material.ENCHANTED_BOOK || second.getType() == first.getType()) { EnchantManager.getExcellentEnchantments(second).forEach((enchant, level) -> { enchantments.merge(enchant, level, (oldLvl, newLvl) -> (oldLvl.equals(newLvl)) ? (Math.min(enchant.getMaxLevel(), oldLvl + 1)) : (Math.max(oldLvl, newLvl))); + charges.merge(enchant, enchant.getCharges(second), Integer::sum); }); } @@ -105,6 +114,7 @@ public class EnchantAnvilListener extends AbstractListener { enchantments.forEach((enchant, level) -> { if (EnchantManager.addEnchantment(result2, enchant, level, false)) { repairCost.addAndGet(enchant.getAnvilMergeCost(level)); + EnchantManager.setEnchantmentCharges(result2, enchant, charges.getOrDefault(enchant, 0)); } }); @@ -123,7 +133,10 @@ public class EnchantAnvilListener extends AbstractListener { if (e.getRawSlot() != 2) return; ItemStack item = e.getCurrentItem(); - if (item == null || !PDCUtil.getBooleanData(item, RECHARGED)) return; + if (item == null) return; + + int count = PDCUtil.getIntData(item, RECHARGED); + if (count == 0) return; Player player = (Player) e.getWhoClicked(); if (player.getLevel() < inventory.getRepairCost()) return; @@ -137,7 +150,7 @@ public class EnchantAnvilListener extends AbstractListener { ItemStack second = inventory.getItem(1); if (second != null && !second.getType().isAir()) { - second.setAmount(second.getAmount() - 1); + second.setAmount(second.getAmount() - count); } inventory.setItem(0, null); //inventory.setItem(1, null); diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/ProtocolHook.java b/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/ProtocolHook.java index 5cd0ee7..600d044 100644 --- a/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/ProtocolHook.java +++ b/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/ProtocolHook.java @@ -84,9 +84,10 @@ public class ProtocolHook { ItemMeta meta = copy.getItemMeta(); if (meta == null) return item; - List lore = meta.getLore() == null ? new ArrayList<>() : meta.getLore(); Map enchants = EnchantManager.getExcellentEnchantments(item); + if (enchants.isEmpty()) return item; + List lore = meta.getLore() == null ? new ArrayList<>() : meta.getLore(); enchants.keySet().forEach(enchant -> lore.removeIf(line -> line.contains(enchant.getDisplayName()))); if (isCreative) { enchants.forEach((enchant, level) -> { diff --git a/NMS/pom.xml b/NMS/pom.xml index 53441d4..44321c5 100644 --- a/NMS/pom.xml +++ b/NMS/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.0.3 + 3.3.0.4 4.0.0 diff --git a/V1_17_R1/pom.xml b/V1_17_R1/pom.xml index f60befc..6399ebd 100644 --- a/V1_17_R1/pom.xml +++ b/V1_17_R1/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.0.3 + 3.3.0.4 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.0.3 + 3.3.0.4 diff --git a/V1_18_R2/pom.xml b/V1_18_R2/pom.xml index 1a202cc..3d0ad72 100644 --- a/V1_18_R2/pom.xml +++ b/V1_18_R2/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.0.3 + 3.3.0.4 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.0.3 + 3.3.0.4 diff --git a/V1_19_R1/pom.xml b/V1_19_R1/pom.xml index 9fa190a..7c2aa0c 100644 --- a/V1_19_R1/pom.xml +++ b/V1_19_R1/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.0.3 + 3.3.0.4 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.0.3 + 3.3.0.4 diff --git a/V1_19_R2/pom.xml b/V1_19_R2/pom.xml index 177f3e2..d34d5bb 100644 --- a/V1_19_R2/pom.xml +++ b/V1_19_R2/pom.xml @@ -5,7 +5,7 @@ ExcellentEnchants su.nightexpress.excellentenchants - 3.3.0.3 + 3.3.0.4 4.0.0 @@ -26,7 +26,7 @@ su.nightexpress.excellentenchants NMS - 3.3.0.3 + 3.3.0.4 diff --git a/pom.xml b/pom.xml index 39bd877..0c6d612 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ su.nightexpress.excellentenchants ExcellentEnchants pom - 3.3.0.3 + 3.3.0.4 Core NMS