package zmaster587.advancedRocketry.tile; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidHandler; import zmaster587.advancedRocketry.world.util.WorldDummy; import zmaster587.libVulpes.tile.multiblock.hatch.TileFluidHatch; import zmaster587.libVulpes.util.IAdjBlockUpdate; public class TileFluidTank extends TileFluidHatch implements IAdjBlockUpdate { private long lastUpdateTime; private static final int MAX_UPDATE = 20; private boolean fluidChanged; public TileFluidTank() { super(); fluidChanged = false; } public TileFluidTank(int i) { super(i); fluidChanged = false; } @Override public boolean canFill(ForgeDirection from, Fluid fluid) { return true; } private void checkForUpdate() { if(fluidChanged && worldObj instanceof WorldDummy || worldObj.getTotalWorldTime() - lastUpdateTime > MAX_UPDATE) { this.markDirty(); worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); lastUpdateTime = worldObj.getTotalWorldTime(); fluidChanged = false; } } @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill) { IFluidHandler handler = this.getFluidTankInDirection(ForgeDirection.DOWN); int amt = 0; if(handler != null) { amt = handler.fill(from, resource, doFill); } //Copy to avoid modifiying the passed one FluidStack resource2 = resource.copy(); resource2.amount -= amt; if(resource2.amount > 0) amt += super.fill(from, resource2, doFill); if(amt > 0 && doFill) fluidChanged = true; checkForUpdate(); return amt; } @Override public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { IFluidHandler handler = this.getFluidTankInDirection(ForgeDirection.UP); FluidStack stack = null; if(handler != null && handler.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid != null && fluidTank.getFluid() != null && fluidTank.getFluid().getFluidID() == handler.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid.getFluidID()) { stack = handler.drain(from, maxDrain, doDrain); } if(stack != null) return stack; FluidStack stack2 = super.drain(from, maxDrain - (stack != null ? stack.amount : 0), doDrain); if(stack != null && stack2 != null) stack2.amount += stack.amount; if(stack2 != null && doDrain) { fluidChanged = true; } checkForUpdate(); return stack2; } @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { if(this.fluidTank.getFluid() == null || resource.getFluidID() != this.fluidTank.getFluid().getFluidID()) return null; return this.drain(from, resource.amount, doDrain); } public TileFluidTank getFluidTankInDirection(ForgeDirection direction) { TileEntity tile = worldObj.getTileEntity(xCoord + direction.offsetX, yCoord + direction.offsetY, zCoord + direction.offsetZ); if(tile instanceof TileFluidTank) { return ((TileFluidTank) tile); } return null; } @Override protected void writeToNBTHelper(NBTTagCompound nbtTagCompound) { super.writeToNBTHelper(nbtTagCompound); fluidTank.writeToNBT(nbtTagCompound); } @Override protected void readFromNBTHelper(NBTTagCompound nbtTagCompound) { super.readFromNBTHelper(nbtTagCompound); fluidTank.readFromNBT(nbtTagCompound); } @Override protected boolean useBucket(int slot, ItemStack stack) { boolean bucketUsed = super.useBucket(slot, stack); if(bucketUsed) { IFluidHandler handler = getFluidTankInDirection(ForgeDirection.DOWN); if(handler != null) { FluidStack othertank = handler.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid; if(othertank == null || (othertank.amount < handler.getTankInfo(ForgeDirection.UNKNOWN)[0].capacity)) fluidTank.drain(handler.fill(ForgeDirection.UNKNOWN, fluidTank.getFluid(), true),true); } } return bucketUsed; } @Override public void onAdjacentBlockUpdated() { TileFluidTank tank = getFluidTankInDirection(ForgeDirection.UP); if(tank != null && tank.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid != null) { if(fluidTank.getFluid() == null) { fluidTank.fill(tank.fluidTank.drain(fluidTank.getCapacity(), true), true); } else if(tank.getTankInfo(ForgeDirection.UNKNOWN)[0].fluid.getFluidID() == fluidTank.getFluid().getFluidID()) { fluidTank.fill(tank.drain(ForgeDirection.UNKNOWN, fluidTank.getCapacity() - fluidTank.getFluidAmount(), false), true); tank.fluidTank.drain(fluidTank.getCapacity() - fluidTank.getFluidAmount(), true); } this.markDirty(); worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); } } }