package mekanism.common.tile; import mekanism.api.Coord4D; import mekanism.api.util.CapabilityUtils; import mekanism.common.base.FluidHandlerWrapper; import mekanism.common.base.IFluidHandlerWrapper; import mekanism.common.content.boiler.BoilerSteamTank; import mekanism.common.content.boiler.BoilerTank; import mekanism.common.content.boiler.BoilerWaterTank; import mekanism.common.util.PipeUtils; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumFacing; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; public class TileEntityBoilerValve extends TileEntityBoilerCasing implements IFluidHandlerWrapper { public BoilerTank waterTank; public BoilerTank steamTank; public TileEntityBoilerValve() { super("BoilerValve"); waterTank = new BoilerWaterTank(this); steamTank = new BoilerSteamTank(this); } @Override public void onUpdate() { super.onUpdate(); if(!worldObj.isRemote) { if(structure != null && structure.upperRenderLocation != null && getPos().getY() >= structure.upperRenderLocation.yCoord-1) { if(structure.steamStored != null && structure.steamStored.amount > 0) { for(EnumFacing side : EnumFacing.values()) { TileEntity tile = Coord4D.get(this).offset(side).getTileEntity(worldObj); if(tile != null && !(tile instanceof TileEntityBoilerValve) && CapabilityUtils.hasCapability(tile, CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side.getOpposite())) { IFluidHandler handler = CapabilityUtils.getCapability(tile, CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, side.getOpposite()); if(PipeUtils.canFill(handler, structure.steamStored)) { structure.steamStored.amount -= handler.fill(structure.steamStored, true); if(structure.steamStored.amount <= 0) { structure.steamStored = null; } } } } } } } } @Override public FluidTankInfo[] getTankInfo(EnumFacing from) { if((!worldObj.isRemote && structure != null) || (worldObj.isRemote && clientHasStructure)) { if(structure.upperRenderLocation != null && getPos().getY() >= structure.upperRenderLocation.yCoord-1) { return new FluidTankInfo[] {steamTank.getInfo()}; } else { return new FluidTankInfo[] {waterTank.getInfo()}; } } return PipeUtils.EMPTY; } @Override public int fill(EnumFacing from, FluidStack resource, boolean doFill) { if(structure != null && structure.upperRenderLocation != null && getPos().getY() < structure.upperRenderLocation.yCoord-1) { return waterTank.fill(resource, doFill); } return 0; } @Override public FluidStack drain(EnumFacing from, FluidStack resource, boolean doDrain) { if(structure != null && structure.upperRenderLocation != null && getPos().getY() >= structure.upperRenderLocation.yCoord-1) { if(structure.steamStored != null) { if(resource.getFluid() == structure.steamStored.getFluid()) { return steamTank.drain(resource.amount, doDrain); } } } return null; } @Override public FluidStack drain(EnumFacing from, int maxDrain, boolean doDrain) { if(structure != null && structure.upperRenderLocation != null && getPos().getY() >= structure.upperRenderLocation.yCoord-1) { return steamTank.drain(maxDrain, doDrain); } return null; } @Override public boolean canFill(EnumFacing from, Fluid fluid) { if((!worldObj.isRemote && structure != null) || (worldObj.isRemote && clientHasStructure)) { return structure.upperRenderLocation != null && getPos().getY() < structure.upperRenderLocation.yCoord-1; } return false; } @Override public boolean canDrain(EnumFacing from, Fluid fluid) { if((!worldObj.isRemote && structure != null) || (worldObj.isRemote && clientHasStructure)) { return structure.upperRenderLocation != null && getPos().getY() >= structure.upperRenderLocation.yCoord-1; } return false; } @Override public boolean hasCapability(Capability<?> capability, EnumFacing side) { if((!worldObj.isRemote && structure != null) || (worldObj.isRemote && clientHasStructure)) { if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { return true; } } return super.hasCapability(capability, side); } @Override public <T> T getCapability(Capability<T> capability, EnumFacing side) { if((!worldObj.isRemote && structure != null) || (worldObj.isRemote && clientHasStructure)) { if(capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) { return (T)new FluidHandlerWrapper(this, side); } } return super.getCapability(capability, side); } }