package com.projectzed.mod.integration.jei;
import com.projectzed.mod.ProjectZed;
import com.projectzed.mod.container.ContainerFabricationTable;
import mezz.jei.api.IModRegistry;
import mezz.jei.api.gui.IGuiIngredient;
import mezz.jei.api.gui.IGuiItemStackGroup;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.recipe.VanillaRecipeCategoryUid;
import mezz.jei.api.recipe.transfer.IRecipeTransferError;
import mezz.jei.api.recipe.transfer.IRecipeTransferHandler;
import mezz.jei.api.recipe.transfer.IRecipeTransferRegistry;
import mezz.jei.transfer.BasicRecipeTransferInfo;
import mezz.jei.util.StackHelper;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Fabrication table JEI handler.
*
* @author hockeyhurd
* @version 10/25/2016.
*/
public class FabricationTableRecipeTransferHandler implements IRecipeTransferHandler {
private final IModRegistry registry;
private final @Nonnull BasicRecipeTransferInfo transferInfo;
private FabricationTableRecipeTransferHandler(IModRegistry registry) {
this.registry = registry;
transferInfo = new BasicRecipeTransferInfo<ContainerFabricationTable>(ContainerFabricationTable.class, VanillaRecipeCategoryUid.CRAFTING, 0, 9, 10, 6 * 12);
}
public static void register(IModRegistry registry) {
final IRecipeTransferRegistry recipeTransferRegistry = registry.getRecipeTransferRegistry();
recipeTransferRegistry.addRecipeTransferHandler(new FabricationTableRecipeTransferHandler(registry));
registry.addRecipeCategoryCraftingItem(new ItemStack(ProjectZed.fabricationTable), VanillaRecipeCategoryUid.CRAFTING);
}
@Override
public Class getContainerClass() {
return ContainerFabricationTable.class;
}
@Override
public String getRecipeCategoryUid() {
return VanillaRecipeCategoryUid.CRAFTING;
}
@Nullable
@Override
public IRecipeTransferError transferRecipe(Container container, IRecipeLayout recipeLayout, EntityPlayer player, boolean maxTransfer,
boolean doTransfer) {
if (!(container instanceof ContainerFabricationTable))
return registry.getJeiHelpers().recipeTransferHandlerHelper().createInternalError();
final ContainerFabricationTable containerFabTable = (ContainerFabricationTable) container;
if (doTransfer) containerFabTable.clearCraftingGrid();
List<Integer> missingItemSlots = new ArrayList<Integer>();
ItemStack[][] ingredients = new ItemStack[9][];
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
Map<Integer, ? extends IGuiIngredient<ItemStack>> guiIngredients = itemStacks.getGuiIngredients();
// final int limitTransfer = maxTransfer ? 0x40 : 1;
for (int i = 0; i < 9; i++) {
final int slotOffset = i + 1;
if (guiIngredients.containsKey(slotOffset)) {
final List<ItemStack> allIngredients = guiIngredients.get(slotOffset).getAllIngredients();
if (!allIngredients.isEmpty()) {
if (containerContainsIngredient(containerFabTable, allIngredients))
ingredients[i] = allIngredients.toArray(new ItemStack[allIngredients.size()]);
else missingItemSlots.add(slotOffset);
}
}
}
if (missingItemSlots.isEmpty()) {
if (doTransfer) containerFabTable.fillCraftingGrid(ingredients, maxTransfer ? 0x40 : 1);
return null;
}
return registry.getJeiHelpers().recipeTransferHandlerHelper().createUserErrorForSlots("Recipe transfer error!", missingItemSlots);
}
private boolean containerContainsIngredient(ContainerFabricationTable container, List<ItemStack> ingredientList) {
List<Slot> slots = transferInfo.getInventorySlots(container);
List<ItemStack> availableItems = new ArrayList<ItemStack>(slots.size() << 1);
for (Slot slot : slots) {
if (slot.getHasStack()) availableItems.add(slot.getStack());
}
final StackHelper stackHelper = (StackHelper) registry.getJeiHelpers().getStackHelper();
return stackHelper.containsAnyStack(availableItems, ingredientList) != null;
}
}