package codechicken.nei.api; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.GuiOverlayButton.ItemOverlayState; import codechicken.nei.recipe.IRecipeHandler; public interface IOverlayHandler { void overlayRecipe(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex, boolean maxTransfer); default int transferRecipe(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex, int multiplier) { return 0; } default boolean canFillCraftingGrid(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex) { return true; } default boolean craft(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex, int multiplier) { return false; } default boolean canCraft(GuiContainer firstGui, IRecipeHandler handler, int recipeIndex) { return false; } default List presenceOverlay(GuiContainer firstGui, IRecipeHandler recipe, int recipeIndex) { final List itemPresenceSlots = new ArrayList<>(); final List ingredients = recipe.getIngredientStacks(recipeIndex); final List invStacks = firstGui.inventorySlots.inventorySlots.stream() .filter( s -> s != null && s.getStack() != null && s.getStack().stackSize > 0 && s.isItemValid(s.getStack()) && s.canTakeStack(firstGui.mc.thePlayer)) .map(s -> s.getStack().copy()).collect(Collectors.toList()); for (PositionedStack stack : ingredients) { Optional used = invStacks.stream().filter(is -> is.stackSize > 0 && stack.contains(is)) .findAny(); itemPresenceSlots.add(new ItemOverlayState(stack, used.isPresent())); if (used.isPresent()) { ItemStack is = used.get(); is.stackSize -= 1; } } return itemPresenceSlots; } }