package emasher.tileentities;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.*;
public class TileMiniPortal extends TileAdapterBase implements IFluidHandler {
public static final int CAPACITY = 8000;
public FluidTank tank = new FluidTank( CAPACITY );
public int partnerX;
public int partnerY;
public int partnerZ;
@Override
public void writeToNBT( NBTTagCompound data ) {
super.writeToNBT( data );
tank.writeToNBT( data );
data.setInteger( "partnerX", partnerX );
data.setInteger( "partnerY", partnerY );
data.setInteger( "partnerZ", partnerZ );
}
@Override
public void readFromNBT( NBTTagCompound data ) {
super.readFromNBT( data );
tank.readFromNBT( data );
if( data.hasKey( "partnerX" ) ) partnerX = data.getInteger( "partnerX" );
if( data.hasKey( "partnerY" ) ) partnerY = data.getInteger( "partnerY" );
if( data.hasKey( "partnerZ" ) ) partnerZ = data.getInteger( "partnerZ" );
}
@Override
public void updateEntity() {
for( int i = 0; i < 6; i++ ) {
if( outputs[i] ) {
ForgeDirection d = ForgeDirection.getOrientation( i );
int xo = xCoord + d.offsetX;
int yo = yCoord + d.offsetY;
int zo = zCoord + d.offsetZ;
TileEntity te = worldObj.getTileEntity( xo, yo, zo );
if( te != null && te instanceof IFluidHandler ) {
int amnt = ( ( IFluidHandler ) te ).fill( d.getOpposite(), drain( d, 16000, false ), true );
drain( d, amnt, true );
}
}
}
}
public World getOtherWorld() {
if( worldObj.provider.dimensionId == 0 ) {
return MinecraftServer.getServer().worldServerForDimension( -1 );
} else if( worldObj.provider.dimensionId == -1 ) {
return MinecraftServer.getServer().worldServerForDimension( 0 );
}
return null;
}
public void setPartner( int x, int y, int z ) {
partnerX = x;
partnerY = y;
partnerZ = z;
}
@Override
public int fill( ForgeDirection from, FluidStack resource, boolean doFill ) {
int result = tank.fill( resource, doFill );
FluidStack resource2 = resource.copy();
resource2.amount -= result;
if( resource2.amount > 0 ) {
World other = getOtherWorld();
if( other != null ) {
TileEntity te = other.getTileEntity( partnerX, partnerY, partnerZ );
if( te != null && te instanceof TileMiniPortal ) {
TileMiniPortal partner = ( TileMiniPortal ) te;
result = partner.tank.fill( resource2, doFill );
}
}
}
return result;
}
@Override
public FluidStack drain( ForgeDirection from, FluidStack resource, boolean doDrain ) {
if( resource == null || !resource.isFluidEqual( tank.getFluid() ) ) {
return null;
}
FluidStack result = tank.drain( resource.amount, doDrain );
if( result == null || ( result != null && result.amount < resource.amount ) ) {
int newAmnt;
if( result != null ) newAmnt = resource.amount - result.amount;
else newAmnt = resource.amount;
World other = getOtherWorld();
if( other != null ) {
TileEntity te = other.getTileEntity( partnerX, partnerY, partnerZ );
if( te != null && te instanceof TileMiniPortal ) {
TileMiniPortal partner = ( TileMiniPortal ) te;
if( resource.isFluidEqual( partner.tank.getFluid() ) ) {
if( result != null ) result.amount += partner.tank.drain( newAmnt, doDrain ).amount;
else result = partner.tank.drain( newAmnt, doDrain );
}
}
}
}
return result;
}
@Override
public FluidStack drain( ForgeDirection from, int maxDrain, boolean doDrain ) {
FluidStack result = tank.drain( maxDrain, doDrain );
if( result == null || ( result != null && result.amount < maxDrain ) ) {
int newAmnt;
if( result == null ) newAmnt = maxDrain;
else newAmnt = maxDrain - result.amount;
World other = getOtherWorld();
if( other != null ) {
TileEntity te = other.getTileEntity( partnerX, partnerY, partnerZ );
if( te != null && te instanceof TileMiniPortal ) {
TileMiniPortal partner = ( TileMiniPortal ) te;
if( result == null || ( result != null && result.isFluidEqual( partner.tank.getFluid() ) ) ) {
if( result != null ) result.amount += partner.tank.drain( newAmnt, doDrain ).amount;
else result = partner.tank.drain( newAmnt, doDrain );
}
}
}
}
return result;
}
@Override
public boolean canFill( ForgeDirection from, Fluid fluid ) {
if( fluid.getID() == FluidRegistry.LAVA.getID() && !emasher.util.Config.miniPortalLava() ) return false;
return true;
}
@Override
public boolean canDrain( ForgeDirection from, Fluid fluid ) {
return true;
}
@Override
public FluidTankInfo[] getTankInfo( ForgeDirection from ) {
return new FluidTankInfo[] {tank.getInfo()};
}
}