From a0cb2d37ed76068aca205fc0bb2ea9c195a4bd8f Mon Sep 17 00:00:00 2001
From: Pedro <3602279+Doc94@users.noreply.github.com>
Date: Sat, 12 Oct 2024 18:10:05 -0300
Subject: [PATCH] Add AnvilView#bypassEnchantmentLevelRestriction (#11475)

---
 ...ew-bypassEnchantmentLevelRestriction.patch | 42 +++++++++++++++
 ...ew-bypassEnchantmentLevelRestriction.patch | 53 +++++++++++++++++++
 2 files changed, 95 insertions(+)
 create mode 100644 patches/api/Add-AnvilView-bypassEnchantmentLevelRestriction.patch
 create mode 100644 patches/server/Add-AnvilView-bypassEnchantmentLevelRestriction.patch

diff --git a/patches/api/Add-AnvilView-bypassEnchantmentLevelRestriction.patch b/patches/api/Add-AnvilView-bypassEnchantmentLevelRestriction.patch
new file mode 100644
index 0000000000..86313f638a
--- /dev/null
+++ b/patches/api/Add-AnvilView-bypassEnchantmentLevelRestriction.patch
@@ -0,0 +1,42 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Doc <nachito94@msn.com>
+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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/inventory/view/AnvilView.java
++++ b/src/main/java/org/bukkit/inventory/view/AnvilView.java
+@@ -0,0 +0,0 @@ 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/Add-AnvilView-bypassEnchantmentLevelRestriction.patch b/patches/server/Add-AnvilView-bypassEnchantmentLevelRestriction.patch
new file mode 100644
index 0000000000..ec86441507
--- /dev/null
+++ b/patches/server/Add-AnvilView-bypassEnchantmentLevelRestriction.patch
@@ -0,0 +1,53 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Doc <nachito94@msn.com>
+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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
++++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
+@@ -0,0 +0,0 @@ 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);
+@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java
++++ b/src/main/java/org/bukkit/craftbukkit/inventory/view/CraftAnvilView.java
+@@ -0,0 +0,0 @@ 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());