diff --git a/src/main/java/com/mitchej123/hodgepodge/config/FixesConfig.java b/src/main/java/com/mitchej123/hodgepodge/config/FixesConfig.java index 2f9aadd9c..bcfbde726 100644 --- a/src/main/java/com/mitchej123/hodgepodge/config/FixesConfig.java +++ b/src/main/java/com/mitchej123/hodgepodge/config/FixesConfig.java @@ -722,6 +722,10 @@ public class FixesConfig { @Config.DefaultBoolean(true) public static boolean fixExtraUtilitiesFilingCabinetDupe; + @Config.Comment("Fixes shift clicking items from filing cabinets voiding what was left down to a stack") + @Config.DefaultBoolean(true) + public static boolean fixExtraUtilitiesFilingCabinetShiftClick; + @Config.Comment("Prevent hotkeying other items onto item filters while they are open") @Config.DefaultBoolean(true) public static boolean fixExtraUtilitiesFilterDupe; diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java index c0f7e6d15..428dd4b23 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java @@ -1843,10 +1843,15 @@ public enum Mixins implements IMixins { .addRequiredMod(TargetedMod.EXTRA_UTILITIES) .setPhase(Phase.LATE)), FIX_FILING_CABINET_DUPE(new MixinBuilder("Caps hotkey'd stacks to their maximum stack size in filing cabinets") - .addCommonMixins("extrautilities.MixinContainerFilingCabinet") + .addCommonMixins("extrautilities.MixinContainerFilingCabinetDupe") .setApplyIf(() -> FixesConfig.fixExtraUtilitiesFilingCabinetDupe) .addRequiredMod(TargetedMod.EXTRA_UTILITIES) .setPhase(Phase.LATE)), + FIX_FILING_CABINET_VOIDING(new MixinBuilder("Fixes shift clicking items from filing cabinets voiding what was left down to a stack") + .addCommonMixins("extrautilities.MixinContainerFilingCabinetShiftClick") + .setApplyIf(() -> FixesConfig.fixExtraUtilitiesFilingCabinetShiftClick) + .addRequiredMod(TargetedMod.EXTRA_UTILITIES) + .setPhase(Phase.LATE)), FIX_FILTER_DUPE(new MixinBuilder("Prevent hotkeying other items onto item filters while they are open") .addCommonMixins("extrautilities.MixinContainerFilter") .setApplyIf(() -> FixesConfig.fixExtraUtilitiesFilterDupe) diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinet.java b/src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinetDupe.java similarity index 96% rename from src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinet.java rename to src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinetDupe.java index db5101709..c702f4da1 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinet.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinetDupe.java @@ -20,7 +20,7 @@ import invtweaks.api.container.ContainerSection; @Mixin(value = ContainerFilingCabinet.class) -public abstract class MixinContainerFilingCabinet extends Container { +public abstract class MixinContainerFilingCabinetDupe extends Container { @Shadow(remap = false) public abstract Map> getSlots(); diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinetShiftClick.java b/src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinetShiftClick.java new file mode 100644 index 000000000..075b03fe2 --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/late/extrautilities/MixinContainerFilingCabinetShiftClick.java @@ -0,0 +1,57 @@ +package com.mitchej123.hodgepodge.mixins.late.extrautilities; + +import net.minecraft.inventory.Container; +import net.minecraft.item.ItemStack; + +import org.spongepowered.asm.lib.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.Redirect; + +import com.llamalad7.mixinextras.sugar.Local; +import com.rwtema.extrautils.gui.ContainerFilingCabinet; + +@Mixin(value = ContainerFilingCabinet.class) +public abstract class MixinContainerFilingCabinetShiftClick extends Container { + // The original code created a temp ItemStack, but still modified the original ItemStack's size before checking if + // the transfer could go through + + // modify temp ItemStack's size instead of original ItemStack + @Redirect( + method = "transferStackInSlot", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/item/ItemStack;stackSize:I", + opcode = Opcodes.PUTFIELD, + ordinal = 0)) + private void hodgepodge$modifyTempVariableStackSize(ItemStack itemstack1, int m, + @Local(name = "itemstack") ItemStack itemstack) { + itemstack.stackSize = m; + } + + // use temp ItemStack in the merge function instead of the original + @ModifyArg( + method = "transferStackInSlot", + at = @At( + value = "INVOKE", + target = "Lcom/rwtema/extrautils/gui/ContainerFilingCabinet;mergeItemStack(Lnet/minecraft/item/ItemStack;IIZ)Z", + ordinal = 0)) + private ItemStack hodgepodge$mergeItemStackWithTempVariable(ItemStack itemstack1, + @Local(name = "itemstack") ItemStack itemstack) { + return itemstack; + } + + // since mergeItemStack sets the size of the ItemStack to 0, use the outer "m" variable to decrease the original + // ItemStack's size + @Redirect( + method = "transferStackInSlot", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/item/ItemStack;stackSize:I", + opcode = Opcodes.PUTFIELD, + ordinal = 1)) + private void hodgepodge$decreaseStackSizeCorrectly(ItemStack itemstack1, int m, @Local(name = "m") int m_outer) { + itemstack1.stackSize -= m_outer; + } +}