PaperMC/patches/api/0282-More-Enchantment-API.patch
Bjarne Koll bab31b6f55
Update Enchantment damage increase API
The Enchantment damage increase API added previously used the
EntityCategory enum as a parameter. These values are now however
determined by tags instead of the categories themselves.

Deprecated the outdated api method, create a new overload that takes
EntityType instead and implement deprecated method by guessing an entity
type from the builtin registry based on the category passed.
This method allows
a) the tags to still be modified and the legacy
   method still respecting such.
b) potential cursed implementations of enchantments of plugins to not
   break that override the getDamageBonus method on Enchantment.
2024-04-25 18:42:50 +02:00

185 lines
7 KiB
Diff

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 3375ce0f9ac50cd3f145291ceb587d4e6f72569c..a72202b653549b4074feb89748849fcb495ba0d4 100644
--- a/src/main/java/org/bukkit/enchantments/Enchantment.java
+++ b/src/main/java/org/bukkit/enchantments/Enchantment.java
@@ -291,11 +291,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
public abstract boolean isCursed();
/**
@@ -329,6 +325,84 @@ public abstract class Enchantment implements Keyed, Translatable, net.kyori.adve
* @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
+ * @deprecated Use {@link #getDamageIncrease(int, org.bukkit.entity.EntityType)} instead.
+ * Enchantment damage increase is no longer handled via {@link org.bukkit.entity.EntityCategory}s, but
+ * is instead controlled by tags, e.g. {@link org.bukkit.Tag#ENTITY_TYPES_SENSITIVE_TO_BANE_OF_ARTHROPODS}.
+ * As such, a category cannot properly represent all entities defined by the tags.
+ */
+ @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
+ */
+ 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
+ */
+ @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
}