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

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