diff --git a/docs/source/configuration.rst b/docs/source/configuration.rst index 8d8d84444..6e8e52569 100644 --- a/docs/source/configuration.rst +++ b/docs/source/configuration.rst @@ -112,6 +112,14 @@ packet-limiter - **default**: "Sent too many packets" - **description**: The message player sees when being kicked from packet limiter +* enchantment + * + * max-level + - **default**: 1 through 5 + - **description**: Maximum level the enchantment can be +.. note:: + Enchantment level lore is rendered client side. Levels above 11 do not have a lang entry in the locale file. Use a resource pack to overcome this. + blocks ~~~~~~ * barrel diff --git a/patches/api/0033-Configurable-enchantment-max-level.patch b/patches/api/0033-Configurable-enchantment-max-level.patch new file mode 100644 index 000000000..3effbff1b --- /dev/null +++ b/patches/api/0033-Configurable-enchantment-max-level.patch @@ -0,0 +1,51 @@ +From 6d7f676b7f8b78017aae8671972c1fcaf6a92b0b Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Wed, 1 Apr 2020 19:18:29 -0500 +Subject: [PATCH] Configurable enchantment max level + +--- + src/main/java/org/bukkit/enchantments/Enchantment.java | 9 +++++++++ + .../java/org/bukkit/enchantments/EnchantmentWrapper.java | 7 +++++++ + 2 files changed, 16 insertions(+) + +diff --git a/src/main/java/org/bukkit/enchantments/Enchantment.java b/src/main/java/org/bukkit/enchantments/Enchantment.java +index d1885f178..b277428d6 100644 +--- a/src/main/java/org/bukkit/enchantments/Enchantment.java ++++ b/src/main/java/org/bukkit/enchantments/Enchantment.java +@@ -232,6 +232,15 @@ public abstract class Enchantment implements Keyed { + */ + public abstract int getMaxLevel(); + ++ // Purpur start ++ /** ++ * Sets the maximum level that this Enchantment may become. ++ * ++ * @param maxLevel Maximum level of the Enchantment ++ */ ++ public abstract void setMaxLevel(int maxLevel); ++ // Purpur end ++ + /** + * Gets the level that this Enchantment should start at + * +diff --git a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java +index 9566e4306..67e31fee3 100644 +--- a/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java ++++ b/src/main/java/org/bukkit/enchantments/EnchantmentWrapper.java +@@ -27,6 +27,13 @@ public class EnchantmentWrapper extends Enchantment { + return getEnchantment().getMaxLevel(); + } + ++ // Purpur start ++ @Override ++ public void setMaxLevel(int maxLevel) { ++ getEnchantment().setMaxLevel(maxLevel); ++ } ++ // Purpur end ++ + @Override + public int getStartLevel() { + return getEnchantment().getStartLevel(); +-- +2.24.0 + diff --git a/patches/server/0115-Configurable-enchantment-max-level.patch b/patches/server/0115-Configurable-enchantment-max-level.patch new file mode 100644 index 000000000..fb3c6a6b8 --- /dev/null +++ b/patches/server/0115-Configurable-enchantment-max-level.patch @@ -0,0 +1,788 @@ +From c401fe87188ba7b2328ee37f8acd6479d6a8fb58 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Wed, 1 Apr 2020 17:21:42 -0500 +Subject: [PATCH] Configurable enchantment max level + +--- + src/main/java/net/minecraft/server/Enchantment.java | 12 ++++++++++-- + .../net/minecraft/server/EnchantmentArrowDamage.java | 6 +----- + .../minecraft/server/EnchantmentArrowKnockback.java | 6 +----- + .../net/minecraft/server/EnchantmentBinding.java | 6 +----- + .../minecraft/server/EnchantmentDepthStrider.java | 6 +----- + .../net/minecraft/server/EnchantmentDigging.java | 6 +----- + .../net/minecraft/server/EnchantmentDurability.java | 6 +----- + .../java/net/minecraft/server/EnchantmentFire.java | 6 +----- + .../net/minecraft/server/EnchantmentFlameArrows.java | 6 +----- + .../net/minecraft/server/EnchantmentFrostWalker.java | 6 +----- + .../minecraft/server/EnchantmentInfiniteArrows.java | 6 +----- + .../net/minecraft/server/EnchantmentKnockback.java | 6 +----- + .../net/minecraft/server/EnchantmentLootBonus.java | 6 +----- + .../java/net/minecraft/server/EnchantmentLure.java | 6 +----- + .../net/minecraft/server/EnchantmentMending.java | 6 +----- + .../net/minecraft/server/EnchantmentMultishot.java | 6 +----- + .../java/net/minecraft/server/EnchantmentOxygen.java | 6 +----- + .../net/minecraft/server/EnchantmentPiercing.java | 6 +----- + .../net/minecraft/server/EnchantmentProtection.java | 7 +------ + .../net/minecraft/server/EnchantmentQuickCharge.java | 6 +----- + .../net/minecraft/server/EnchantmentSilkTouch.java | 6 +----- + .../net/minecraft/server/EnchantmentSweeping.java | 6 +----- + .../java/net/minecraft/server/EnchantmentThorns.java | 6 +----- + .../server/EnchantmentTridentChanneling.java | 6 +----- + .../minecraft/server/EnchantmentTridentImpaling.java | 6 +----- + .../minecraft/server/EnchantmentTridentLoyalty.java | 6 +----- + .../minecraft/server/EnchantmentTridentRiptide.java | 6 +----- + .../net/minecraft/server/EnchantmentVanishing.java | 6 +----- + .../net/minecraft/server/EnchantmentWaterWorker.java | 6 +----- + .../minecraft/server/EnchantmentWeaponDamage.java | 6 +----- + src/main/java/net/pl3x/purpur/PurpurConfig.java | 10 ++++++++++ + .../craftbukkit/enchantments/CraftEnchantment.java | 7 +++++++ + 32 files changed, 56 insertions(+), 148 deletions(-) + +diff --git a/src/main/java/net/minecraft/server/Enchantment.java b/src/main/java/net/minecraft/server/Enchantment.java +index 70cd4a4837..0ab96ea34e 100644 +--- a/src/main/java/net/minecraft/server/Enchantment.java ++++ b/src/main/java/net/minecraft/server/Enchantment.java +@@ -44,9 +44,17 @@ public abstract class Enchantment { + return 1; + } + +- public int getMaxLevel() { +- return 1; ++ // Purpur start ++ private int maxLevel = 1; ++ ++ public final int getMaxLevel() { ++ return maxLevel; ++ } ++ ++ public final void setMaxLevel(int maxLevel) { ++ this.maxLevel = maxLevel; + } ++ // Purpur end + + public int a(int i) { + return 1 + i * 10; +diff --git a/src/main/java/net/minecraft/server/EnchantmentArrowDamage.java b/src/main/java/net/minecraft/server/EnchantmentArrowDamage.java +index ffa1d19cb9..1040e7e08b 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentArrowDamage.java ++++ b/src/main/java/net/minecraft/server/EnchantmentArrowDamage.java +@@ -4,6 +4,7 @@ public class EnchantmentArrowDamage extends Enchantment { + + public EnchantmentArrowDamage(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.BOW, aenumitemslot); ++ setMaxLevel(5); // Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentArrowDamage extends Enchantment { + public int b(int i) { + return this.a(i) + 15; + } +- +- @Override +- public int getMaxLevel() { +- return 5; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentArrowKnockback.java b/src/main/java/net/minecraft/server/EnchantmentArrowKnockback.java +index 9103f3c614..67f487b9e4 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentArrowKnockback.java ++++ b/src/main/java/net/minecraft/server/EnchantmentArrowKnockback.java +@@ -4,6 +4,7 @@ public class EnchantmentArrowKnockback extends Enchantment { + + public EnchantmentArrowKnockback(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.BOW, aenumitemslot); ++ setMaxLevel(2); // Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentArrowKnockback extends Enchantment { + public int b(int i) { + return this.a(i) + 25; + } +- +- @Override +- public int getMaxLevel() { +- return 2; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentBinding.java b/src/main/java/net/minecraft/server/EnchantmentBinding.java +index b49154b13e..ec4dad3cf2 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentBinding.java ++++ b/src/main/java/net/minecraft/server/EnchantmentBinding.java +@@ -4,6 +4,7 @@ public class EnchantmentBinding extends Enchantment { + + public EnchantmentBinding(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.WEARABLE, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentBinding extends Enchantment { + return 50; + } + +- @Override +- public int getMaxLevel() { +- return 1; +- } +- + @Override + public boolean isTreasure() { + return true; +diff --git a/src/main/java/net/minecraft/server/EnchantmentDepthStrider.java b/src/main/java/net/minecraft/server/EnchantmentDepthStrider.java +index 669fbd2685..07d566cd9e 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentDepthStrider.java ++++ b/src/main/java/net/minecraft/server/EnchantmentDepthStrider.java +@@ -4,6 +4,7 @@ public class EnchantmentDepthStrider extends Enchantment { + + public EnchantmentDepthStrider(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.ARMOR_FEET, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentDepthStrider extends Enchantment { + return this.a(i) + 15; + } + +- @Override +- public int getMaxLevel() { +- return 3; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return super.a(enchantment) && enchantment != Enchantments.FROST_WALKER; +diff --git a/src/main/java/net/minecraft/server/EnchantmentDigging.java b/src/main/java/net/minecraft/server/EnchantmentDigging.java +index 798b3c250c..16a7c38bc0 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentDigging.java ++++ b/src/main/java/net/minecraft/server/EnchantmentDigging.java +@@ -4,6 +4,7 @@ public class EnchantmentDigging extends Enchantment { + + protected EnchantmentDigging(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.DIGGER, aenumitemslot); ++ setMaxLevel(5); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentDigging extends Enchantment { + return super.a(i) + 50; + } + +- @Override +- public int getMaxLevel() { +- return 5; +- } +- + @Override + public boolean canEnchant(ItemStack itemstack) { + return itemstack.getItem() == Items.SHEARS ? true : super.canEnchant(itemstack); +diff --git a/src/main/java/net/minecraft/server/EnchantmentDurability.java b/src/main/java/net/minecraft/server/EnchantmentDurability.java +index c946326fbc..6deccef554 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentDurability.java ++++ b/src/main/java/net/minecraft/server/EnchantmentDurability.java +@@ -6,6 +6,7 @@ public class EnchantmentDurability extends Enchantment { + + protected EnchantmentDurability(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.BREAKABLE, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -18,11 +19,6 @@ public class EnchantmentDurability extends Enchantment { + return super.a(i) + 50; + } + +- @Override +- public int getMaxLevel() { +- return 3; +- } +- + @Override + public boolean canEnchant(ItemStack itemstack) { + return itemstack.e() ? true : super.canEnchant(itemstack); +diff --git a/src/main/java/net/minecraft/server/EnchantmentFire.java b/src/main/java/net/minecraft/server/EnchantmentFire.java +index c4da4378cb..f2664c18e2 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentFire.java ++++ b/src/main/java/net/minecraft/server/EnchantmentFire.java +@@ -4,6 +4,7 @@ public class EnchantmentFire extends Enchantment { + + protected EnchantmentFire(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.WEAPON, aenumitemslot); ++ setMaxLevel(2); // Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentFire extends Enchantment { + public int b(int i) { + return super.a(i) + 50; + } +- +- @Override +- public int getMaxLevel() { +- return 2; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentFlameArrows.java b/src/main/java/net/minecraft/server/EnchantmentFlameArrows.java +index a0b4da25b8..af3db770f8 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentFlameArrows.java ++++ b/src/main/java/net/minecraft/server/EnchantmentFlameArrows.java +@@ -4,6 +4,7 @@ public class EnchantmentFlameArrows extends Enchantment { + + public EnchantmentFlameArrows(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.BOW, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentFlameArrows extends Enchantment { + public int b(int i) { + return 50; + } +- +- @Override +- public int getMaxLevel() { +- return 1; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentFrostWalker.java b/src/main/java/net/minecraft/server/EnchantmentFrostWalker.java +index b5de6c740c..8c4fd331c8 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentFrostWalker.java ++++ b/src/main/java/net/minecraft/server/EnchantmentFrostWalker.java +@@ -10,6 +10,7 @@ public class EnchantmentFrostWalker extends Enchantment { + + public EnchantmentFrostWalker(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.ARMOR_FEET, aenumitemslot); ++ setMaxLevel(2); // Purpur + } + + @Override +@@ -27,11 +28,6 @@ public class EnchantmentFrostWalker extends Enchantment { + return true; + } + +- @Override +- public int getMaxLevel() { +- return 2; +- } +- + public static void a(EntityLiving entityliving, World world, BlockPosition blockposition, int i) { + if (entityliving.onGround) { + IBlockData iblockdata = Blocks.FROSTED_ICE.getBlockData(); +diff --git a/src/main/java/net/minecraft/server/EnchantmentInfiniteArrows.java b/src/main/java/net/minecraft/server/EnchantmentInfiniteArrows.java +index 408cfa4609..1dbedc0adb 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentInfiniteArrows.java ++++ b/src/main/java/net/minecraft/server/EnchantmentInfiniteArrows.java +@@ -4,6 +4,7 @@ public class EnchantmentInfiniteArrows extends Enchantment { + + public EnchantmentInfiniteArrows(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.BOW, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentInfiniteArrows extends Enchantment { + return 50; + } + +- @Override +- public int getMaxLevel() { +- return 1; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return enchantment instanceof EnchantmentMending ? false : super.a(enchantment); +diff --git a/src/main/java/net/minecraft/server/EnchantmentKnockback.java b/src/main/java/net/minecraft/server/EnchantmentKnockback.java +index 362ce7bc47..04062c2557 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentKnockback.java ++++ b/src/main/java/net/minecraft/server/EnchantmentKnockback.java +@@ -4,6 +4,7 @@ public class EnchantmentKnockback extends Enchantment { + + protected EnchantmentKnockback(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.WEAPON, aenumitemslot); ++ setMaxLevel(2); // Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentKnockback extends Enchantment { + public int b(int i) { + return super.a(i) + 50; + } +- +- @Override +- public int getMaxLevel() { +- return 2; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentLootBonus.java b/src/main/java/net/minecraft/server/EnchantmentLootBonus.java +index b5232faccc..c27e20e066 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentLootBonus.java ++++ b/src/main/java/net/minecraft/server/EnchantmentLootBonus.java +@@ -4,6 +4,7 @@ public class EnchantmentLootBonus extends Enchantment { + + protected EnchantmentLootBonus(Enchantment.Rarity enchantment_rarity, EnchantmentSlotType enchantmentslottype, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, enchantmentslottype, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentLootBonus extends Enchantment { + return super.a(i) + 50; + } + +- @Override +- public int getMaxLevel() { +- return 3; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return super.a(enchantment) && enchantment != Enchantments.SILK_TOUCH; +diff --git a/src/main/java/net/minecraft/server/EnchantmentLure.java b/src/main/java/net/minecraft/server/EnchantmentLure.java +index 1ffb91c570..c5a9e61f9a 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentLure.java ++++ b/src/main/java/net/minecraft/server/EnchantmentLure.java +@@ -4,6 +4,7 @@ public class EnchantmentLure extends Enchantment { + + protected EnchantmentLure(Enchantment.Rarity enchantment_rarity, EnchantmentSlotType enchantmentslottype, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, enchantmentslottype, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentLure extends Enchantment { + public int b(int i) { + return super.a(i) + 50; + } +- +- @Override +- public int getMaxLevel() { +- return 3; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentMending.java b/src/main/java/net/minecraft/server/EnchantmentMending.java +index dafc29399f..ace2e19a6f 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentMending.java ++++ b/src/main/java/net/minecraft/server/EnchantmentMending.java +@@ -4,6 +4,7 @@ public class EnchantmentMending extends Enchantment { + + public EnchantmentMending(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.BREAKABLE, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -20,9 +21,4 @@ public class EnchantmentMending extends Enchantment { + public boolean isTreasure() { + return true; + } +- +- @Override +- public int getMaxLevel() { +- return 1; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentMultishot.java b/src/main/java/net/minecraft/server/EnchantmentMultishot.java +index 6f423e7536..5fb8a624c2 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentMultishot.java ++++ b/src/main/java/net/minecraft/server/EnchantmentMultishot.java +@@ -4,6 +4,7 @@ public class EnchantmentMultishot extends Enchantment { + + public EnchantmentMultishot(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.CROSSBOW, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentMultishot extends Enchantment { + return 50; + } + +- @Override +- public int getMaxLevel() { +- return 1; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return super.a(enchantment) && enchantment != Enchantments.PIERCING; +diff --git a/src/main/java/net/minecraft/server/EnchantmentOxygen.java b/src/main/java/net/minecraft/server/EnchantmentOxygen.java +index c1bc97f6ef..a5726d36df 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentOxygen.java ++++ b/src/main/java/net/minecraft/server/EnchantmentOxygen.java +@@ -4,6 +4,7 @@ public class EnchantmentOxygen extends Enchantment { + + public EnchantmentOxygen(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.ARMOR_HEAD, aenumitemslot); ++ setMaxLevel(3);// Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentOxygen extends Enchantment { + public int b(int i) { + return this.a(i) + 30; + } +- +- @Override +- public int getMaxLevel() { +- return 3; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentPiercing.java b/src/main/java/net/minecraft/server/EnchantmentPiercing.java +index 1a2e8e31f9..0e8993e86e 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentPiercing.java ++++ b/src/main/java/net/minecraft/server/EnchantmentPiercing.java +@@ -4,6 +4,7 @@ public class EnchantmentPiercing extends Enchantment { + + public EnchantmentPiercing(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.CROSSBOW, aenumitemslot); ++ setMaxLevel(4); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentPiercing extends Enchantment { + return 50; + } + +- @Override +- public int getMaxLevel() { +- return 4; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return super.a(enchantment) && enchantment != Enchantments.MULTISHOT; +diff --git a/src/main/java/net/minecraft/server/EnchantmentProtection.java b/src/main/java/net/minecraft/server/EnchantmentProtection.java +index 416e57caa0..b29cb54677 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentProtection.java ++++ b/src/main/java/net/minecraft/server/EnchantmentProtection.java +@@ -10,7 +10,7 @@ public class EnchantmentProtection extends Enchantment { + if (enchantmentprotection_damagetype == EnchantmentProtection.DamageType.FALL) { + this.itemTarget = EnchantmentSlotType.ARMOR_FEET; + } +- ++ setMaxLevel(4); // Purpur + } + + @Override +@@ -23,11 +23,6 @@ public class EnchantmentProtection extends Enchantment { + return this.a(i) + this.a.c(); + } + +- @Override +- public int getMaxLevel() { +- return 4; +- } +- + @Override + public int a(int i, DamageSource damagesource) { + return damagesource.ignoresInvulnerability() ? 0 : (this.a == EnchantmentProtection.DamageType.ALL ? i : (this.a == EnchantmentProtection.DamageType.FIRE && damagesource.isFire() ? i * 2 : (this.a == EnchantmentProtection.DamageType.FALL && damagesource == DamageSource.FALL ? i * 3 : (this.a == EnchantmentProtection.DamageType.EXPLOSION && damagesource.isExplosion() ? i * 2 : (this.a == EnchantmentProtection.DamageType.PROJECTILE && damagesource.b() ? i * 2 : 0))))); +diff --git a/src/main/java/net/minecraft/server/EnchantmentQuickCharge.java b/src/main/java/net/minecraft/server/EnchantmentQuickCharge.java +index e624b63aaf..762642ce5a 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentQuickCharge.java ++++ b/src/main/java/net/minecraft/server/EnchantmentQuickCharge.java +@@ -4,6 +4,7 @@ public class EnchantmentQuickCharge extends Enchantment { + + public EnchantmentQuickCharge(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.CROSSBOW, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentQuickCharge extends Enchantment { + public int b(int i) { + return 50; + } +- +- @Override +- public int getMaxLevel() { +- return 3; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentSilkTouch.java b/src/main/java/net/minecraft/server/EnchantmentSilkTouch.java +index 04aa8e1d5d..d0eac6dbc1 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentSilkTouch.java ++++ b/src/main/java/net/minecraft/server/EnchantmentSilkTouch.java +@@ -4,6 +4,7 @@ public class EnchantmentSilkTouch extends Enchantment { + + protected EnchantmentSilkTouch(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.DIGGER, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentSilkTouch extends Enchantment { + return super.a(i) + 50; + } + +- @Override +- public int getMaxLevel() { +- return 1; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return super.a(enchantment) && enchantment != Enchantments.LOOT_BONUS_BLOCKS; +diff --git a/src/main/java/net/minecraft/server/EnchantmentSweeping.java b/src/main/java/net/minecraft/server/EnchantmentSweeping.java +index a20b1c8f5b..7804e0a0a8 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentSweeping.java ++++ b/src/main/java/net/minecraft/server/EnchantmentSweeping.java +@@ -4,6 +4,7 @@ public class EnchantmentSweeping extends Enchantment { + + public EnchantmentSweeping(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.WEAPON, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentSweeping extends Enchantment { + return this.a(i) + 15; + } + +- @Override +- public int getMaxLevel() { +- return 3; +- } +- + public static float e(int i) { + return 1.0F - 1.0F / (float) (i + 1); + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentThorns.java b/src/main/java/net/minecraft/server/EnchantmentThorns.java +index fd0255c890..df7c9b24b5 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentThorns.java ++++ b/src/main/java/net/minecraft/server/EnchantmentThorns.java +@@ -7,6 +7,7 @@ public class EnchantmentThorns extends Enchantment { + + public EnchantmentThorns(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.ARMOR_CHEST, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -19,11 +20,6 @@ public class EnchantmentThorns extends Enchantment { + return super.a(i) + 50; + } + +- @Override +- public int getMaxLevel() { +- return 3; +- } +- + @Override + public boolean canEnchant(ItemStack itemstack) { + return itemstack.getItem() instanceof ItemArmor ? true : super.canEnchant(itemstack); +diff --git a/src/main/java/net/minecraft/server/EnchantmentTridentChanneling.java b/src/main/java/net/minecraft/server/EnchantmentTridentChanneling.java +index 14115ecc78..2533b2cab2 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentTridentChanneling.java ++++ b/src/main/java/net/minecraft/server/EnchantmentTridentChanneling.java +@@ -4,6 +4,7 @@ public class EnchantmentTridentChanneling extends Enchantment { + + public EnchantmentTridentChanneling(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.TRIDENT, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentTridentChanneling extends Enchantment { + return 50; + } + +- @Override +- public int getMaxLevel() { +- return 1; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return super.a(enchantment); +diff --git a/src/main/java/net/minecraft/server/EnchantmentTridentImpaling.java b/src/main/java/net/minecraft/server/EnchantmentTridentImpaling.java +index f64fc401e8..b47d8284f8 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentTridentImpaling.java ++++ b/src/main/java/net/minecraft/server/EnchantmentTridentImpaling.java +@@ -4,6 +4,7 @@ public class EnchantmentTridentImpaling extends Enchantment { + + public EnchantmentTridentImpaling(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.TRIDENT, aenumitemslot); ++ setMaxLevel(5); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentTridentImpaling extends Enchantment { + return this.a(i) + 20; + } + +- @Override +- public int getMaxLevel() { +- return 5; +- } +- + @Override + public float a(int i, EnumMonsterType enummonstertype) { + return enummonstertype == EnumMonsterType.e ? (float) i * 2.5F : 0.0F; +diff --git a/src/main/java/net/minecraft/server/EnchantmentTridentLoyalty.java b/src/main/java/net/minecraft/server/EnchantmentTridentLoyalty.java +index dd91bed6e4..826f4d8750 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentTridentLoyalty.java ++++ b/src/main/java/net/minecraft/server/EnchantmentTridentLoyalty.java +@@ -4,6 +4,7 @@ public class EnchantmentTridentLoyalty extends Enchantment { + + public EnchantmentTridentLoyalty(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.TRIDENT, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentTridentLoyalty extends Enchantment { + return 50; + } + +- @Override +- public int getMaxLevel() { +- return 3; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return super.a(enchantment); +diff --git a/src/main/java/net/minecraft/server/EnchantmentTridentRiptide.java b/src/main/java/net/minecraft/server/EnchantmentTridentRiptide.java +index 0f669dc7ac..81d6ccc35b 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentTridentRiptide.java ++++ b/src/main/java/net/minecraft/server/EnchantmentTridentRiptide.java +@@ -4,6 +4,7 @@ public class EnchantmentTridentRiptide extends Enchantment { + + public EnchantmentTridentRiptide(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.TRIDENT, aenumitemslot); ++ setMaxLevel(3); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentTridentRiptide extends Enchantment { + return 50; + } + +- @Override +- public int getMaxLevel() { +- return 3; +- } +- + @Override + public boolean a(Enchantment enchantment) { + return super.a(enchantment) && enchantment != Enchantments.LOYALTY && enchantment != Enchantments.CHANNELING; +diff --git a/src/main/java/net/minecraft/server/EnchantmentVanishing.java b/src/main/java/net/minecraft/server/EnchantmentVanishing.java +index 4ef59d7f17..5d7b6ca57a 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentVanishing.java ++++ b/src/main/java/net/minecraft/server/EnchantmentVanishing.java +@@ -4,6 +4,7 @@ public class EnchantmentVanishing extends Enchantment { + + public EnchantmentVanishing(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.ALL, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -16,11 +17,6 @@ public class EnchantmentVanishing extends Enchantment { + return 50; + } + +- @Override +- public int getMaxLevel() { +- return 1; +- } +- + @Override + public boolean isTreasure() { + return true; +diff --git a/src/main/java/net/minecraft/server/EnchantmentWaterWorker.java b/src/main/java/net/minecraft/server/EnchantmentWaterWorker.java +index cf0999095e..bea57861bf 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentWaterWorker.java ++++ b/src/main/java/net/minecraft/server/EnchantmentWaterWorker.java +@@ -4,6 +4,7 @@ public class EnchantmentWaterWorker extends Enchantment { + + public EnchantmentWaterWorker(Enchantment.Rarity enchantment_rarity, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.ARMOR_HEAD, aenumitemslot); ++ setMaxLevel(1); // Purpur + } + + @Override +@@ -15,9 +16,4 @@ public class EnchantmentWaterWorker extends Enchantment { + public int b(int i) { + return this.a(i) + 40; + } +- +- @Override +- public int getMaxLevel() { +- return 1; +- } + } +diff --git a/src/main/java/net/minecraft/server/EnchantmentWeaponDamage.java b/src/main/java/net/minecraft/server/EnchantmentWeaponDamage.java +index 4571cdf021..aa3cbd523a 100644 +--- a/src/main/java/net/minecraft/server/EnchantmentWeaponDamage.java ++++ b/src/main/java/net/minecraft/server/EnchantmentWeaponDamage.java +@@ -11,6 +11,7 @@ public class EnchantmentWeaponDamage extends Enchantment { + public EnchantmentWeaponDamage(Enchantment.Rarity enchantment_rarity, int i, EnumItemSlot... aenumitemslot) { + super(enchantment_rarity, EnchantmentSlotType.WEAPON, aenumitemslot); + this.a = i; ++ setMaxLevel(5); // Purpur + } + + @Override +@@ -23,11 +24,6 @@ public class EnchantmentWeaponDamage extends Enchantment { + return this.a(i) + EnchantmentWeaponDamage.g[this.a]; + } + +- @Override +- public int getMaxLevel() { +- return 5; +- } +- + @Override + public float a(int i, EnumMonsterType enummonstertype) { + return this.a == 0 ? 1.0F + (float) Math.max(0, i - 1) * 0.5F : (this.a == 1 && enummonstertype == EnumMonsterType.UNDEAD ? (float) i * 2.5F : (this.a == 2 && enummonstertype == EnumMonsterType.ARTHROPOD ? (float) i * 2.5F : 0.0F)); +diff --git a/src/main/java/net/pl3x/purpur/PurpurConfig.java b/src/main/java/net/pl3x/purpur/PurpurConfig.java +index 850a7ac24d..bb5ba4f137 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurConfig.java +@@ -1,6 +1,8 @@ + package net.pl3x.purpur; + + import com.google.common.base.Throwables; ++import net.minecraft.server.Enchantment; ++import net.minecraft.server.IRegistry; + import net.minecraft.server.MinecraftServer; + import org.bukkit.Bukkit; + import org.bukkit.command.Command; +@@ -204,4 +206,12 @@ public class PurpurConfig { + private static void timingsSettings() { + getString("settings.timings.url", "https://timings.pl3x.net"); + } ++ ++ private static void enchantmentSettings() { ++ for (Enchantment enchantment : IRegistry.ENCHANTMENT) { ++ String name = IRegistry.ENCHANTMENT.getKey(enchantment).getKey(); ++ int maxLevel = getInt("settings.enchantment." + name + ".max-level", enchantment.getMaxLevel()); ++ enchantment.setMaxLevel(maxLevel); ++ } ++ } + } +diff --git a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +index 64ceeda1af..0e9fa34411 100644 +--- a/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java ++++ b/src/main/java/org/bukkit/craftbukkit/enchantments/CraftEnchantment.java +@@ -23,6 +23,13 @@ public class CraftEnchantment extends Enchantment { + return target.getMaxLevel(); + } + ++ // Purpur start ++ @Override ++ public void setMaxLevel(int maxLevel) { ++ target.setMaxLevel(maxLevel); ++ } ++ // Purpur end ++ + @Override + public int getStartLevel() { + return target.getStartLevel(); +-- +2.24.0 +