package crazypants.enderio.machine.invpanel.client;
import codechicken.nei.OffsetPositioner;
import codechicken.nei.PositionedStack;
import codechicken.nei.api.DefaultOverlayRenderer;
import codechicken.nei.api.IOverlayHandler;
import codechicken.nei.api.IStackPositioner;
import codechicken.nei.recipe.IRecipeHandler;
import crazypants.enderio.machine.invpanel.GuiInventoryPanel;
import crazypants.enderio.machine.invpanel.InventoryPanelContainer;
import java.util.List;
import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
public class InventoryPanelNEIOverlayHandler implements IOverlayHandler {
public static final int NEI_OFFSET_X = 25;
public static final int NEI_OFFSET_Y = 6;
private static final int CRAFTING_GRID_OFFSET_X = InventoryPanelContainer.CRAFTING_GRID_X - NEI_OFFSET_X;
private static final int CRAFTING_GRID_OFFSET_Y = InventoryPanelContainer.CRAFTING_GRID_Y - NEI_OFFSET_Y;
public static final IStackPositioner positioner = new OffsetPositioner(CRAFTING_GRID_OFFSET_X, CRAFTING_GRID_OFFSET_Y);
@Override
public void overlayRecipe(GuiContainer gui, IRecipeHandler recipe, int recipeIndex, boolean shift) {
GuiInventoryPanel guiInvPanel = (GuiInventoryPanel) gui;
List<PositionedStack> ingredients = recipe.getIngredientStacks(recipeIndex);
if(shift) {
shift = guiInvPanel.getContainer().clearCraftingGrid();
}
ItemStack[][] slots = mapSlots(ingredients, guiInvPanel.getContainer());
if(slots != null) {
CraftingHelperNEI helper = new CraftingHelperNEI(slots);
helper.overlayRenderer = new DefaultOverlayRenderer(ingredients, positioner);
guiInvPanel.setCraftingHelper(helper);
if(shift) {
helper.refill(guiInvPanel, 64);
}
} else {
guiInvPanel.setCraftingHelper(null);
}
}
private ItemStack[][] mapSlots(List<PositionedStack> ingredients, InventoryPanelContainer c) {
ItemStack[][] slots = new ItemStack[9][];
List<Slot> craftingGrid = c.getCraftingGridSlots();
int found = 0;
for(PositionedStack pstack : ingredients) {
for(int idx = 0; idx < 9 ; idx++) {
Slot slot = craftingGrid.get(idx);
if(slot.xDisplayPosition == pstack.relx + CRAFTING_GRID_OFFSET_X && slot.yDisplayPosition == pstack.rely + CRAFTING_GRID_OFFSET_Y) {
slots[idx] = pstack.items;
found++;
break;
}
}
}
if(found != ingredients.size()) {
return null;
}
return slots;
}
}