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

++ * 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 +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 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());