package pneumaticCraft.common.thirdparty.nei; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.Gui; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; import pneumaticCraft.api.recipe.AssemblyRecipe; import pneumaticCraft.common.block.Blockss; import pneumaticCraft.common.item.ItemAssemblyProgram; import pneumaticCraft.common.item.Itemss; import pneumaticCraft.common.recipes.programs.AssemblyProgram; import pneumaticCraft.lib.Textures; import codechicken.nei.NEIClientUtils; import codechicken.nei.PositionedStack; import cpw.mods.fml.client.FMLClientHandler; public class NEIAssemblyControllerRecipeManager extends PneumaticCraftPlugins{ ResourceLocation texture; @Override public String getRecipeName(){ return "Assembly Controller"; } @Override public String getGuiTexture(){ return Textures.GUI_NEI_ASSEMBLY_CONTROLLER; } @Override public void drawBackground(int recipe){ if(texture == null) texture = new ResourceLocation(getGuiTexture()); FMLClientHandler.instance().getClient().getTextureManager().bindTexture(texture); GL11.glColor4f(1, 1, 1, 1); Gui.func_146110_a(0, 0, 5, 11, 166, 130, 256, 256); } private String getRecipesID(){ return "AssemblyController"; } @Override public void loadTransferRects(){ transferRects.add(new RecipeTransferRect(new Rectangle(68, 75, 24, 17), getRecipesID())); } @Override public void loadCraftingRecipes(String outputId, Object... results){ if(outputId.equals(getRecipesID())) { for(int i = 0; i < ItemAssemblyProgram.PROGRAMS_AMOUNT; i++) { AssemblyProgram program = ItemAssemblyProgram.getProgramFromItem(i); for(int j = 0; j < program.getRecipeList().size(); j++) arecipes.add(getShape(i, j)); } } else super.loadCraftingRecipes(outputId, results); } protected MultipleInputOutputRecipe getShape(int programMetadata, int recipeIndex){ AssemblyProgram program = ItemAssemblyProgram.getProgramFromItem(programMetadata); AssemblyRecipe recipe = program.getRecipeList().get(recipeIndex); MultipleInputOutputRecipe shape = new MultipleInputOutputRecipe(); ItemStack[] inputStacks = new ItemStack[]{recipe.getInput()};//for now not useful to put it in an array, but supports when adding multiple input/output. for(int i = 0; i < inputStacks.length; i++) { PositionedStack stack = new PositionedStack(inputStacks[i], 29 + i % 2 * 18, 66 + i / 2 * 18); shape.addIngredient(stack); } ItemStack[] outputStacks = new ItemStack[]{recipe.getOutput()}; for(int i = 0; i < outputStacks.length; i++) { PositionedStack stack = new PositionedStack(outputStacks[i], 96 + i % 2 * 18, 66 + i / 2 * 18); shape.addOutput(stack); } shape.addIngredient(new PositionedStack(new ItemStack(Itemss.assemblyProgram, 1, programMetadata), 133, 22)); ItemStack[] requiredMachines = getMachinesFromEnum(program.getRequiredMachines()); for(int i = 0; i < requiredMachines.length; i++) { shape.addIngredient(new PositionedStack(requiredMachines[i], 5 + i * 18, 25)); } return shape; } protected ItemStack[] getMachinesFromEnum(AssemblyProgram.EnumMachine[] requiredMachines){ ItemStack[] machineStacks = new ItemStack[requiredMachines.length]; for(int i = 0; i < requiredMachines.length; i++) { switch(requiredMachines[i]){ case PLATFORM: machineStacks[i] = new ItemStack(Blockss.assemblyPlatform); break; case DRILL: machineStacks[i] = new ItemStack(Blockss.assemblyDrill); break; case LASER: machineStacks[i] = new ItemStack(Blockss.assemblyLaser); break; case IO_UNIT_IMPORT: machineStacks[i] = new ItemStack(Blockss.assemblyIOUnit, 1, 0); break; case IO_UNIT_EXPORT: machineStacks[i] = new ItemStack(Blockss.assemblyIOUnit, 1, 1); break; } } return machineStacks; } @Override public void loadCraftingRecipes(ItemStack result){ for(int i = 0; i < ItemAssemblyProgram.PROGRAMS_AMOUNT; i++) { AssemblyProgram program = ItemAssemblyProgram.getProgramFromItem(i); for(int j = 0; j < program.getRecipeList().size(); j++) { if(NEIClientUtils.areStacksSameTypeCrafting(program.getRecipeList().get(j).getOutput(), result)) { arecipes.add(getShape(i, j)); break; } } } } @Override public void loadUsageRecipes(ItemStack ingredient){ for(int i = 0; i < ItemAssemblyProgram.PROGRAMS_AMOUNT; i++) { AssemblyProgram program = ItemAssemblyProgram.getProgramFromItem(i); boolean[] addedRecipe = new boolean[program.getRecipeList().size()]; for(int j = 0; j < program.getRecipeList().size(); j++) { if(NEIClientUtils.areStacksSameTypeCrafting(program.getRecipeList().get(j).getInput(), ingredient)) { arecipes.add(getShape(i, j)); addedRecipe[j] = true; } } if(ingredient.getItem() == Itemss.assemblyProgram && ingredient.getItemDamage() == i) { for(int j = 0; j < program.getRecipeList().size(); j++) if(!addedRecipe[j]) arecipes.add(getShape(i, j)); } else { for(ItemStack machine : getMachinesFromEnum(program.getRequiredMachines())) { if(NEIClientUtils.areStacksSameTypeCrafting(machine, ingredient)) { for(int j = 0; j < program.getRecipeList().size(); j++) if(!addedRecipe[j]) arecipes.add(getShape(i, j)); break; } } } } } /* @Override public Class<? extends GuiContainer> getGuiClass(){ return GuiAssemblyController.class; }*/ @Override public boolean hasOverlay(GuiContainer gui, Container container, int recipe){ return false; } @Override public void drawExtras(int recipe){ drawProgressBar(68, 75, 173, 0, 24, 17, 48, 0); FontRenderer fontRenderer = FMLClientHandler.instance().getClient().fontRenderer; fontRenderer.drawString("Required Machines", 5, 15, 4210752); fontRenderer.drawString("Prog.", 129, 9, 4210752); } @Override protected List<MultipleInputOutputRecipe> getAllRecipes(){ return new ArrayList<MultipleInputOutputRecipe>(); } }