From bff47948671177465cb8fc0302189fd9a2cced55 Mon Sep 17 00:00:00 2001 From: Jake Potrebic Date: Thu, 6 May 2021 19:58:03 -0700 Subject: [PATCH] More Enchantment API Co-authored-by: Luis Co-authored-by: Janet Blackquill --- .../paper/enchantments/EnchantmentRarity.java | 28 +++++ .../org/bukkit/enchantments/Enchantment.java | 116 +++++++++++++++++- .../enchantments/EnchantmentWrapper.java | 37 ++++++ 3 files changed, 177 insertions(+), 4 deletions(-) create mode 100644 paper-api/src/main/java/io/papermc/paper/enchantments/EnchantmentRarity.java diff --git a/paper-api/src/main/java/io/papermc/paper/enchantments/EnchantmentRarity.java b/paper-api/src/main/java/io/papermc/paper/enchantments/EnchantmentRarity.java new file mode 100644 index 0000000000..aec3b41d7c --- /dev/null +++ b/paper-api/src/main/java/io/papermc/paper/enchantments/EnchantmentRarity.java @@ -0,0 +1,28 @@ +package io.papermc.paper.enchantments; + +/** + * @deprecated Enchantments do not have a "rarity" since 1.20.5 + */ +@Deprecated(forRemoval = true, since = "1.20.5") +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/paper-api/src/main/java/org/bukkit/enchantments/Enchantment.java b/paper-api/src/main/java/org/bukkit/enchantments/Enchantment.java index 72251952e7..fa20a0f13b 100644 --- a/paper-api/src/main/java/org/bukkit/enchantments/Enchantment.java +++ b/paper-api/src/main/java/org/bukkit/enchantments/Enchantment.java @@ -284,11 +284,7 @@ public abstract class Enchantment implements Keyed, Translatable, net.kyori.adve * 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(since = "1.13") public abstract boolean isCursed(); /** @@ -324,6 +320,118 @@ public abstract class Enchantment implements Keyed, Translatable, net.kyori.adve public abstract net.kyori.adventure.text.@NotNull Component displayName(int level); // Paper end + // Paper start - more Enchantment API + /** + * 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. + *

+ * 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 https://minecraft.wiki/w/Enchanting/Levels for more information. + *

+ * @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. + *

+ * 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 https://minecraft.wiki/w/Enchanting/Levels for more information. + *

+ * @param level The level of the enchantment + * @return The modified cost of this enchantment + */ + public abstract int getMaxModifiedCost(int level); + + /** + * Gets cost of applying this enchantment using an anvil. + *

+ * Note that this is halved when using an enchantment book, and is multiplied by the level of the enchantment. + * See https://minecraft.wiki/w/Anvil_mechanics for more information. + *

+ * @return The anvil cost of this enchantment + */ + public abstract int getAnvilCost(); + + /** + * Gets the rarity of this enchantment. + * + * @return the rarity + * @deprecated As of 1.20.5 enchantments do not have a rarity. + */ + @NotNull + @Deprecated(forRemoval = true, since = "1.20.5") + @Contract("-> fail") + 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 + * @deprecated Enchantments now have a complex effect systems that cannot be reduced to a simple damage increase. + */ + @Contract("_, _ -> fail") + @Deprecated(forRemoval = true, since = "1.20.5") + public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityCategory entityCategory); + + /** + * Gets the damage increase as a result of the level and entity type specified + * + * @param level the level of enchantment + * @param entityType the type of entity. + * @return the damage increase + * @deprecated Enchantments now have a complex effect systems that cannot be reduced to a simple damage increase. + */ + @Contract("_, _ -> fail") + @Deprecated(forRemoval = true, since = "1.21") + public abstract float getDamageIncrease(int level, @NotNull org.bukkit.entity.EntityType entityType); + + /** + * Gets the equipment slots where this enchantment is considered "active". + * + * @return the equipment slots + * @deprecated Use {@link #getActiveSlotGroups()} instead as enchantments are now applicable to a group of equipment slots. + */ + @NotNull + @Deprecated(forRemoval = true, since = "1.21") + public java.util.Set getActiveSlots() { + final java.util.Set slots = this.getActiveSlotGroups(); + return java.util.Arrays.stream(org.bukkit.inventory.EquipmentSlot.values()).filter(e -> { + for (final org.bukkit.inventory.EquipmentSlotGroup group : slots) { + if (group.test(e)) return true; + } + return false; + }).collect(java.util.stream.Collectors.toSet()); + } + + /** + * Gets the equipment slots where this enchantment is considered "active". + * + * @return the equipment slots + */ + @NotNull + public abstract java.util.Set getActiveSlotGroups(); + // Paper end - more Enchantment API + // Paper start - mark translation key as deprecated /** * @deprecated this method assumes that the enchantments description diff --git a/paper-api/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/paper-api/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java index f4422da4eb..ca3b2f9be7 100644 --- a/paper-api/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java +++ b/paper-api/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 getActiveSlots() { + return getEnchantment().getActiveSlots(); + } // Paper end }