package mekanism.common.base; import java.util.Map; import mekanism.api.gas.Gas; import mekanism.api.gas.GasStack; import mekanism.api.util.StackUtils; import mekanism.common.InfuseStorage; import mekanism.common.block.states.BlockStateMachine.MachineType; import mekanism.common.recipe.RecipeHandler; import mekanism.common.recipe.RecipeHandler.Recipe; import mekanism.common.recipe.inputs.AdvancedMachineInput; import mekanism.common.recipe.inputs.InfusionInput; import mekanism.common.recipe.inputs.ItemStackInput; import mekanism.common.recipe.machines.AdvancedMachineRecipe; import mekanism.common.recipe.machines.BasicMachineRecipe; import mekanism.common.recipe.machines.MachineRecipe; import mekanism.common.recipe.machines.MetallurgicInfuserRecipe; import mekanism.common.tile.TileEntityAdvancedElectricMachine; import mekanism.common.util.LangUtils; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumFacing; import net.minecraft.util.IStringSerializable; import net.minecraft.util.ResourceLocation; /** * Internal interface for managing various Factory types. * @author AidanBrady * */ public interface IFactory { /** * Gets the recipe type this Smelting Factory currently has. * @param itemStack - stack to check * @return RecipeType ordinal */ public int getRecipeType(ItemStack itemStack); /** * Sets the recipe type of this Smelting Factory to a new value. * @param type - RecipeType ordinal * @param itemStack - stack to set */ public void setRecipeType(int type, ItemStack itemStack); public static enum RecipeType implements IStringSerializable { SMELTING("Smelting", "smelter", MachineType.ENERGIZED_SMELTER, false, false, Recipe.ENERGIZED_SMELTER), ENRICHING("Enriching", "enrichment", MachineType.ENRICHMENT_CHAMBER, false, false, Recipe.ENRICHMENT_CHAMBER), CRUSHING("Crushing", "crusher", MachineType.CRUSHER, false, false, Recipe.CRUSHER), COMPRESSING("Compressing", "compressor", MachineType.OSMIUM_COMPRESSOR, true, false, Recipe.OSMIUM_COMPRESSOR), COMBINING("Combining", "combiner", MachineType.COMBINER, true, false, Recipe.COMBINER), PURIFYING("Purifying", "purifier", MachineType.PURIFICATION_CHAMBER, true, true, Recipe.PURIFICATION_CHAMBER), INJECTING("Injecting", "injection", MachineType.CHEMICAL_INJECTION_CHAMBER, true, true, Recipe.CHEMICAL_INJECTION_CHAMBER), INFUSING("Infusing", "metalinfuser", MachineType.METALLURGIC_INFUSER, false, false, Recipe.METALLURGIC_INFUSER); private String name; private ResourceLocation sound; private MachineType type; private boolean usesFuel; private boolean fuelSpeed; private Recipe recipe; private TileEntityAdvancedElectricMachine cacheTile; public BasicMachineRecipe getRecipe(ItemStackInput input) { return RecipeHandler.getRecipe(input, recipe.get()); } public BasicMachineRecipe getRecipe(ItemStack input) { return getRecipe(new ItemStackInput(input)); } public AdvancedMachineRecipe getRecipe(AdvancedMachineInput input) { return RecipeHandler.getRecipe(input, recipe.get()); } public AdvancedMachineRecipe getRecipe(ItemStack input, Gas gas) { return getRecipe(new AdvancedMachineInput(input, gas)); } public MetallurgicInfuserRecipe getRecipe(InfusionInput input) { return RecipeHandler.getMetallurgicInfuserRecipe(input); } public MetallurgicInfuserRecipe getRecipe(ItemStack input, InfuseStorage storage) { return getRecipe(new InfusionInput(storage, input)); } public MachineRecipe getAnyRecipe(ItemStack slotStack, Gas gasType, InfuseStorage infuse) { if(usesFuel()) { return getRecipe(slotStack, gasType); } else if(this == INFUSING) { if(infuse.type != null) { return RecipeHandler.getMetallurgicInfuserRecipe(new InfusionInput(infuse, slotStack)); } else { for(Object obj : Recipe.METALLURGIC_INFUSER.get().entrySet()) { Map.Entry entry = (Map.Entry)obj; InfusionInput input = (InfusionInput)entry.getKey(); if(input.inputStack.isItemEqual(slotStack)) { return (MetallurgicInfuserRecipe)entry.getValue(); } } } } return getRecipe(slotStack); } public GasStack getItemGas(ItemStack itemstack) { if(usesFuel) { return getTile().getItemGas(itemstack); } return null; } public int getSecondaryEnergyPerTick() { if(usesFuel) { return getTile().BASE_SECONDARY_ENERGY_PER_TICK; } return 0; } public boolean canReceiveGas(EnumFacing side, Gas type) { if(usesFuel) { return getTile().canReceiveGas(side, type); } return false; } public boolean canTubeConnect(EnumFacing side) { if(usesFuel) { return getTile().canTubeConnect(side); } return false; } public boolean isValidGas(Gas gas) { if(usesFuel) { return getTile().isValidGas(gas); } return false; } public boolean hasRecipe(ItemStack itemStack) { if(itemStack == null) { return false; } for(Object obj : recipe.get().entrySet()) { if(((Map.Entry)obj).getKey() instanceof AdvancedMachineInput) { Map.Entry entry = (Map.Entry)obj; ItemStack stack = ((AdvancedMachineInput)entry.getKey()).itemStack; if(StackUtils.equalsWildcard(stack, itemStack)) { return true; } } } return false; } public TileEntityAdvancedElectricMachine getTile() { if(cacheTile == null) { MachineType type = MachineType.get(getStack()); cacheTile = (TileEntityAdvancedElectricMachine)type.create(); } return cacheTile; } public int getMaxSecondaryEnergy() { return 200; } public ItemStack getStack() { return type.getStack(); } public String getUnlocalizedName() { return name; } public String getLocalizedName() { return LangUtils.localize("gui.factory." + name); } public ResourceLocation getSound() { return sound; } public boolean usesFuel() { return usesFuel; } public boolean fuelEnergyUpgrades() { return fuelSpeed; } public static RecipeType getFromMachine(Block block, int meta) { RecipeType type = null; for(RecipeType iterType : RecipeType.values()) { ItemStack machineStack = iterType.getStack(); if(Block.getBlockFromItem(machineStack.getItem()) == block && machineStack.getItemDamage() == meta) { type = iterType; break; } } return type; } private RecipeType(String s, String s1, MachineType t, boolean b, boolean b1, Recipe r) { name = s; sound = new ResourceLocation("mekanism", "tile.machine." + s1); type = t; usesFuel = b; fuelSpeed = b1; recipe = r; } @Override public String getName() { return name().toLowerCase(); } } }