package zmaster587.advancedRocketry.integration.nei; import static codechicken.lib.gui.GuiDraw.changeTexture; import static codechicken.lib.gui.GuiDraw.drawTexturedModalRect; import java.awt.Point; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidContainerItem; import org.lwjgl.opengl.GL11; import zmaster587.advancedRocketry.integration.nei.PositionedFluidStack; import zmaster587.advancedRocketry.inventory.TextureResources; import zmaster587.libVulpes.client.util.ProgressBarImage; import zmaster587.libVulpes.interfaces.IRecipe; import zmaster587.libVulpes.recipe.RecipesMachine; import zmaster587.libVulpes.recipe.RecipesMachine.Recipe; import zmaster587.libVulpes.util.ZUtils; import codechicken.lib.gui.GuiDraw; import codechicken.nei.NEIServerUtils; import codechicken.nei.PositionedStack; import codechicken.nei.guihook.GuiContainerManager; import codechicken.nei.recipe.GuiRecipe; import codechicken.nei.recipe.TemplateRecipeHandler; public abstract class TemplateNEI extends TemplateRecipeHandler { public class CachedMachineRecipe extends CachedRecipe { private ArrayList<PositionedStack> ingredients; private ArrayList<PositionedStack> result; private ArrayList<PositionedFluidStack> fluids; private int energy, time; CachedMachineRecipe(IRecipe rec) { //TODO: multiple outputs result = new ArrayList<PositionedStack>(); fluids = new ArrayList<PositionedFluidStack>(); int inputIndex = 0; int outputIndex = 0; for(int i = 0; i < rec.getOutput().size(); i++, inputIndex++ ) { result.add(new PositionedStack(rec.getOutput().get(i), 112+ 18*(i%3), 4 + 18*(i/3))); } ingredients = new ArrayList<PositionedStack>(); for(int i = 0; i < rec.getIngredients().size(); i++, outputIndex++ ) { ingredients.add(new PositionedStack(rec.getIngredients().get(i), 4 + 18*(i%3), 4 + 18*(i/3))); } for(int i = 0; i < rec.getFluidIngredients().size(); i++, inputIndex++) { fluids.add(new PositionedFluidStack(rec.getFluidIngredients().get(i), 4 + 18*(inputIndex%3), 4 + 18*(inputIndex/3))); } for(int i = 0; i < rec.getFluidOutputs().size(); i++, outputIndex++) { fluids.add(new PositionedFluidStack(rec.getFluidOutputs().get(i), 112+ 18*(outputIndex%3), 4 + 18*(outputIndex/3))); } energy = rec.getPower(); time = rec.getTime(); } public void computeVisuals() { for (PositionedStack p : ingredients) p.generatePermutations(); } public List<PositionedStack> getResults() { return result; } @Override public List<PositionedStack> getOtherStacks() { return getResults(); } public PositionedStack getResult() { return null;//result.get(0); } @Override public List<PositionedStack> getIngredients() { return getCycledIngredients(TemplateNEI.this.cycleticks / 20, ingredients); } public List<PositionedFluidStack> getFluids() { return fluids; } public int getEnergy() {return energy;} public int getTime() {return time;} } protected abstract Class getMachine(); protected abstract ProgressBarImage getProgressBar(); @Override public void loadTransferRects() { transferRects.add(new RecipeTransferRect(new Rectangle(58, 6, 41, 54), getRecipeName())); } /*@Override public List<Class<? extends GuiContainer>> getRecipeTransferRectGuis() { List list= new LinkedList(); list.add(GuiModular.class); return list; }*/ public void loadCraftingRecipes(ItemStack result) { super.loadCraftingRecipes(result); for(IRecipe i : RecipesMachine.getInstance().getRecipes(getMachine())) { IRecipe newRecipe = i; boolean match = false; for(ItemStack stack : i.getOutput() ) { match = NEIServerUtils.areStacksSameTypeCrafting(stack, result) || ZUtils.areOresSameTypeOreDict(stack, result); if(match) break; } if(!match && (FluidContainerRegistry.isFilledContainer(result) || result.getItem() instanceof IFluidContainerItem || (Block.getBlockFromItem(result.getItem()) != Blocks.air && FluidRegistry.lookupFluidForBlock(Block.getBlockFromItem(result.getItem())) != null ))) { FluidStack fluidStack = null; if(result.getItem() instanceof IFluidContainerItem) fluidStack = ((IFluidContainerItem)result.getItem()).getFluid(result); else if(FluidContainerRegistry.isFilledContainer(result) && FluidContainerRegistry.isFilledContainer(result)) fluidStack = FluidContainerRegistry.getFluidForFilledItem(result); for(FluidStack stack : ((Recipe)i).getFluidOutputs() ) { if((fluidStack != null && fluidStack.getFluid() == stack.getFluid()) || (Block.getBlockFromItem(result.getItem()) != Blocks.air && FluidRegistry.lookupFluidForBlock(Block.getBlockFromItem(result.getItem())) == stack.getFluid() )) { match = true; break; } } } if(match) { CachedMachineRecipe recipe = new CachedMachineRecipe(((Recipe)i)); recipe.computeVisuals(); arecipes.add(recipe); match = false; } } } public void loadAllRecipes() { for(IRecipe i : RecipesMachine.getInstance().getRecipes(getMachine())) { arecipes.add(new CachedMachineRecipe((Recipe)i)); } } @Override public void loadCraftingRecipes(String outputId, Object... results) { super.loadCraftingRecipes(outputId, results); if(outputId.equals(getRecipeName())) { loadAllRecipes(); } } @Override public void loadUsageRecipes(ItemStack ingredient) { for(IRecipe irecipe : RecipesMachine.getInstance().getRecipes(getMachine())) { CachedMachineRecipe recipe = new CachedMachineRecipe((((Recipe)irecipe).getRecipeAsAllItemsOnly())); boolean match = false; for(PositionedStack posStack : recipe.getIngredients()) { if(posStack.item.isItemEqual(ingredient) || ZUtils.areOresSameTypeOreDict(posStack.item, ingredient)) { recipe.setIngredientPermutation(recipe.ingredients, ingredient); arecipes.add(recipe); match = true; break; } } if(!match && (FluidContainerRegistry.isFilledContainer(ingredient) || ingredient.getItem() instanceof IFluidContainerItem || (Block.getBlockFromItem(ingredient.getItem()) != Blocks.air && FluidRegistry.lookupFluidForBlock(Block.getBlockFromItem(ingredient.getItem())) != null ))) { FluidStack fluidStack = null; if(ingredient.getItem() instanceof IFluidContainerItem) fluidStack = ((IFluidContainerItem)ingredient.getItem()).getFluid(ingredient); else if(FluidContainerRegistry.isFilledContainer(ingredient) && FluidContainerRegistry.isFilledContainer(ingredient)) fluidStack = FluidContainerRegistry.getFluidForFilledItem(ingredient); for(FluidStack stack : ((Recipe)irecipe).getFluidIngredients() ) { if((fluidStack != null && fluidStack.getFluid() == stack.getFluid()) || (Block.getBlockFromItem(ingredient.getItem()) != Blocks.air && FluidRegistry.lookupFluidForBlock(Block.getBlockFromItem(ingredient.getItem())) == stack.getFluid() )) { recipe.setIngredientPermutation(recipe.ingredients, ingredient); arecipes.add(recipe); break; } } } } } @Override public int recipiesPerPage() { return 1; } @Override public void drawBackground(int recipe) { GL11.glColor4f(1, 1, 1, 1); changeTexture(getGuiTexture()); drawTexturedModalRect(3,3, 7, 16, 163, 55); } @Override public void drawForeground(int recipe) { super.drawForeground(recipe); this.drawFluidTanks((CachedMachineRecipe)arecipes.get(recipe)); GuiDraw.drawString(((CachedMachineRecipe)arecipes.get(recipe)).getEnergy() + " RF/t", 4, 60, 0x3d3d3d, false); GuiDraw.drawString(((CachedMachineRecipe)arecipes.get(recipe)).getTime()/20 + " Seconds", 4, 70, 0x3d3d3d, false); } @Override public void drawExtras(int recipe) { ProgressBarImage progressBar = getProgressBar(); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureResources.progressBars); drawTexturedModalRect(65, 3, progressBar.getBackOffsetX(), progressBar.getBackOffsetY(), progressBar.getBackWidth(), progressBar.getBackHeight()); drawProgressBar(65 + progressBar.getInsetX(), 3 + + progressBar.getInsetY(), progressBar.getForeOffsetX(), progressBar.getForeOffsetY(), progressBar.getForeWidth(), progressBar.getForeHeight(), 50, progressBar.getDirection().getRotation(ForgeDirection.SOUTH).ordinal()); } public void drawFluidTanks(CachedMachineRecipe r) { if (r.getFluids() != null) { for (PositionedFluidStack fluidTank : r.getFluids()) { fluidTank.draw(); } } } public List<String> provideTooltip(GuiRecipe guiRecipe, List<String> currenttip, CachedMachineRecipe crecipe, Point relMouse) { if (crecipe.getFluids() != null) { for (PositionedFluidStack tank : crecipe.getFluids()) { if (relMouse.x > tank.posX && relMouse.x < tank.posX + PositionedFluidStack.size && relMouse.y > tank.posY && relMouse.y < tank.posY + PositionedFluidStack.size) { tank.handleTooltip(currenttip); } } } return currenttip; } @Override public List<String> handleTooltip(GuiRecipe guiRecipe, List<String> currenttip, int recipe) { super.handleTooltip(guiRecipe, currenttip, recipe); CachedMachineRecipe crecipe = (CachedMachineRecipe) this.arecipes.get(recipe); if (GuiContainerManager.shouldShowTooltip(guiRecipe)) { Point mouse = GuiDraw.getMousePosition(); Point offset = guiRecipe.getRecipePosition(recipe); Point relMouse = new Point(mouse.x - (guiRecipe.width - 176) / 2 - offset.x, mouse.y - (guiRecipe.height - 166) / 2 - offset.y); currenttip = this.provideTooltip(guiRecipe, currenttip, crecipe, relMouse); } return currenttip; } @Override public String getGuiTexture() { return "advancedrocketry:textures/gui/GenericNeiBackground.png"; } }