From 0dbc784385d0feda33562c188a11318675e3c698 Mon Sep 17 00:00:00 2001 From: Badtz Date: Mon, 22 Jun 2026 12:09:22 -0700 Subject: [PATCH] correct mixins to allow shift click randomization on craft --- .../dev/badtz/prefixes/PrefixApplier.java | 9 +++++++ .../mixin/AbstractContainerMenuAccessor.java | 13 ++++++++++ .../prefixes/mixin/CraftingMenuMixin.java | 25 +++++++++++++++++++ .../badtz/prefixes/mixin/ResultSlotMixin.java | 13 +++++++--- src/main/resources/prefixes.mixins.json | 4 ++- 5 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 src/main/java/dev/badtz/prefixes/mixin/AbstractContainerMenuAccessor.java create mode 100644 src/main/java/dev/badtz/prefixes/mixin/CraftingMenuMixin.java diff --git a/src/main/java/dev/badtz/prefixes/PrefixApplier.java b/src/main/java/dev/badtz/prefixes/PrefixApplier.java index 3661579..cabe6d7 100644 --- a/src/main/java/dev/badtz/prefixes/PrefixApplier.java +++ b/src/main/java/dev/badtz/prefixes/PrefixApplier.java @@ -91,6 +91,15 @@ public static boolean applyRandom(ItemStack stack, net.minecraft.util.RandomSour return true; } + public static boolean applyRandomIfNeeded(ItemStack stack, + net.minecraft.util.RandomSource random) { + if (stack.isEmpty() || stack.has(Prefixes.PREFIX) || !isPrefixable(stack)) { + return false; + } + + return applyRandom(stack, random); + } + public static Optional getPrefix(ItemStack stack) { Identifier prefixId = stack.get(Prefixes.PREFIX); diff --git a/src/main/java/dev/badtz/prefixes/mixin/AbstractContainerMenuAccessor.java b/src/main/java/dev/badtz/prefixes/mixin/AbstractContainerMenuAccessor.java new file mode 100644 index 0000000..80635f3 --- /dev/null +++ b/src/main/java/dev/badtz/prefixes/mixin/AbstractContainerMenuAccessor.java @@ -0,0 +1,13 @@ +package dev.badtz.prefixes.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +@Mixin(AbstractContainerMenu.class) +public interface AbstractContainerMenuAccessor { + @Invoker("moveItemStackTo") + boolean prefixes$moveItemStackTo(ItemStack stack, int startIndex, int endIndex, + boolean reverseDirection); +} diff --git a/src/main/java/dev/badtz/prefixes/mixin/CraftingMenuMixin.java b/src/main/java/dev/badtz/prefixes/mixin/CraftingMenuMixin.java new file mode 100644 index 0000000..201a9b6 --- /dev/null +++ b/src/main/java/dev/badtz/prefixes/mixin/CraftingMenuMixin.java @@ -0,0 +1,25 @@ +package dev.badtz.prefixes.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; +import dev.badtz.prefixes.PrefixApplier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.item.ItemStack; + +@Mixin(CraftingMenu.class) +public class CraftingMenuMixin { + @Redirect(method = "quickMoveStack", at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/inventory/CraftingMenu;moveItemStackTo(Lnet/minecraft/world/item/ItemStack;IIZ)Z", + ordinal = 0)) + private boolean prefixes$applyRandomPrefixOnShiftCraft(CraftingMenu menu, ItemStack stack, + int startIndex, int endIndex, boolean reverseDirection, Player player, int slotIndex) { + if (slotIndex == 0 && !player.level().isClientSide()) { + PrefixApplier.applyRandomIfNeeded(stack, player.getRandom()); + } + + return ((AbstractContainerMenuAccessor) menu).prefixes$moveItemStackTo(stack, startIndex, + endIndex, reverseDirection); + } +} diff --git a/src/main/java/dev/badtz/prefixes/mixin/ResultSlotMixin.java b/src/main/java/dev/badtz/prefixes/mixin/ResultSlotMixin.java index 8729361..1a54aa8 100644 --- a/src/main/java/dev/badtz/prefixes/mixin/ResultSlotMixin.java +++ b/src/main/java/dev/badtz/prefixes/mixin/ResultSlotMixin.java @@ -1,22 +1,27 @@ package dev.badtz.prefixes.mixin; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import dev.badtz.prefixes.PrefixApplier; -import dev.badtz.prefixes.Prefixes; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.ResultSlot; import net.minecraft.world.item.ItemStack; @Mixin(ResultSlot.class) public class ResultSlotMixin { + @Shadow + @Final + private Player player; + @Inject(method = "onTake", at = @At("HEAD")) - private void prefixes$applyRandomPrefixOnCraft(Player player, ItemStack carried, + private void prefixes$applyRandomPrefixOnCraft(Player player, ItemStack stack, CallbackInfo ci) { - if (!player.level().isClientSide() && !carried.isEmpty() && !carried.has(Prefixes.PREFIX)) { - PrefixApplier.applyRandom(carried, player.getRandom()); + if (!this.player.level().isClientSide()) { + PrefixApplier.applyRandomIfNeeded(stack, this.player.getRandom()); } } } diff --git a/src/main/resources/prefixes.mixins.json b/src/main/resources/prefixes.mixins.json index 0112942..7c12e83 100644 --- a/src/main/resources/prefixes.mixins.json +++ b/src/main/resources/prefixes.mixins.json @@ -3,10 +3,12 @@ "package": "dev.badtz.prefixes.mixin", "compatibilityLevel": "JAVA_25", "mixins": [ + "CraftingMenuMixin", "ResultSlotMixin", "MerchantResultSlotMixin", "CrafterBlockMixin", - "PlayerMixin" + "PlayerMixin", + "AbstractContainerMenuAccessor" ], "client": [], "injectors": {