From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Jake Potrebic <jake.m.potrebic@gmail.com>
Date: Thu, 6 May 2021 19:58:03 -0700
Subject: [PATCH] More Enchantment API

Co-authored-by: Luis <luisc99@icloud.com>

diff --git a/src/main/java/io/papermc/paper/enchantments/EnchantmentRarity.java b/src/main/java/io/papermc/paper/enchantments/EnchantmentRarity.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6a40c1fcea761bd66743b50e3da3d14797d05b0
--- /dev/null
+++ b/src/main/java/io/papermc/paper/enchantments/EnchantmentRarity.java
@@ -0,0 +1,24 @@
+package io.papermc.paper.enchantments;
+
+public enum EnchantmentRarity {
+
+    COMMON(10),
+    UNCOMMON(5),
+    RARE(2),
+    VERY_RARE(1);
+
+    private final int weight;
+
+    EnchantmentRarity(int weight) {
+        this.weight = weight;
+    }
+
+    /**
+     * Gets the weight for the rarity.
+     *
+     * @return the weight
+     */
+    public int getWeight() {
+        return weight;
+    }
+}
diff --git a/src/main/java/org/bukkit/enchantments/Enchantment.java b/src/main/java/org/bukkit/enchantments/Enchantment.java
index 4a88198be6634b47fc51e55acc5f6415e4aff1ab..d50d4c3121a966adcc47173ddb4575f7ad504148 100644
--- a/src/main/java/org/bukkit/enchantments/Enchantment.java
+++ b/src/main/java/org/bukkit/enchantments/Enchantment.java
@@ -269,11 +269,7 @@ public abstract class Enchantment implements Keyed, net.kyori.adventure.translat
      * Cursed enchantments are found the same way treasure enchantments are
      *
      * @return true if the enchantment is cursed
-     * @deprecated cursed enchantments are no longer special. Will return true
-     * only for {@link Enchantment#BINDING_CURSE} and
-     * {@link Enchantment#VANISHING_CURSE}.
      */
-    @Deprecated
     public abstract boolean isCursed();
 
     /**
@@ -307,6 +303,70 @@ public abstract class Enchantment implements Keyed, net.kyori.adventure.translat
      * @return the name of the enchantment with {@code level} applied
      */
     public abstract net.kyori.adventure.text.@NotNull Component displayName(int level);
+
+    /**
+     * Checks if this enchantment can be found in villager trades.
+     *
+     * @return true if the enchantment can be found in trades
+     */
+    public abstract boolean isTradeable();
+
+    /**
+     * Checks if this enchantment can be found in an enchanting table
+     * or use to enchant items generated by loot tables.
+     *
+     * @return true if the enchantment can be found in a table or by loot tables
+     */
+    public abstract boolean isDiscoverable();
+
+    /**
+     * Gets the minimum modified cost of this enchantment at a specific level.
+     * <p>
+     * Note this is not the number of experience levels needed, and does not directly translate to the levels shown in an enchanting table.
+     * This value is used in combination with factors such as tool enchantability to determine a final cost.
+     * See <a href="https://minecraft.wiki/w/Enchanting/Levels">https://minecraft.wiki/w/Enchanting/Levels</a> for more information.
+     * </p>
+     * @param level The level of the enchantment
+     * @return The modified cost of this enchantment
+     */
+    public abstract int getMinModifiedCost(int level);
+
+    /**
+     * Gets the maximum modified cost of this enchantment at a specific level.
+     * <p>
+     * Note this is not the number of experience levels needed, and does not directly translate to the levels shown in an enchanting table.
+     * This value is used in combination with factors such as tool enchantability to determine a final cost.
+     * See <a href="https://minecraft.wiki/w/Enchanting/Levels">https://minecraft.wiki/w/Enchanting/Levels</a> for more information.
+     * </p>
+     * @param level The level of the enchantment
+     * @return The modified cost of this enchantment
+     */
+    public abstract int getMaxModifiedCost(int level);
+
+    /**
+     * Gets the rarity of this enchantment.
+     *
+     * @return the rarity
+     */
+    @NotNull
+    public abstract io.papermc.paper.enchantments.EnchantmentRarity getRarity();
+
+    /**
+     * Gets the damage increase as a result of the level and entity category specified
+     *
+     * @param level the level of enchantment
+     * @param entityCategory the category of entity
+     * @return the damage increase
+     */
+    public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityCategory entityCategory);
+
+    /**
+     * Gets the equipment slots where this enchantment is considered "active".
+     *
+     * @return the equipment slots
+     */
+    @NotNull
+    public abstract java.util.Set<org.bukkit.inventory.EquipmentSlot> getActiveSlots();
     // Paper end
 
     /**
diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
index ac0371285370594d4de1554871b19bbcd2311730..da5d153a3e55a38b767359564001ad8663f9730b 100644
--- a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
+++ b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java
@@ -31,5 +31,42 @@ public abstract class EnchantmentWrapper extends Enchantment {
     public @NotNull String translationKey() {
         return getEnchantment().translationKey();
     }
+
+    @Override
+    public boolean isTradeable() {
+        return getEnchantment().isTradeable();
+    }
+
+    @Override
+    public boolean isDiscoverable() {
+        return getEnchantment().isDiscoverable();
+    }
+
+    @Override
+    public int getMinModifiedCost(int level) {
+        return getEnchantment().getMinModifiedCost(level);
+    }
+
+    @Override
+    public int getMaxModifiedCost(int level) {
+        return getEnchantment().getMaxModifiedCost(level);
+    }
+
+    @NotNull
+    @Override
+    public io.papermc.paper.enchantments.EnchantmentRarity getRarity() {
+        return getEnchantment().getRarity();
+    }
+
+    @Override
+    public float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityCategory entityCategory) {
+        return getEnchantment().getDamageIncrease(level, entityCategory);
+    }
+
+    @NotNull
+    @Override
+    public java.util.Set<org.bukkit.inventory.EquipmentSlot> getActiveSlots() {
+        return getEnchantment().getActiveSlots();
+    }
     // Paper end
 }