From 2bc7eb361ba01943f12e93dfa01ffebaa51dfe2d Mon Sep 17 00:00:00 2001 From: Chicken-Bomes Date: Thu, 1 May 2014 01:48:02 +1000 Subject: [PATCH] Fix vanilla issue with workbench deleting excess on shift click when only some of the result can fit in the player's inventory --- resources/assets/nei/asm/blocks.asm | 28 +++++++++++++++++++++ src/codechicken/nei/asm/NEITransformer.java | 13 ++++++++++ 2 files changed, 41 insertions(+) diff --git a/resources/assets/nei/asm/blocks.asm b/resources/assets/nei/asm/blocks.asm index a10b1527..83f9917c 100644 --- a/resources/assets/nei/asm/blocks.asm +++ b/resources/assets/nei/asm/blocks.asm @@ -23,6 +23,34 @@ ARETURN list commaFix INVOKESTATIC codechicken/nei/NEIServerUtils.fixTrailingCommaList(Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder; +list n_workbenchFix +ALOAD 0 +ALOAD 5 +BIPUSH 10 +BIPUSH 46 +ICONST_1 +INVOKEVIRTUAL net/minecraft/inventory/ContainerWorkbench.mergeItemStack (Lnet/minecraft/item/ItemStack;IIZ)Z + +list workbenchFix +NEW codechicken/lib/inventory/InventoryRange +DUP +ALOAD 0 +GETFIELD net/minecraft/inventory/ContainerWorkbench.inventorySlots : Ljava/util/List; +BIPUSH 10 +INVOKEINTERFACE java/util/List.get (I)Ljava/lang/Object; +CHECKCAST net/minecraft/inventory/Slot +GETFIELD net/minecraft/inventory/Slot.inventory : Lnet/minecraft/inventory/IInventory; +ICONST_0 +BIPUSH 36 +INVOKESPECIAL codechicken/lib/inventory/InventoryRange.(Lnet/minecraft/inventory/IInventory;II)V +ALOAD 5 +ICONST_1 +INVOKESTATIC codechicken/lib/inventory/InventoryUtils.insertItem(Lcodechicken/lib/inventory/InventoryRange;Lnet/minecraft/item/ItemStack;Z)I +IFEQ LCONT +ACONST_NULL +ARETURN +LCONT + #begin GuiContainer patches list m_getManager diff --git a/src/codechicken/nei/asm/NEITransformer.java b/src/codechicken/nei/asm/NEITransformer.java index 16870e1d..545a07f3 100644 --- a/src/codechicken/nei/asm/NEITransformer.java +++ b/src/codechicken/nei/asm/NEITransformer.java @@ -41,6 +41,18 @@ public class NEITransformer implements IClassTransformer transformer.add(new MethodInjector(new ObfMapping("net/minecraft/nbt/NBTTagList", "toString", "()Ljava/lang/String;"), asmblocks.get("n_commaFix"), asmblocks.get("commaFix"), true)); + //fix workbench container losing items on shift click output without room for the full stack + transformer.add(new MethodTransformer(new ObfMapping("net/minecraft/inventory/ContainerWorkbench", "func_82846_b", "(Lnet/minecraft/entity/player/EntityPlayer;I)Lnet/minecraft/item/ItemStack;")) + { + @Override + public void transform(MethodNode mv) { + ASMHelper.logger.debug("NEI: Applying workbench fix"); + InsnListSection key = findN(mv.instructions, asmblocks.get("n_workbenchFix").list).get(0); + key.insertBefore(asmblocks.get("workbenchFix").rawListCopy()); + } + }); + + String GuiContainer = "net/minecraft/client/gui/inventory/GuiContainer"; //add manager field transformer.add(new FieldWriter(ACC_PUBLIC, new ObfMapping(GuiContainer, "manager", "Lcodechicken/nei/guihook/GuiContainerManager;"))); @@ -117,6 +129,7 @@ public class NEITransformer implements IClassTransformer { @Override public void transform(MethodNode mv) { + ASMHelper.logger.debug("NEI: Injecting mouseUp call"); ASMBlock gotoBlock = asmblocks.get("n_mouseUpGoto"); ASMBlock needleBlock = asmblocks.get("n_mouseUp"); ASMBlock injectionBlock = asmblocks.get("mouseUp");