package net.minecraft.src;
import com.google.common.collect.AbstractIterator;
import java.util.Iterator;
import net.minecraft.util.BlockPos;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.MathHelper;
public class BlockPosM extends BlockPos
{
private int mx;
private int my;
private int mz;
private int level;
private BlockPosM[] facings;
private boolean needsUpdate;
public BlockPosM(int x, int y, int z)
{
this(x, y, z, 0);
}
public BlockPosM(double xIn, double yIn, double zIn)
{
this(MathHelper.floor_double(xIn), MathHelper.floor_double(yIn), MathHelper.floor_double(zIn));
}
public BlockPosM(int x, int y, int z, int level)
{
super(0, 0, 0);
this.mx = x;
this.my = y;
this.mz = z;
this.level = level;
}
/**
* Get the X coordinate
*/
public int getX()
{
return this.mx;
}
/**
* Get the Y coordinate
*/
public int getY()
{
return this.my;
}
/**
* Get the Z coordinate
*/
public int getZ()
{
return this.mz;
}
public void setXyz(int x, int y, int z)
{
this.mx = x;
this.my = y;
this.mz = z;
this.needsUpdate = true;
}
public void setXyz(double xIn, double yIn, double zIn)
{
this.setXyz(MathHelper.floor_double(xIn), MathHelper.floor_double(yIn), MathHelper.floor_double(zIn));
}
/**
* Offset this BlockPos 1 block in the given direction
*/
public BlockPos offset(EnumFacing facing)
{
if (this.level <= 0)
{
return super.offset(facing, 1);
}
else
{
if (this.facings == null)
{
this.facings = new BlockPosM[EnumFacing.VALUES.length];
}
if (this.needsUpdate)
{
this.update();
}
int index = facing.getIndex();
BlockPosM bpm = this.facings[index];
if (bpm == null)
{
int nx = this.mx + facing.getFrontOffsetX();
int ny = this.my + facing.getFrontOffsetY();
int nz = this.mz + facing.getFrontOffsetZ();
bpm = new BlockPosM(nx, ny, nz, this.level - 1);
this.facings[index] = bpm;
}
return bpm;
}
}
/**
* Offset this BlockPos n blocks in the given direction
*/
public BlockPos offset(EnumFacing facing, int n)
{
return n == 1 ? this.offset(facing) : super.offset(facing, 1);
}
private void update()
{
for (int i = 0; i < 6; ++i)
{
BlockPosM bpm = this.facings[i];
if (bpm != null)
{
EnumFacing facing = EnumFacing.VALUES[i];
int nx = this.mx + facing.getFrontOffsetX();
int ny = this.my + facing.getFrontOffsetY();
int nz = this.mz + facing.getFrontOffsetZ();
bpm.setXyz(nx, ny, nz);
}
}
this.needsUpdate = false;
}
public static Iterable getAllInBoxMutable(BlockPos from, BlockPos to)
{
final BlockPos posFrom = new BlockPos(Math.min(from.getX(), to.getX()), Math.min(from.getY(), to.getY()), Math.min(from.getZ(), to.getZ()));
final BlockPos posTo = new BlockPos(Math.max(from.getX(), to.getX()), Math.max(from.getY(), to.getY()), Math.max(from.getZ(), to.getZ()));
return new Iterable()
{
public Iterator iterator()
{
return new AbstractIterator()
{
private BlockPosM theBlockPosM = null;
protected BlockPosM computeNext0()
{
if (this.theBlockPosM == null)
{
this.theBlockPosM = new BlockPosM(posFrom.getX(), posFrom.getY(), posFrom.getZ(), 3);
return this.theBlockPosM;
}
else if (this.theBlockPosM.equals(posTo))
{
return (BlockPosM)this.endOfData();
}
else
{
int bx = this.theBlockPosM.getX();
int by = this.theBlockPosM.getY();
int bz = this.theBlockPosM.getZ();
if (bx < posTo.getX())
{
++bx;
}
else if (by < posTo.getY())
{
bx = posFrom.getX();
++by;
}
else if (bz < posTo.getZ())
{
bx = posFrom.getX();
by = posFrom.getY();
++bz;
}
this.theBlockPosM.setXyz(bx, by, bz);
return this.theBlockPosM;
}
}
protected Object computeNext()
{
return this.computeNext0();
}
};
}
};
}
}