package mods.eln.fluid; import mods.eln.misc.INBTTReady; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.*; /** * Use one of these if you want your block to support Forge fluids! * <p> * See the steam turbine for an example. */ public class ElementFluidHandler implements IFluidHandler, INBTTReady { private Fluid[] whitelist; private float fluid_heat_mb = 0; FluidTank tank; /** * Stores fluids. * * @param tankSize Tank size, in mB. */ public ElementFluidHandler(int tankSize) { tank = new FluidTank(tankSize); } public void setFilter(Fluid[] whitelist) { assert whitelist != null; this.whitelist = whitelist; } public float getHeatEnergyPerMilliBucket() { if (fluid_heat_mb == 0 && tank.getFluid() != null) setHeatEnergyPerMilliBucket(tank.getFluid().getFluid()); return fluid_heat_mb; } private void setHeatEnergyPerMilliBucket(Fluid fluid) { fluid_heat_mb = (float) FuelRegistry.INSTANCE.heatEnergyPerMilliBucket(fluid); } @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { if (tank.getFluidAmount() > 0) { // No change in type of fluid. return tank.fill(resource, doFill); } else if (whitelist == null) { // May have a different fluid. setHeatEnergyPerMilliBucket(resource.getFluid()); return tank.fill(resource, doFill); } else { int resourceId = resource.getFluidID(); for (int i = 0; i < whitelist.length; i++) { if (whitelist[i].getID() == resourceId) { setHeatEnergyPerMilliBucket(resource.getFluid()); return tank.fill(resource, doFill); } } return 0; } } @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { if (resource.isFluidEqual(tank.getFluid())) return tank.drain(resource.amount, doDrain); else return null; } @Override public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { return tank.drain(maxDrain, doDrain); } @Override public boolean canFill(ForgeDirection from, Fluid fluid) { int fluidId = fluid.getID(); if (tank.getFluidAmount() > 0) { return tank.getFluid().getFluidID() == fluidId; } else { for (int i = 0; i < whitelist.length; i++) { if (whitelist[i].getID() == fluidId) { return true; } } } return false; } @Override public boolean canDrain(ForgeDirection from, Fluid fluid) { return true; } @Override public FluidTankInfo[] getTankInfo(ForgeDirection from) { return new FluidTankInfo[]{tank.getInfo()}; } @Override public void readFromNBT(NBTTagCompound nbt, String str) { tank.readFromNBT(nbt.getCompoundTag(str + "tank")); fluid_heat_mb = nbt.getFloat(str + "fhm"); } @Override public void writeToNBT(NBTTagCompound nbt, String str) { NBTTagCompound t = new NBTTagCompound(); tank.writeToNBT(t); nbt.setTag(str + "tank", t); nbt.setFloat(str + "fhm", fluid_heat_mb); } }