package com.austinv11.peripheralsplusplus.nei; import codechicken.lib.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.TemplateRecipeHandler; import com.austinv11.collectiveframework.minecraft.utils.NBTHelper; import com.austinv11.peripheralsplusplus.hooks.ComputerCraftNotFoundException; import com.austinv11.peripheralsplusplus.hooks.ComputerCraftRegistry; import com.austinv11.peripheralsplusplus.reference.Reference; import com.austinv11.peripheralsplusplus.utils.TurtleUtil; import cpw.mods.fml.common.registry.GameRegistry; import dan200.computercraft.api.turtle.ITurtleUpgrade; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import org.lwjgl.opengl.GL11; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class TurtleRecipeHandler extends TemplateRecipeHandler { private static final ResourceLocation TWO_INGREDIENTS = new ResourceLocation(Reference.MOD_ID.toLowerCase()+":textures/gui/turtleNEI.png"); private static final ResourceLocation THREE_INGREDIENTS = new ResourceLocation(Reference.MOD_ID.toLowerCase()+":textures/gui/turtleNEI2.png"); public TurtleRecipeHandler() { super(); } @Override public String getGuiTexture() { return "null"; } @Override public String getRecipeName() { return StatCollector.translateToLocal("peripheralsplusplus.nei.turtleRecipeHandler.name"); } @Override public String getOverlayIdentifier(){ return "turtle"; } @Override public int recipiesPerPage() { return 2; } @Override public void drawBackground(int recipe) { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GuiDraw.changeTexture(((CachedTurtleRecipe)arecipes.get(recipe)).hasThreeIngredients ? THREE_INGREDIENTS : TWO_INGREDIENTS); GuiDraw.drawTexturedModalRect(0, 0, 5, 11, 166, 65); } @Override public void loadCraftingRecipes(ItemStack result) { if (isItemStackTurtle(result)) { if (NBTHelper.hasTag(result, "leftUpgrade") || NBTHelper.hasTag(result, "rightUpgrade")) { Map<Integer, ITurtleUpgrade> upgrades = new HashMap<Integer, ITurtleUpgrade>(); try { upgrades = ComputerCraftRegistry.getTurtleUpgrades(); } catch (ComputerCraftNotFoundException e) { e.printStackTrace(); } if (NBTHelper.hasTag(result, "leftUpgrade") && NBTHelper.hasTag(result, "rightUpgrade")) { ITurtleUpgrade upgrade1 = upgrades.get((int)NBTHelper.getShort(result, "leftUpgrade")); ITurtleUpgrade upgrade2 = upgrades.get((int)NBTHelper.getShort(result, "rightUpgrade")); if (upgrade1 != null && upgrade2 != null) { if (upgrade1.getCraftingItem() != null && upgrade2.getCraftingItem() != null) this.arecipes.add(new CachedTurtleRecipe(upgrade1, upgrade2, isAdvanced(result))); } } else { boolean isLeft = NBTHelper.hasTag(result, "leftUpgrade"); ITurtleUpgrade upgrade = upgrades.get((int)NBTHelper.getShort(result, isLeft ? "leftUpgrade" : "rightUpgrade")); if (upgrade != null && upgrade.getCraftingItem() != null) this.arecipes.add(new CachedTurtleRecipe(upgrade, isAdvanced(result), isLeft)); } } } } @Override public void loadUsageRecipes(ItemStack ingredient) { if (isItemStackTurtle(ingredient)) { try { for (ITurtleUpgrade upgrade : ComputerCraftRegistry.getTurtleUpgrades().values()) { if (upgrade != null && upgrade.getCraftingItem() != null) this.arecipes.add(new CachedTurtleRecipe(upgrade, isAdvanced(ingredient), true)); } } catch (ComputerCraftNotFoundException e) { e.printStackTrace(); } } else { ITurtleUpgrade upgrade = null; try { upgrade = getUpgradeForIngredient(ingredient); } catch (ComputerCraftNotFoundException e) { e.printStackTrace(); } if (upgrade != null && upgrade.getCraftingItem() != null) { this.arecipes.add(new CachedTurtleRecipe(upgrade, true)); } } } private ITurtleUpgrade getUpgradeForIngredient(ItemStack ingredient) throws ComputerCraftNotFoundException { Map<Integer, ITurtleUpgrade> upgrades = ComputerCraftRegistry.getTurtleUpgrades(); for (ITurtleUpgrade upgrade : upgrades.values()) if (upgrade.getCraftingItem() != null) if (upgrade.getCraftingItem().isItemEqual(ingredient)) return upgrade; return null; } private boolean isItemStackTurtle(ItemStack stack) { return TurtleUtil.getTurtle(true).isItemEqual(stack) || TurtleUtil.getTurtle(false).isItemEqual(stack) || new ItemStack(GameRegistry.findBlock("ComputerCraft", "CC-TurtleExpanded")).isItemEqual(stack); } private boolean isAdvanced(ItemStack stack) { return stack.isItemEqual(TurtleUtil.getTurtle(true)); } public class CachedTurtleRecipe extends CachedRecipe { //FIXME: Item permutations public boolean hasThreeIngredients = false; private boolean genPerm = false; private List<PositionedStack> inputs = new ArrayList<PositionedStack>(); private PositionedStack result; private final int[] slot_0 = new int[]{19, 12}; private final int[] slot_1 = new int[]{68, 12}; private final int[] slot_2 = new int[]{126, 12}; private final int[] slot2_0 = new int[]{8, 12}; private final int[] slot2_1 = new int[]{47, 12}; private final int[] slot2_2 = new int[]{86, 12}; private final int[] slot2_3 = new int[]{134, 12}; public CachedTurtleRecipe(ITurtleUpgrade upgrade, boolean isLeft) { genPerm = true; if (!isLeft) { inputs.add(new PositionedStack(upgrade.getCraftingItem(), slot_0[0], slot_0[1])); inputs.add(new PositionedStack(new ItemStack[]{TurtleUtil.getTurtle(true), TurtleUtil.getTurtle(false)}, slot_1[0], slot_1[1])); result = new PositionedStack(new ItemStack[]{TurtleUtil.getTurtle(true, null, upgrade), TurtleUtil.getTurtle(false, null, upgrade)}, slot_2[0], slot_2[1]); } else { inputs.add(new PositionedStack(upgrade.getCraftingItem(), slot_1[0], slot_1[1])); inputs.add(new PositionedStack(new ItemStack[]{TurtleUtil.getTurtle(true), TurtleUtil.getTurtle(false)}, slot_0[0], slot_0[1])); result = new PositionedStack(new ItemStack[]{TurtleUtil.getTurtle(true, upgrade), TurtleUtil.getTurtle(false, upgrade)}, slot_2[0], slot_2[1]); } } public CachedTurtleRecipe(ITurtleUpgrade upgrade, boolean isAdvanced, boolean isLeft) { if (!isLeft) { inputs.add(new PositionedStack(upgrade.getCraftingItem(), slot_0[0], slot_0[1])); inputs.add(new PositionedStack(TurtleUtil.getTurtle(isAdvanced), slot_1[0], slot_1[1])); result = new PositionedStack(TurtleUtil.getTurtle(isAdvanced, null, upgrade), slot_2[0], slot_2[1]); } else { inputs.add(new PositionedStack(upgrade.getCraftingItem(), slot_1[0], slot_1[1])); inputs.add(new PositionedStack(TurtleUtil.getTurtle(isAdvanced), slot_0[0], slot_0[1])); result = new PositionedStack(TurtleUtil.getTurtle(isAdvanced, upgrade), slot_2[0], slot_2[1]); } } public CachedTurtleRecipe(ITurtleUpgrade upgrade1, ITurtleUpgrade upgrade2, boolean isAdvanced) { hasThreeIngredients = true; inputs.add(new PositionedStack(upgrade2.getCraftingItem(), slot2_0[0], slot2_0[1])); inputs.add(new PositionedStack(TurtleUtil.getTurtle(isAdvanced), slot2_1[0], slot2_1[1])); inputs.add(new PositionedStack(upgrade1.getCraftingItem(), slot2_2[0], slot2_2[1])); result = new PositionedStack(TurtleUtil.getTurtle(isAdvanced, upgrade1, upgrade2), slot2_3[0], slot2_3[1]); } @Override public PositionedStack getResult() { if (genPerm) result.generatePermutations(); return this.result; } @Override public List<PositionedStack> getIngredients() { if (genPerm) for (PositionedStack stack : inputs) stack.generatePermutations(); return this.inputs; } } }