PaperMC/patches/api/0273-More-Enchantment-API.patch
2024-06-14 14:07:44 -07:00

222 lines
8.6 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>
Co-authored-by: Janet Blackquill <uhhadd@gmail.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..aec3b41d7c3388e26fa203e3c062f1e6a6d0ba41
--- /dev/null
+++ b/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/src/main/java/org/bukkit/enchantments/Enchantment.java b/src/main/java/org/bukkit/enchantments/Enchantment.java
index daae9bb234d2e10530b2bed35fada98652514e0e..fc30fbffd83285d4ec102a18454ed95289329667 100644
--- a/src/main/java/org/bukkit/enchantments/Enchantment.java
+++ b/src/main/java/org/bukkit/enchantments/Enchantment.java
@@ -290,11 +290,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();
/**
@@ -328,6 +324,116 @@ 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 cost of applying this enchantment using an anvil.
+ * <p>
+ * Note that this is halved when using an enchantment book, and is multiplied by the level of the enchantment.
+ * See <a href="https://minecraft.wiki/w/Anvil_mechanics">https://minecraft.wiki/w/Anvil_mechanics</a> for more information.
+ * </p>
+ * @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<org.bukkit.inventory.EquipmentSlot> getActiveSlots() {
+ final java.util.Set<org.bukkit.inventory.EquipmentSlotGroup> 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<org.bukkit.inventory.EquipmentSlotGroup> getActiveSlotGroups();
// Paper end
// Paper start - mark translation key as deprecated
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
}