From 7a3fe2b777984a39b1c581bc6b1d56bedd43311d Mon Sep 17 00:00:00 2001 From: MissBismuth <194607097+MissBismuth@users.noreply.github.com> Date: Tue, 23 Jun 2026 21:19:08 +0200 Subject: [PATCH 1/2] make sure you can't disenchant preenchanted enchantments make sure you can't enchant preenchanted enchantments again make sure you can't enchant bedrock items with unbreaking --- .../spectrum/api/item/Preenchanted.java | 60 ++++++++++++++++++- .../items/armor/BedrockArmorItem.java | 12 ++++ .../spectrum/items/tools/BedrockAxeItem.java | 11 ++++ .../spectrum/items/tools/BedrockBowItem.java | 12 ++++ .../items/tools/BedrockCrossbowItem.java | 12 ++++ .../items/tools/BedrockFishingRodItem.java | 10 ++++ .../spectrum/items/tools/BedrockHoeItem.java | 11 ++++ .../items/tools/BedrockShearsItem.java | 10 ++++ .../items/tools/BedrockShovelItem.java | 11 ++++ .../items/tools/BedrockSwordItem.java | 11 ++++ .../items/tools/SpectrumPickaxeItem.java | 1 - .../mixin/EnchantmentHelperMixin.java | 29 +++++++++ .../spectrum/registries/SpectrumItems.java | 10 ++++ .../registries/SpectrumToolTiers.java | 10 ++++ src/main/resources/spectrum.mixins.json | 1 + 15 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 src/main/java/de/dafuqs/spectrum/mixin/EnchantmentHelperMixin.java diff --git a/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java b/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java index 128da355fe..03c2cf3a05 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java @@ -5,16 +5,26 @@ import net.minecraft.core.component.*; import net.minecraft.core.registries.*; import net.minecraft.resources.*; +import net.minecraft.tags.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; +import net.neoforged.bus.api.*; +import net.neoforged.fml.*; +import net.neoforged.fml.common.*; +import net.neoforged.fml.event.lifecycle.*; +import net.neoforged.neoforge.event.*; +import org.jetbrains.annotations.*; import org.jspecify.annotations.Nullable; import java.util.*; +@EventBusSubscriber public interface Preenchanted { - Map, Integer> getDefaultEnchantments(); + @ApiStatus.Internal + Random random = new Random(); + Map, Integer> getDefaultEnchantments(); static ItemEnchantments buildDefaultEnchantments(HolderLookup.Provider lookup, Preenchanted item) { ItemEnchantments.Mutable builder = new ItemEnchantments.Mutable(ItemEnchantments.EMPTY); for (Map.Entry, Integer> entry : item.getDefaultEnchantments().entrySet()) { @@ -50,4 +60,52 @@ default boolean onlyHasPreEnchantments(ItemStack stack) { return defaultEnchants.isEmpty(); } + @ApiStatus.Internal + @SubscribeEvent + static void onGrindStonePlace(GrindstoneEvent.OnPlaceItem event) { + if(!event.getTopItem().isEmpty() && !event.getBottomItem().isEmpty()) { + return; + } + Preenchanted itemInstance = null; + ItemStack stack = null; + if (event.getTopItem().getItem() instanceof Preenchanted preenchanted) { + itemInstance = preenchanted; + stack = event.getTopItem(); + } + if (event.getBottomItem().getItem() instanceof Preenchanted preenchanted) { + itemInstance = preenchanted; + stack = event.getBottomItem(); + } + if (itemInstance == null) { + return; + } + ItemEnchantments itemEnchantments = stack.get(DataComponents.ENCHANTMENTS); + if (itemEnchantments == null) { + return; + } + ItemStack output = stack.copy(); + ItemEnchantments.Mutable outputBuilder = new ItemEnchantments.Mutable(ItemEnchantments.EMPTY); + int xp = 0; + for (Object2IntMap.Entry> existingEnchantment : itemEnchantments.entrySet()) { + Holder holder = existingEnchantment.getKey(); + Integer defaultLevel = itemInstance.getDefaultEnchantments().get(holder.getKey()); + int existingLevel = existingEnchantment.getIntValue(); + if (defaultLevel != null && defaultLevel <= existingLevel) { + outputBuilder.set(existingEnchantment.getKey(), defaultLevel); + if (!holder.is(EnchantmentTags.CURSE)){ + xp += holder.value().getMinCost(existingLevel) - holder.value().getMinCost(defaultLevel); + } + } else if (!holder.is(EnchantmentTags.CURSE)){ + xp += holder.value().getMinCost(existingLevel); + } + } + output.set(DataComponents.ENCHANTMENTS, outputBuilder.toImmutable()); + event.setOutput(output); + if (xp == 0) { + event.setXp(xp); + return; + } + xp = (int)Math.ceil(xp / 2.0); + event.setXp( xp + random.nextInt(xp)); + } } diff --git a/src/main/java/de/dafuqs/spectrum/items/armor/BedrockArmorItem.java b/src/main/java/de/dafuqs/spectrum/items/armor/BedrockArmorItem.java index ccaf46c5c4..7e4dc79d19 100644 --- a/src/main/java/de/dafuqs/spectrum/items/armor/BedrockArmorItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/armor/BedrockArmorItem.java @@ -2,11 +2,15 @@ import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; import de.dafuqs.spectrum.registries.client.*; import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.entity.*; import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.*; +import net.neoforged.neoforge.common.util.*; + import javax.annotation.*; public abstract class BedrockArmorItem extends ArmorItem implements Preenchanted { @@ -42,4 +46,12 @@ public boolean makesPiglinsNeutral(ItemStack stack, LivingEntity wearer) { return true; } + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } + } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockAxeItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockAxeItem.java index e77a2c1362..162830825c 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockAxeItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockAxeItem.java @@ -1,9 +1,12 @@ package de.dafuqs.spectrum.items.tools; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; +import net.neoforged.neoforge.common.util.*; import java.util.*; @@ -23,4 +26,12 @@ public boolean isEnchantable(ItemStack stack) { return true; } + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } + } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockBowItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockBowItem.java index 773c262e3d..2cfd5dd5aa 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockBowItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockBowItem.java @@ -2,10 +2,14 @@ import de.dafuqs.arrowhead.api.*; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; +import net.neoforged.neoforge.common.util.*; + import javax.annotation.*; import java.util.*; @@ -41,4 +45,12 @@ public float getDivergenceMod(ItemStack stack, LivingEntity shooter) { return 0.8F; } + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } + } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockCrossbowItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockCrossbowItem.java index 692807b13f..e0d6bf950f 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockCrossbowItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockCrossbowItem.java @@ -2,10 +2,14 @@ import de.dafuqs.arrowhead.api.*; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.entity.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; +import net.neoforged.neoforge.common.util.*; + import javax.annotation.*; import java.util.*; @@ -41,4 +45,12 @@ public float getDivergenceMod(ItemStack stack, LivingEntity shooter) { return 0.8F; } + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } + } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockFishingRodItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockFishingRodItem.java index 9962c84a17..534e3d11b3 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockFishingRodItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockFishingRodItem.java @@ -4,6 +4,7 @@ import de.dafuqs.spectrum.entity.entity.*; import de.dafuqs.spectrum.registries.*; import net.minecraft.*; +import net.minecraft.core.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; import net.minecraft.world.entity.player.*; @@ -11,6 +12,8 @@ import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.*; import net.minecraft.world.level.material.*; +import net.neoforged.neoforge.common.util.*; + import javax.annotation.*; import java.util.*; @@ -47,4 +50,11 @@ public void appendHoverText(ItemStack stack, TooltipContext context, List enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockHoeItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockHoeItem.java index 945973c921..a1fd1b29fa 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockHoeItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockHoeItem.java @@ -1,9 +1,12 @@ package de.dafuqs.spectrum.items.tools; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; +import net.neoforged.neoforge.common.util.*; import java.util.*; @@ -23,4 +26,12 @@ public boolean isEnchantable(ItemStack stack) { return true; } + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } + } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShearsItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShearsItem.java index 79f89c5d5c..22e39d7ada 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShearsItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShearsItem.java @@ -1,9 +1,12 @@ package de.dafuqs.spectrum.items.tools; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; +import net.neoforged.neoforge.common.util.*; import java.util.*; @@ -23,4 +26,11 @@ public boolean isEnchantable(ItemStack stack) { return true; } + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } } \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShovelItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShovelItem.java index 086d37b4f9..40535bed25 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShovelItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockShovelItem.java @@ -1,9 +1,12 @@ package de.dafuqs.spectrum.items.tools; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; +import net.neoforged.neoforge.common.util.*; import java.util.*; @@ -23,4 +26,12 @@ public boolean isEnchantable(ItemStack stack) { return true; } + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } + } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockSwordItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockSwordItem.java index f81406cbdf..35bf5066a9 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/BedrockSwordItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/BedrockSwordItem.java @@ -1,9 +1,12 @@ package de.dafuqs.spectrum.items.tools; import de.dafuqs.spectrum.api.item.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.core.*; import net.minecraft.resources.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; +import net.neoforged.neoforge.common.util.*; import java.util.*; @@ -23,4 +26,12 @@ public boolean isEnchantable(ItemStack stack) { return true; } + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } + } diff --git a/src/main/java/de/dafuqs/spectrum/items/tools/SpectrumPickaxeItem.java b/src/main/java/de/dafuqs/spectrum/items/tools/SpectrumPickaxeItem.java index fa6e68cb94..c3ed70faab 100644 --- a/src/main/java/de/dafuqs/spectrum/items/tools/SpectrumPickaxeItem.java +++ b/src/main/java/de/dafuqs/spectrum/items/tools/SpectrumPickaxeItem.java @@ -17,5 +17,4 @@ public SpectrumPickaxeItem(Tier material, Properties settings) { public Map, Integer> getDefaultEnchantments() { return Map.of(); } - } diff --git a/src/main/java/de/dafuqs/spectrum/mixin/EnchantmentHelperMixin.java b/src/main/java/de/dafuqs/spectrum/mixin/EnchantmentHelperMixin.java new file mode 100644 index 0000000000..f102797fab --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/mixin/EnchantmentHelperMixin.java @@ -0,0 +1,29 @@ +package de.dafuqs.spectrum.mixin; + +import com.llamalad7.mixinextras.injector.*; +import com.llamalad7.mixinextras.sugar.*; +import de.dafuqs.spectrum.api.item.*; +import net.minecraft.core.*; +import net.minecraft.resources.*; +import net.minecraft.world.item.*; +import net.minecraft.world.item.enchantment.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.injection.*; + +import java.util.*; +import java.util.stream.*; + +@Mixin(EnchantmentHelper.class) +public abstract class EnchantmentHelperMixin { + + @ModifyExpressionValue(method = "getAvailableEnchantmentResults", + at = @At(value = "INVOKE", target = "Ljava/util/stream/Stream;filter(Ljava/util/function/Predicate;)Ljava/util/stream/Stream;" + )) + private static Stream> doNothing(Stream> original, @Local(argsOnly = true) ItemStack stack) { + if (stack.getItem() instanceof Preenchanted preenchanted) { + Map, Integer> defaultEnchantments = preenchanted.getDefaultEnchantments(); + return original.filter(enchantmentHolder -> !defaultEnchantments.containsKey(enchantmentHolder.getKey())); + } + return original; + } +} diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java index 63f626eb93..f109c9e5c5 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItems.java @@ -22,6 +22,7 @@ import de.dafuqs.spectrum.items.tools.*; import de.dafuqs.spectrum.items.trinkets.*; import de.dafuqs.spectrum.particle.effect.*; +import net.minecraft.core.*; import net.minecraft.core.component.*; import net.minecraft.network.chat.*; import net.minecraft.resources.*; @@ -37,6 +38,7 @@ import net.minecraft.world.level.material.*; import net.neoforged.bus.api.*; import net.neoforged.neoforge.common.*; +import net.neoforged.neoforge.common.util.*; import net.neoforged.neoforge.fluids.*; import net.neoforged.neoforge.registries.*; @@ -134,6 +136,14 @@ public Map, Integer> getDefaultEnchantments() { public Map, Integer> getDefaultEnchantments() { return Map.of(Enchantments.SILK_TOUCH, 1); } + + @Override + public boolean supportsEnchantment(ItemStack stack, Holder enchantment) { + TriState triState = SpectrumToolTiers.supportsBedrockTierEnchantment(enchantment); + if (triState.isFalse()) + return false; + return super.supportsEnchantment(stack, enchantment); + } }); public static final DeferredItem BEDROCK_AXE = register("bedrock_axe", () -> new BedrockAxeItem(SpectrumToolTiers.BEDROCK, IS.of(Rarity.UNCOMMON).attributes(AxeItem.createAttributes(SpectrumToolTiers.BEDROCK, 5, -3.0F)).fireResistant().durability(SpectrumToolTiers.BEDROCK.getUses()).component(DataComponents.UNBREAKABLE, new Unbreakable(false)))); public static final DeferredItem BEDROCK_SHOVEL = register("bedrock_shovel", () -> new BedrockShovelItem(SpectrumToolTiers.BEDROCK, IS.of(Rarity.UNCOMMON).attributes(ShovelItem.createAttributes(SpectrumToolTiers.BEDROCK, 1, -3.0F)).fireResistant().durability(SpectrumToolTiers.BEDROCK.getUses()).component(DataComponents.UNBREAKABLE, new Unbreakable(false)))); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumToolTiers.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumToolTiers.java index 9d85ff5b37..85f14ae76a 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumToolTiers.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumToolTiers.java @@ -2,10 +2,13 @@ import com.google.common.base.*; import de.dafuqs.spectrum.config.*; +import net.minecraft.core.*; import net.minecraft.tags.*; import net.minecraft.world.item.*; import net.minecraft.world.item.crafting.*; +import net.minecraft.world.item.enchantment.*; import net.minecraft.world.level.block.*; +import net.neoforged.neoforge.common.util.*; import java.util.function.Supplier; @@ -154,4 +157,11 @@ public int getEnchantmentValue() { public Ingredient getRepairIngredient() { return this.repairIngredient.get(); } + + public static TriState supportsBedrockTierEnchantment(Holder holder) { + if (holder.getKey().equals(Enchantments.UNBREAKING)) { + return TriState.FALSE; + } + return TriState.DEFAULT; + } } diff --git a/src/main/resources/spectrum.mixins.json b/src/main/resources/spectrum.mixins.json index 76d767e19d..794c05398a 100644 --- a/src/main/resources/spectrum.mixins.json +++ b/src/main/resources/spectrum.mixins.json @@ -20,6 +20,7 @@ "CropAndStemBlockMixin", "CropBlockMixin", "DamageSourceMixin", + "EnchantmentHelperMixin", "EatBerriesGoalMixin", "EffectCommandMixin", "EnderEyeItemMixin", From 8bb57db57346dfbea279f7196d541d6be3b54a73 Mon Sep 17 00:00:00 2001 From: MissBismuth <194607097+MissBismuth@users.noreply.github.com> Date: Tue, 23 Jun 2026 21:25:59 +0200 Subject: [PATCH 2/2] remove unused imports --- src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java b/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java index 03c2cf3a05..2a8b84f86c 100644 --- a/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java +++ b/src/main/java/de/dafuqs/spectrum/api/item/Preenchanted.java @@ -8,10 +8,8 @@ import net.minecraft.tags.*; import net.minecraft.world.item.*; import net.minecraft.world.item.enchantment.*; -import net.neoforged.bus.api.*; -import net.neoforged.fml.*; -import net.neoforged.fml.common.*; -import net.neoforged.fml.event.lifecycle.*; +import net.neoforged.bus.api.*;´ +import net.neoforged.fml.common.*;´ import net.neoforged.neoforge.event.*; import org.jetbrains.annotations.*; import org.jspecify.annotations.Nullable;