diff --git a/src/main/java/me/dueris/genesismc/enchantments/Anvil.java b/src/main/java/me/dueris/genesismc/enchantments/Anvil.java index e79c28d37..56f027adc 100644 --- a/src/main/java/me/dueris/genesismc/enchantments/Anvil.java +++ b/src/main/java/me/dueris/genesismc/enchantments/Anvil.java @@ -6,7 +6,10 @@ import net.kyori.adventure.text.TextComponent; import net.md_5.bungee.api.chat.BaseComponent; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; import net.minecraft.server.commands.EnchantCommand; +import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.item.enchantment.EnchantmentCategory; import org.bukkit.Bukkit; @@ -15,6 +18,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.craftbukkit.v1_20_R3.CraftRegistry; import org.bukkit.craftbukkit.v1_20_R3.enchantments.CraftEnchantment; +import org.bukkit.craftbukkit.v1_20_R3.entity.CraftPlayer; import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -43,6 +47,66 @@ public class Anvil implements Listener { conflictenchantments.add(Enchantment.PROTECTION_PROJECTILE); } + @EventHandler + public void onAnvil(PrepareAnvilEvent e) { + boolean conflicts = false; + boolean anyNull = true; + if(e.getInventory().getFirstItem() != null && e.getInventory().getSecondItem() != null){ + if(this.containsWaterProt(e.getInventory().getFirstItem()) || this.containsWaterProt(e.getInventory().getSecondItem())){ + Enchantment waterProt = CraftEnchantment.minecraftToBukkit(eimpl); + + for(Enchantment possConf : e.getInventory().getFirstItem().getEnchantments().keySet()){ + if(!conflicts){ + if(!this.isCompatibleWith(((CraftEnchantment)possConf).getHandle())){ + conflicts = true; + e.setResult(null); + } + } + } + for(Enchantment possConf : e.getInventory().getSecondItem().getEnchantments().keySet()){ + if(!conflicts){ + if(!this.isCompatibleWith(((CraftEnchantment)possConf).getHandle())){ + conflicts = true; + e.setResult(null); + } + } + } + } + } + if(!conflicts && e.getInventory().getFirstItem() != null && e.getInventory().getSecondItem() != null){ + // begin anvil calculations. no conflicts and the result != null + if(this.containsWaterProt(e.getInventory().getFirstItem()) || this.containsWaterProt(e.getInventory().getSecondItem())){ + boolean firstContains = this.containsWaterProt(e.getInventory().getFirstItem()); + boolean secondContains = this.containsWaterProt(e.getInventory().getSecondItem()); + if(firstContains && secondContains){ + int firstlvl = e.getInventory().getFirstItem().getItemMeta().getCustomModelData(); + int secondlvl = e.getInventory().getSecondItem().getItemMeta().getCustomModelData(); + int finl = 1; + if(firstlvl > secondlvl){ + finl = firstlvl; + } else if(firstlvl < secondlvl){ + finl = secondlvl; + } else if(firstlvl == secondlvl){ + finl = firstlvl + 1; + } + ItemStack itemStack = new ItemStack(e.getInventory().getFirstItem()); + setWaterProtCustomEnchantLevel(finl, itemStack); + e.setResult(itemStack); + } else if(firstContains && !secondContains){ + int firstlvl = e.getInventory().getFirstItem().getItemMeta().getCustomModelData(); + ItemStack itemStack = new ItemStack(e.getInventory().getFirstItem()); + setWaterProtCustomEnchantLevel(firstlvl, itemStack); + e.setResult(itemStack); + } else if(!firstContains && secondContains){ + int secondlvl = e.getInventory().getSecondItem().getItemMeta().getCustomModelData(); + ItemStack itemStack = new ItemStack(e.getInventory().getFirstItem()); + setWaterProtCustomEnchantLevel(secondlvl, itemStack); + e.setResult(itemStack); + } + } + } + } + private boolean isCompatibleWith(net.minecraft.world.item.enchantment.Enchantment other){ for(org.bukkit.enchantments.Enchantment enchant : Anvil.conflictenchantments){ CraftEnchantment enchantt = (CraftEnchantment) enchant; @@ -72,9 +136,27 @@ public static void setWaterProtCustomEnchantLevel(int lvl, ItemStack item) { meta.lore(lore); // Set the modified lore back to the item meta item.setItemMeta(meta); - - net.minecraft.world.item.ItemStack stack = CraftItemStack.asNMSCopy(item); - stack.enchant(eimpl, lvl); + + net.minecraft.world.item.ItemStack stack = CraftItemStack.unwrap(item); + stack.enchant(BuiltInRegistries.ENCHANTMENT.get(new ResourceLocation("origins", "water_protection")), lvl); + } + + public boolean containsWaterProt(ItemStack item){ + boolean hasModelData = false; + boolean hasCorrectLore = false; + if(item.getItemMeta().hasCustomModelData()){ + if(item.getItemMeta().getCustomModelData() == 1 || item.getItemMeta().getCustomModelData() == 2 || item.getItemMeta().getCustomModelData() == 3 || item.getItemMeta().getCustomModelData() == 4){ + hasModelData = true; + } + } + if(item.getItemMeta().lore() != null){ + for(Component lore : item.getItemMeta().lore()){ + if(lore.asComponent().toString().contains("Water Protection")){ + hasCorrectLore = true; + } + } + } + return hasCorrectLore && hasModelData; } private static String numberToRomanNum(int lvl){