diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java b/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java index 465b915c..d32c3757 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFluidCraftConfirm.java @@ -48,6 +48,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { private GuiButton start; private GuiButton selectCPU; private int tooltip = -1; + private ItemStack hoveredStack; public GuiFluidCraftConfirm(final InventoryPlayer inventoryPlayer, final ITerminalHost te ) { @@ -202,7 +203,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { final List lineList = new LinkedList(); int toolPosX = 0; int toolPosY = 0; - + hoveredStack = null; final int offY = 23; for( int z = viewStart; z < Math.min( viewEnd, this.visual.size() ); z++ ) @@ -324,6 +325,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { toolPosX = x * ( 1 + sectionLength ) + xo + sectionLength - 8; toolPosY = y * offY + yo; + hoveredStack = is; } this.drawItem( posX, posY, is ); @@ -551,4 +553,7 @@ public class GuiFluidCraftConfirm extends AEBaseGui { } } + public ItemStack getHoveredStack() { + return hoveredStack; + } } diff --git a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java index 413d8625..80c52cae 100644 --- a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java @@ -29,6 +29,9 @@ public class FCClassTransformer implements IClassTransformer { case "net.p455w0rd.wirelesscraftingterminal.client.gui.GuiCraftConfirm": tform = GuiCraftingTransformer.INSTANCE; break; + case "appeng.integration.modules.NEI": + tform = NEITransfermer.INSTANCE; + break; default: return code; } diff --git a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java index 380f8bb2..4edbd4b9 100644 --- a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java +++ b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java @@ -9,12 +9,15 @@ import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.IMEInventory; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; +import appeng.client.gui.implementations.GuiCraftConfirm; +import appeng.client.gui.implementations.GuiCraftingCPU; import appeng.crafting.MECraftingInventory; import appeng.me.MachineSet; import appeng.me.cluster.implementations.CraftingCPUCluster; import appeng.parts.misc.PartInterface; import appeng.tile.misc.TileInterface; import appeng.util.InventoryAdaptor; +import com.glodblock.github.client.gui.GuiFluidCraftConfirm; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidPacket; import com.glodblock.github.common.parts.PartFluidInterface; @@ -26,6 +29,7 @@ import com.glodblock.github.util.Ae2Reflect; import com.glodblock.github.util.SetBackedMachineSet; import com.glodblock.github.util.Util; import com.google.common.collect.Sets; +import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -169,4 +173,18 @@ public class CoreModHooks { Ae2Reflect.markCPUDirty(instance); } + public static ItemStack getStackUnderMouse(GuiContainer gui, int mousex, int mousey) { + if (gui instanceof GuiFluidCraftConfirm) { + return ((GuiFluidCraftConfirm) gui).getHoveredStack(); + } + return null; + } + + public static boolean shouldShowTooltip(GuiContainer gui) { + if (gui instanceof GuiFluidCraftConfirm) { + return ((GuiFluidCraftConfirm)gui).getHoveredStack() == null; + } + return true; + } + } diff --git a/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java b/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java new file mode 100644 index 00000000..95c28705 --- /dev/null +++ b/src/main/java/com/glodblock/github/coremod/transform/NEITransfermer.java @@ -0,0 +1,93 @@ +package com.glodblock.github.coremod.transform; + +import com.glodblock.github.coremod.FCClassTransformer; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +public class NEITransfermer extends FCClassTransformer.ClassMapper { + + public static final NEITransfermer INSTANCE = new NEITransfermer(); + + private NEITransfermer() { + // NO-OP + } + + @Override + protected ClassVisitor getClassMapper(ClassVisitor downstream) { + return new TransformNEI(Opcodes.ASM5, downstream); + } + + private static class TransformNEI extends ClassVisitor { + + TransformNEI(int api, ClassVisitor cv) { + super(api, cv); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + switch (name) { + case "getStackUnderMouse": + return new TransformStackUnderMouse(api, super.visitMethod(access, name, desc, signature, exceptions)); + case "shouldShowTooltip": + return new TransformShowTooltip(api, super.visitMethod(access, name, desc, signature, exceptions)); + default: + return super.visitMethod(access, name, desc, signature, exceptions); + } + } + } + + private static class TransformStackUnderMouse extends MethodVisitor { + + TransformStackUnderMouse(int api, MethodVisitor mv) { + super(api, mv); + } + + @Override + public void visitInsn(int opcode) { + if (opcode == Opcodes.ACONST_NULL) { + super.visitVarInsn(Opcodes.ALOAD, 1); + super.visitVarInsn(Opcodes.ILOAD, 2); + super.visitVarInsn(Opcodes.ILOAD, 3); + super.visitMethodInsn(Opcodes.INVOKESTATIC, + "com/glodblock/github/coremod/hooker/CoreModHooks", + "getStackUnderMouse", + "(Lnet/minecraft/client/gui/inventory/GuiContainer;II)Lnet/minecraft/item/ItemStack;", + false + ); + return; + } + super.visitInsn(opcode); + } + } + + private static class TransformShowTooltip extends MethodVisitor { + + int const_1 = 0; + + TransformShowTooltip(int api, MethodVisitor mv) { + super(api, mv); + } + + @Override + public void visitInsn(int opcode) { + if (opcode == Opcodes.ICONST_1 && const_1 == 2) { + super.visitVarInsn(Opcodes.ALOAD, 1); + super.visitMethodInsn(Opcodes.INVOKESTATIC, + "com/glodblock/github/coremod/hooker/CoreModHooks", + "shouldShowTooltip", + "(Lnet/minecraft/client/gui/inventory/GuiContainer;)Z", + false + ); + const_1 ++; + return; + } + if (opcode == Opcodes.ICONST_1) { + const_1 ++; + } + super.visitInsn(opcode); + } + + } + +} diff --git a/src/main/java/com/glodblock/github/inventory/AEFluidInventory.java b/src/main/java/com/glodblock/github/inventory/AEFluidInventory.java index 7365fba2..2e17578c 100644 --- a/src/main/java/com/glodblock/github/inventory/AEFluidInventory.java +++ b/src/main/java/com/glodblock/github/inventory/AEFluidInventory.java @@ -17,6 +17,7 @@ public class AEFluidInventory implements IAEFluidTank private final IAEFluidStack[] fluids; private final IAEFluidInventory handler; private final int capacity; + public int lastIndex; public AEFluidInventory( final IAEFluidInventory handler, final int slots, final int capcity ) { @@ -253,9 +254,10 @@ public class AEFluidInventory implements IAEFluidTank FluidStack totalDrained = null; int toDrain = maxDrain; - for( int slot = 0; slot < this.getSlots(); ++slot ) + for( int slot = lastIndex; slot < this.getSlots(); ++slot ) { if (this.getFluidInSlot(slot) == null) { + if(slot == this.getSlots()-1) lastIndex = 0; continue; } @@ -264,6 +266,7 @@ public class AEFluidInventory implements IAEFluidTank totalDrained = this.drain( slot, toDrain, doDrain ); if( totalDrained != null ) { + lastIndex = slot; toDrain -= totalDrained.amount; } } diff --git a/src/main/java/com/glodblock/github/inventory/gui/MouseRegionManager.java b/src/main/java/com/glodblock/github/inventory/gui/MouseRegionManager.java index 15cd3c3b..a4609837 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/MouseRegionManager.java +++ b/src/main/java/com/glodblock/github/inventory/gui/MouseRegionManager.java @@ -1,5 +1,6 @@ package com.glodblock.github.inventory.gui; +import appeng.client.gui.AEBaseGui; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.util.ResourceLocation; @@ -39,6 +40,7 @@ public class MouseRegionManager { if (region.containsMouse(mX, mY)) { List tooltip = region.handler.getTooltip(); if (tooltip != null) { + ((AEBaseGui)gui).drawTooltip(mX,mY,0,String.join("\n",tooltip)); return; } }