From 951f941034b380408793106b0edb28a36c064a74 Mon Sep 17 00:00:00 2001 From: NotRyken <127091011+NotRyken@users.noreply.github.com> Date: Wed, 6 Nov 2024 16:23:24 +0800 Subject: [PATCH] Temp add brittle carried item auto-store for quick-craft --- .../mixin/accessor/MainAccessor.java | 14 +++ .../mixin/gui/other/MixinRecipeBookPage.java | 98 ++++++++++++++++++- .../resources/moremousetweaks.mixins.json | 1 + 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/dev/terminalmc/moremousetweaks/mixin/accessor/MainAccessor.java diff --git a/common/src/main/java/dev/terminalmc/moremousetweaks/mixin/accessor/MainAccessor.java b/common/src/main/java/dev/terminalmc/moremousetweaks/mixin/accessor/MainAccessor.java new file mode 100644 index 0000000..1783301 --- /dev/null +++ b/common/src/main/java/dev/terminalmc/moremousetweaks/mixin/accessor/MainAccessor.java @@ -0,0 +1,14 @@ +package dev.terminalmc.moremousetweaks.mixin.accessor; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import yalter.mousetweaks.IGuiScreenHandler; +import yalter.mousetweaks.Main; + +@Mixin(Main.class) +public interface MainAccessor { + @Accessor("handler") + static IGuiScreenHandler getHandler() { + throw new AssertionError(); + } +} diff --git a/common/src/main/java/dev/terminalmc/moremousetweaks/mixin/gui/other/MixinRecipeBookPage.java b/common/src/main/java/dev/terminalmc/moremousetweaks/mixin/gui/other/MixinRecipeBookPage.java index 3d18997..c590bb1 100644 --- a/common/src/main/java/dev/terminalmc/moremousetweaks/mixin/gui/other/MixinRecipeBookPage.java +++ b/common/src/main/java/dev/terminalmc/moremousetweaks/mixin/gui/other/MixinRecipeBookPage.java @@ -18,20 +18,30 @@ package dev.terminalmc.moremousetweaks.mixin.gui.other; import com.llamalad7.mixinextras.sugar.Local; +import dev.terminalmc.moremousetweaks.MoreMouseTweaks; +import dev.terminalmc.moremousetweaks.mixin.accessor.MainAccessor; import dev.terminalmc.moremousetweaks.util.inject.IRecipeBookResults; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.recipebook.RecipeBookPage; import net.minecraft.client.gui.screens.recipebook.RecipeButton; import net.minecraft.client.gui.screens.recipebook.RecipeCollection; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.RecipeHolder; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import yalter.mousetweaks.MouseButton; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import static dev.terminalmc.moremousetweaks.config.Config.options; @@ -50,8 +60,10 @@ public abstract class MixinRecipeBookPage implements IRecipeBookResults { private RecipeHolder lastClickedRecipe; @Shadow private RecipeCollection lastClickedRecipeCollection; - - @Override + @Shadow + private Minecraft minecraft; + + @Override public void mmt$setCurrentPage(int page) { currentPage = page; } @@ -85,8 +97,90 @@ public void mouseClicked(double mouseX, double mouseY, int button, int areaLeft, if (options().quickCrafting && button == MouseButton.RIGHT.getValue() && recipeButton.isOnlyOption()) { + + // Drop carried item if required + ItemStack carried = minecraft.player.containerMenu.getCarried(); + ItemStack result = recipeButton.getRecipe().value().getResultItem(minecraft.level.registryAccess()); + if (!carried.isEmpty() && (!ItemStack.isSameItemSameComponents(carried, result) + || carried.getCount() + result.getCount() > carried.getMaxStackSize())) { + MoreMouseTweaks.LOG.warn("tf1"); + mmt$tryPlaceCarried(carried.copy()); + } + lastClickedRecipe = recipeButton.getRecipe(); lastClickedRecipeCollection = recipeButton.getCollection(); } } + + + @Unique + public void mmt$tryPlaceCarried(ItemStack carried) { + if (carried.isEmpty()) return; + + Inventory inv = minecraft.player.getInventory(); + int maxStack = inv.getMaxStackSize(carried); + int remaining = carried.getCount(); + + List ignoredSlots = new ArrayList<>(); + while (remaining > 0) { + int i = mmt$getSlotForStack(inv, carried, ignoredSlots); + if (i == -1) { + i = mmt$getFreeSlot(inv); + MoreMouseTweaks.LOG.warn("finding free slot"); + } + if (i == -1) { + minecraft.gameMode.handleInventoryMouseClick( + minecraft.player.containerMenu.containerId, + AbstractContainerMenu.SLOT_CLICKED_OUTSIDE, + MouseButton.LEFT.getValue(), + ClickType.THROW, + minecraft.player); + break; + } + + ignoredSlots.add(i); + remaining -= maxStack - inv.getItem(i).getCount(); + MoreMouseTweaks.LOG.warn("placing in slot {} with item {}", i, inv.getItem(i).getDisplayName().getString()); + MainAccessor.getHandler().clickSlot( + minecraft.player.containerMenu.getSlot(i), MouseButton.LEFT, false); + } + } + + @Unique + public int mmt$getSlotForStack(Inventory inv, ItemStack stack, List ignoredSlots) { + if (!ignoredSlots.contains(inv.selected) + && this.mmt$hasSpace(inv, inv.getItem(inv.selected), stack)) { + return inv.selected; + } else if (!ignoredSlots.contains(Inventory.SLOT_OFFHAND) + && mmt$hasSpace(inv, inv.getItem(Inventory.SLOT_OFFHAND), stack)) { + return Inventory.SLOT_OFFHAND; + } else { + for (int i = 0; i < inv.items.size(); i++) { + if (!ignoredSlots.contains(i) && mmt$hasSpace(inv, inv.items.get(i), stack)) { + return i; + } + } + return -1; + } + } + + @Unique + private boolean mmt$hasSpace(Inventory inv, ItemStack destination, ItemStack origin) { + return !destination.isEmpty() + && ItemStack.isSameItemSameComponents(destination, origin) + && destination.isStackable() + && destination.getCount() < inv.getMaxStackSize(destination); + } + + @Unique + public int mmt$getFreeSlot(Inventory inv) { + for( + int i = 4; + i < inv.items.size() + 5; + ++i + ) { + if (inv.items.get(i).isEmpty()) return i; + } + return -1; + } } diff --git a/common/src/main/resources/moremousetweaks.mixins.json b/common/src/main/resources/moremousetweaks.mixins.json index 0e52665..c196bc1 100644 --- a/common/src/main/resources/moremousetweaks.mixins.json +++ b/common/src/main/resources/moremousetweaks.mixins.json @@ -7,6 +7,7 @@ "mixins": [ ], "client": [ + "accessor.MainAccessor", "MixinClientPacketListener", "MixinLocalPlayer", "gui.other.MixinAbstractWidget",