diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/magical/EnchantmentRune.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/magical/EnchantmentRune.java index c166b4303..f650cad7b 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/magical/EnchantmentRune.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/magical/EnchantmentRune.java @@ -1,14 +1,18 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.magical; +import java.util.Arrays; import java.util.Collection; -import java.util.HashMap; +import java.util.EnumMap; import java.util.HashSet; +import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ThreadLocalRandom; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.Particle; import org.bukkit.Sound; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Entity; @@ -40,7 +44,7 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; public class EnchantmentRune extends SimpleSlimefunItem { private static final double RANGE = 1.5; - private final HashMap applicableEnchs = new HashMap<>(); + private final Map applicableEnchantments = new EnumMap<>(Material.class); public EnchantmentRune(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { super(category, item, recipeType, recipe); @@ -50,7 +54,7 @@ public class EnchantmentRune extends SimpleSlimefunItem { for (Enchantment ench : Enchantment.values()) { if (ench.canEnchantItem(new ItemStack(mat))) enchSet.add(ench); } - applicableEnchs.put(mat, enchSet.toArray(new Enchantment[0])); + applicableEnchantments.put(mat, enchSet.toArray(new Enchantment[0])); } } @@ -85,15 +89,22 @@ public class EnchantmentRune extends SimpleSlimefunItem { Item entity = (Item) optional.get(); ItemStack target = entity.getItemStack(); - Enchantment[] enchArr = findEnchArr(target.getType()); - if (enchArr.length == 0) return; - int enchIndex = ThreadLocalRandom.current().nextInt(enchArr.length); - Enchantment ench = enchArr[enchIndex]; + List enchantmentSet = Arrays.asList(applicableEnchantments.getOrDefault(target.getType(), new Enchantment[0])); + if (enchantmentSet.size() == 0) return; + //Removing the enchantments that the item already has from enchantmentSet + for (Enchantment enchantment : enchantmentSet) { + for (Enchantment itemEnchantment : target.getEnchantments().keySet()) { + if (enchantment == itemEnchantment) enchantmentSet.remove(enchantment); + } + } + + Enchantment enchantment = enchantmentSet.get(ThreadLocalRandom.current().nextInt(enchantmentSet.size())); int level = 1; - if (ench.getMaxLevel() != 1) level = ThreadLocalRandom.current().nextInt(ench.getMaxLevel() + 1); - - target.addEnchantment(ench, level); + if (enchantment.getMaxLevel() != 1) { + level = ThreadLocalRandom.current().nextInt(enchantment.getMaxLevel() + 1); + } + target.addEnchantment(enchantment, level); if (target.getAmount() == 1) { e.setCancelled(true); @@ -105,8 +116,8 @@ public class EnchantmentRune extends SimpleSlimefunItem { // Being sure entities are still valid and not picked up or whatsoever. if (item.isValid() && entity.isValid() && target.getAmount() == 1) { - l.getWorld().createExplosion(l, 0); - l.getWorld().playSound(l, Sound.ENTITY_GENERIC_EXPLODE, 0.3F, 1); + l.getWorld().spawnParticle(Particle.CRIT_MAGIC, l, 1); + l.getWorld().playSound(l, Sound.ENTITY_ZOMBIE_VILLAGER_CURE, 1F, 1F); entity.remove(); item.remove(); @@ -122,12 +133,6 @@ public class EnchantmentRune extends SimpleSlimefunItem { } } - private Enchantment[] findEnchArr(Material type) { - Enchantment[] enchArr = applicableEnchs.get(type); - if (enchArr == null) enchArr = new Enchantment[0]; - return enchArr; - } - private boolean findCompatibleItem(Entity n) { if (n instanceof Item) { Item item = (Item) n; diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/ResearchSetup.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/ResearchSetup.java index 5590c31db..9b480651e 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/ResearchSetup.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/setup/ResearchSetup.java @@ -267,8 +267,7 @@ public final class ResearchSetup { register("advanced_industrial_miner", 98, "Better Mining", 36, SlimefunItems.ADVANCED_INDUSTRIAL_MINER); register("magical_zombie_pills", 257, "De-Zombification", 22, SlimefunItems.MAGICAL_ZOMBIE_PILLS); register("auto_brewer", 258, "Industrial Brewery", 30, SlimefunItems.AUTO_BREWER); - register("enchantment_rune", 259, "Ancient Enchanting", 24, SlimefunItems.ENCHANTMENT_RUNE); - register("magical_glass", 260, "Magical See-Through", 5, SlimefunItems.MAGICAL_GLASS); + register("enchantment_rune", 259, "Ancient Enchanting", 24, SlimefunItems.MAGICAL_GLASS, SlimefunItems.ENCHANTMENT_RUNE); } private static void register(String key, int id, String name, int defaultCost, ItemStack... items) { diff --git a/src/main/resources/languages/researches_en.yml b/src/main/resources/languages/researches_en.yml index 4c7109749..3b9073a5e 100644 --- a/src/main/resources/languages/researches_en.yml +++ b/src/main/resources/languages/researches_en.yml @@ -235,5 +235,4 @@ slimefun: advanced_industrial_miner: Better Mining magical_zombie_pills: De-Zombification auto_brewer: Industrial Brewery - enchantment_rune: Ancient Enchanting - magical_glass: Magical See-Through \ No newline at end of file + enchantment_rune: Ancient Enchanting \ No newline at end of file