summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--patches/api/0496-Add-AnvilView-bypassEnchantmentLevelRestriction.patch42
-rw-r--r--patches/server/1066-Add-AnvilView-bypassEnchantmentLevelRestriction.patch53
2 files changed, 95 insertions, 0 deletions
diff --git a/patches/api/0496-Add-AnvilView-bypassEnchantmentLevelRestriction.patch b/patches/api/0496-Add-AnvilView-bypassEnchantmentLevelRestriction.patch
new file mode 100644
index 0000000000..f236c650cf
--- /dev/null
+++ b/patches/api/0496-Add-AnvilView-bypassEnchantmentLevelRestriction.patch
@@ -0,0 +1,42 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Doc <[email protected]>
+Date: Sun, 6 Oct 2024 16:45:20 -0300
+Subject: [PATCH] Add AnvilView#bypassEnchantmentLevelRestriction
+
+Anvils, by default, limit applied enchantment levels to their respective
+maximum level. The added API enables plugins to disable this behaviour,
+allowing enchantments that are overleveled to be applied via the anvil.
+
+diff --git a/src/main/java/org/bukkit/inventory/view/AnvilView.java b/src/main/java/org/bukkit/inventory/view/AnvilView.java
+index 0344b3db789baf1da0b59f2d2cd66154b69b38a9..cc5ffd28a6d6244b99a94e52c6f5a0f73a64aed7 100644
+--- a/src/main/java/org/bukkit/inventory/view/AnvilView.java
++++ b/src/main/java/org/bukkit/inventory/view/AnvilView.java
+@@ -59,4 +59,28 @@ public interface AnvilView extends InventoryView {
+ * @param levels the levels to set
+ */
+ void setMaximumRepairCost(int levels);
++
++ // Paper start - bypass anvil level restrictions
++ /**
++ * Returns whether this view will bypass the vanilla enchantment level restriction
++ * when applying enchantments to an item or not.
++ * <p>
++ * By default, vanilla will limit enchantments applied to items to the respective
++ * {@link org.bukkit.enchantments.Enchantment#getMaxLevel()}, even if the applied enchantment itself is above said
++ * limit.
++ * Disabling this limit via {@link AnvilView#bypassEnchantmentLevelRestriction(boolean)} allows for, e.g., enchanted
++ * books to be applied fully, even if their enchantments are beyond the limit.
++ *
++ * @return {@code true} if this view bypasses the vanilla restrictions.
++ */
++ boolean bypassesEnchantmentLevelRestriction();
++
++ /**
++ * Sets if enchantments applied via this anvil view may bypass vanilla's level restrictions.
++ *
++ * @param bypassEnchantmentLevelRestriction if this view bypasses the vanilla level restrictions.
++ * @see AnvilView#bypassesEnchantmentLevelRestriction()
++ */
++ void bypassEnchantmentLevelRestriction(boolean bypassEnchantmentLevelRestriction);
++ // Paper end - bypass anvil level restrictions
+ }
diff --git a/patches/server/1066-Add-AnvilView-bypassEnchantmentLevelRestriction.patch b/patches/server/1066-Add-AnvilView-bypassEnchantmentLevelRestriction.patch
new file mode 100644
index 0000000000..b67e8bea16
--- /dev/null
+++ b/patches/server/1066-Add-AnvilView-bypassEnchantmentLevelRestriction.patch
@@ -0,0 +1,53 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Doc <[email protected]>
+Date: Sun, 6 Oct 2024 16:46:36 -0300
+Subject: [PATCH] Add AnvilView#bypassEnchantmentLevelRestriction
+
+Anvils, by default, limit applied enchantment levels to their respective
+maximum level. The added API enables plugins to disable this behaviour,
+allowing enchantments that are overleveled to be applied via the anvil.
+
+diff --git a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
+index d685511104ac552dfc9ae2111e1bfb60fa812102..362278407679f245ebcea778f2199b357339e1fe 100644
+--- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
++++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
+@@ -53,6 +53,7 @@ public class AnvilMenu extends ItemCombinerMenu {
+ public int maximumRepairCost = 40;
+ private CraftAnvilView bukkitEntity;
+ // CraftBukkit end
++ public boolean bypassEnchantmentLevelRestriction = false; // Paper - bypass anvil level restrictions
+
+ public AnvilMenu(int syncId, Inventory inventory) {
+ this(syncId, inventory, ContainerLevelAccess.NULL);
+@@ -231,7 +232,7 @@ public class AnvilMenu extends ItemCombinerMenu {
+ flag2 = true;
+ } else {
+ flag1 = true;
+- if (i2 > enchantment.getMaxLevel()) {
++ if (i2 > enchantment.getMaxLevel() && !this.bypassEnchantmentLevelRestriction) { // Paper - bypass anvil level restrictions
+ i2 = enchantment.getMaxLevel();
+ }
+
+diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java b/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java
+index e2d8d69c5ae8feb6840462ba8332344972658d83..59f0b1207931a2a10d559f43e2926b17e6991257 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java
+@@ -50,6 +50,18 @@ public class CraftAnvilView extends CraftInventoryView<AnvilMenu> implements Anv
+ this.container.maximumRepairCost = cost;
+ }
+
++ // Paper start
++ @Override
++ public boolean bypassesEnchantmentLevelRestriction() {
++ return this.container.bypassEnchantmentLevelRestriction;
++ }
++
++ @Override
++ public void bypassEnchantmentLevelRestriction(final boolean bypassEnchantmentLevelRestriction) {
++ this.container.bypassEnchantmentLevelRestriction = bypassEnchantmentLevelRestriction;
++ }
++ // Paper end
++
+ public void updateFromLegacy(CraftInventoryAnvil legacy) {
+ if (legacy.isRepairCostSet()) {
+ this.setRepairCost(legacy.getRepairCost());