mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
138 lines
9.7 KiB
Diff
138 lines
9.7 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Encode42 <me@encode42.dev>
|
|
Date: Wed, 24 Mar 2021 17:59:54 -0400
|
|
Subject: [PATCH] Config to allow unsafe enchants
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/commands/EnchantCommand.java b/src/main/java/net/minecraft/server/commands/EnchantCommand.java
|
|
index cf0a5943f457c532958f40b4989fa18f967abae6..2ab8ff8ca51eb841932ccca4a348acc0141264a8 100644
|
|
--- a/src/main/java/net/minecraft/server/commands/EnchantCommand.java
|
|
+++ b/src/main/java/net/minecraft/server/commands/EnchantCommand.java
|
|
@@ -70,7 +70,7 @@ public class EnchantCommand {
|
|
|
|
private static int enchant(CommandSourceStack source, Collection<? extends Entity> targets, Holder<Enchantment> enchantment, int level) throws CommandSyntaxException {
|
|
Enchantment enchantment2 = enchantment.value();
|
|
- if (level > enchantment2.getMaxLevel()) {
|
|
+ if (!org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && level > enchantment2.getMaxLevel()) { // Purpur - Config to allow unsafe enchants
|
|
throw ERROR_LEVEL_TOO_HIGH.create(level, enchantment2.getMaxLevel());
|
|
} else {
|
|
int i = 0;
|
|
@@ -81,7 +81,7 @@ public class EnchantCommand {
|
|
ItemStack itemStack = livingEntity.getMainHandItem();
|
|
if (!itemStack.isEmpty()) {
|
|
if (enchantment2.canEnchant(itemStack)
|
|
- && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(itemStack).keySet(), enchantment)) {
|
|
+ && EnchantmentHelper.isEnchantmentCompatible(EnchantmentHelper.getEnchantmentsForCrafting(itemStack).keySet(), enchantment) || (org.purpurmc.purpur.PurpurConfig.allowUnsafeEnchantCommand && !itemStack.hasEnchantment(enchantment))) { // Purpur - Config to allow unsafe enchants
|
|
itemStack.enchant(enchantment, level);
|
|
i++;
|
|
} else if (targets.size() == 1) {
|
|
diff --git a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
|
|
index f1834eec821a14ef6a7f42f827b7e0b8284ae5a2..e9c17953a3767e03e528ed93b10fb42626fff118 100644
|
|
--- a/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
|
|
+++ b/src/main/java/net/minecraft/world/inventory/AnvilMenu.java
|
|
@@ -234,7 +234,10 @@ public class AnvilMenu extends ItemCombinerMenu {
|
|
|
|
i2 = l1 == i2 ? i2 + 1 : Math.max(i2, l1);
|
|
Enchantment enchantment = (Enchantment) holder.value();
|
|
- boolean flag3 = enchantment.canEnchant(itemstack);
|
|
+ // Purpur start - Config to allow unsafe enchants
|
|
+ boolean flag3 = this.canDoUnsafeEnchants || org.purpurmc.purpur.PurpurConfig.allowInapplicableEnchants || enchantment.canEnchant(itemstack); // whether the enchantment can be applied on specific item type
|
|
+ boolean flag4 = true; // whether two incompatible enchantments can be applied on a single item
|
|
+ // Purpur end - Config to allow unsafe enchants
|
|
|
|
if (this.player.getAbilities().instabuild || itemstack.is(Items.ENCHANTED_BOOK)) {
|
|
flag3 = true;
|
|
@@ -246,16 +249,22 @@ public class AnvilMenu extends ItemCombinerMenu {
|
|
Holder<Enchantment> holder1 = (Holder) iterator1.next();
|
|
|
|
if (!holder1.equals(holder) && !Enchantment.areCompatible(holder, holder1)) {
|
|
- flag3 = this.canDoUnsafeEnchants; // Purpur - Anvil API
|
|
+ flag4 = this.canDoUnsafeEnchants || org.purpurmc.purpur.PurpurConfig.allowIncompatibleEnchants; // Purpur - Anvil API // Purpur - flag3 -> flag4 - Config to allow unsafe enchants
|
|
+ // Purpur start - Config to allow unsafe enchants
|
|
+ if (!flag4 && org.purpurmc.purpur.PurpurConfig.replaceIncompatibleEnchants) {
|
|
+ iterator1.remove(); // replace current enchant with the incompatible one trying to be applied
|
|
+ flag4 = true;
|
|
+ }
|
|
+ // Purpur end - Config to allow unsafe enchants
|
|
++i;
|
|
}
|
|
}
|
|
|
|
- if (!flag3) {
|
|
+ if (!flag3 || !flag4) { // Purpur - Config to allow unsafe enchants
|
|
flag2 = true;
|
|
} else {
|
|
flag1 = true;
|
|
- if (i2 > enchantment.getMaxLevel() && !this.bypassEnchantmentLevelRestriction) { // Paper - bypass anvil level restrictions
|
|
+ if (!org.purpurmc.purpur.PurpurConfig.allowHigherEnchantsLevels && i2 > enchantment.getMaxLevel() && !this.bypassEnchantmentLevelRestriction) { // Paper - bypass anvil level restrictions // Purpur - Config to allow unsafe enchants
|
|
i2 = enchantment.getMaxLevel();
|
|
}
|
|
|
|
@@ -385,7 +394,7 @@ public class AnvilMenu extends ItemCombinerMenu {
|
|
this.broadcastChanges();
|
|
|
|
// Purpur start - Anvil API
|
|
- if (this.canDoUnsafeEnchants && itemstack1 != ItemStack.EMPTY) {
|
|
+ if ((this.canDoUnsafeEnchants || org.purpurmc.purpur.PurpurConfig.allowInapplicableEnchants || org.purpurmc.purpur.PurpurConfig.allowIncompatibleEnchants) && itemstack1 != ItemStack.EMPTY) { // Purpur - Config to allow unsafe enchants
|
|
((ServerPlayer) this.player).connection.send(new ClientboundContainerSetSlotPacket(this.containerId, this.incrementStateId(), 2, itemstack1));
|
|
((ServerPlayer) this.player).connection.send(new ClientboundContainerSetDataPacket(this.containerId, 0, this.cost.get()));
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
index dcb656be3d37f29bdbe7d25ace05c6dd1889e252..d644d02b039ca918391a32a04549f7a34386b3f9 100644
|
|
--- a/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
+++ b/src/main/java/net/minecraft/world/item/ItemStack.java
|
|
@@ -1351,6 +1351,12 @@ public final class ItemStack implements DataComponentHolder {
|
|
return !((ItemEnchantments) this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY)).isEmpty();
|
|
}
|
|
|
|
+ // Purpur start - Config to allow unsafe enchants
|
|
+ public boolean hasEnchantment(Holder<Enchantment> enchantment) {
|
|
+ return this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY).getLevel(enchantment) > 0;
|
|
+ }
|
|
+ // Purpur end - Config to allow unsafe enchants
|
|
+
|
|
public ItemEnchantments getEnchantments() {
|
|
return (ItemEnchantments) this.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY);
|
|
}
|
|
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
index 28800c519ab8a6648d632a577ffbecae175f3844..ebeb7e756f8d8b499f0ad1a0948264cfe376a69a 100644
|
|
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
@@ -286,6 +286,36 @@ public class PurpurConfig {
|
|
cryingObsidianValidForPortalFrame = getBoolean("settings.blocks.crying_obsidian.valid-for-portal-frame", cryingObsidianValidForPortalFrame);
|
|
}
|
|
|
|
+ public static boolean allowInapplicableEnchants = false;
|
|
+ public static boolean allowIncompatibleEnchants = false;
|
|
+ public static boolean allowHigherEnchantsLevels = false;
|
|
+ public static boolean allowUnsafeEnchantCommand = false;
|
|
+ public static boolean replaceIncompatibleEnchants = false;
|
|
+ private static void enchantmentSettings() {
|
|
+ if (version < 30) {
|
|
+ boolean oldValue = getBoolean("settings.enchantment.allow-unsafe-enchants", false);
|
|
+ set("settings.enchantment.anvil.allow-unsafe-enchants", oldValue);
|
|
+ set("settings.enchantment.anvil.allow-inapplicable-enchants", true);
|
|
+ set("settings.enchantment.anvil.allow-incompatible-enchants", true);
|
|
+ set("settings.enchantment.anvil.allow-higher-enchants-levels", true);
|
|
+ set("settings.enchantment.allow-unsafe-enchants", null);
|
|
+ }
|
|
+ if (version < 37) {
|
|
+ boolean allowUnsafeEnchants = getBoolean("settings.enchantment.anvil.allow-unsafe-enchants", false);
|
|
+ if (!allowUnsafeEnchants) {
|
|
+ set("settings.enchantment.anvil.allow-inapplicable-enchants", false);
|
|
+ set("settings.enchantment.anvil.allow-incompatible-enchants", false);
|
|
+ set("settings.enchantment.anvil.allow-higher-enchants-levels", false);
|
|
+ }
|
|
+ set("settings.enchantment.anvil.allow-unsafe-enchants", null);
|
|
+ }
|
|
+ allowInapplicableEnchants = getBoolean("settings.enchantment.anvil.allow-inapplicable-enchants", allowInapplicableEnchants);
|
|
+ allowIncompatibleEnchants = getBoolean("settings.enchantment.anvil.allow-incompatible-enchants", allowIncompatibleEnchants);
|
|
+ allowHigherEnchantsLevels = getBoolean("settings.enchantment.anvil.allow-higher-enchants-levels", allowHigherEnchantsLevels);
|
|
+ allowUnsafeEnchantCommand = getBoolean("settings.enchantment.allow-unsafe-enchant-command", allowUnsafeEnchantCommand);
|
|
+ replaceIncompatibleEnchants = getBoolean("settings.enchantment.anvil.replace-incompatible-enchants", replaceIncompatibleEnchants);
|
|
+ }
|
|
+
|
|
public static boolean endermanShortHeight = false;
|
|
private static void entitySettings() {
|
|
endermanShortHeight = getBoolean("settings.entity.enderman.short-height", endermanShortHeight);
|