package com.austinv11.thaumicnei.overlay; import codechicken.nei.*; import codechicken.nei.api.DefaultOverlayRenderer; import codechicken.nei.api.IOverlayHandler; import codechicken.nei.api.IStackPositioner; import codechicken.nei.guihook.GuiContainerManager; import codechicken.nei.recipe.IRecipeHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import java.util.List; public class OverlayHandler implements IOverlayHandler{ private int xOffset, yOffset; private Class<? extends Slot> slot; public OverlayHandler(int xOff, int yOff, Class<? extends Slot> slot) { super(); xOffset = xOff; yOffset = yOff; this.slot = slot; } private Slot findCorrespondingSlot(GuiContainer container, PositionedStack stack) { for (Object slot : container.inventorySlots.inventorySlots) { Slot slot2 = (Slot) slot; if ((slot2.xDisplayPosition == stack.relx + xOffset) && (slot2.yDisplayPosition == stack.rely + yOffset)) { return slot2; } } return null; } private Slot findStartingSlot(GuiContainer container, PositionedStack stack) { for (ItemStack item : stack.items) { for (Object slot : container.inventorySlots.inventorySlots) { Slot slot2 = (Slot) slot; if ((slot2.inventory == Minecraft.getMinecraft().thePlayer.inventory) || (slot.getClass() == Slot.class)) { ItemStack item2 = slot2.getStack(); if (item != null && NEIServerUtils.areStacksSameType(item, item2)) { return slot2; } } } } return null; } @Override public void overlayRecipe(GuiContainer guiContainer, IRecipeHandler recipeHandler, int index, boolean shift) { List<PositionedStack> ingredients = recipeHandler.getIngredientStacks(index); if (!shift) { IStackPositioner positioner = new OffsetPositioner(xOffset, yOffset); LayoutManager.overlayRenderer = new DefaultOverlayRenderer(ingredients, positioner); }else { if (NEIClientUtils.getHeldItem() != null) { return; } GuiContainerManager manager = GuiContainerManager.getManager(guiContainer); for (Object slot : guiContainer.inventorySlots.inventorySlots) { if (this.slot.isInstance(slot)) { Slot slot2 = (Slot) slot; manager.handleSlotClick(slot2.slotNumber, 0, 1); } } for (PositionedStack stack : ingredients) { if (stack != null) { Slot slotTo = findCorrespondingSlot(guiContainer, stack); if (slotTo != null) { Slot slotFrom = findStartingSlot(guiContainer, stack); if (slotFrom != null) { manager.handleSlotClick(slotFrom.slotNumber, 0, 0); manager.handleSlotClick(slotTo.slotNumber, 1, 0); manager.handleSlotClick(slotFrom.slotNumber, 0, 0); } } } } } } }