Newer
Older
ultramine_private_regions / src / main / java / org / ultramine / regions / Rectangle.java
@vlad20012 vlad20012 on 29 Mar 2016 3 KB Initial commit
package org.ultramine.regions;

import io.netty.buffer.ByteBuf;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;

import java.io.IOException;

public class Rectangle
{
	private final BlockPos min;
	private final BlockPos max;

	public Rectangle(BlockPos min, BlockPos max)
	{
		this.min = min;
		this.max = max;
	}

	public Rectangle(int x1, int y1, int z1, int x2, int y2, int z2)
	{
		this(new BlockPos(x1, y1, z1), new BlockPos(x2, y2, z2));
	}

	public BlockPos getMin()
	{
		return min;
	}

	public BlockPos getMax()
	{
		return max;
	}

	public int getLenX()
	{
		return max.x - min.x + 1;
	}

	public int getLenY()
	{
		return max.y - min.y + 1;
	}

	public int getLenZ()
	{
		return max.z - min.z + 1;
	}

	public int getLen(ForgeDirection dir)
	{
		switch(dir)
		{
			case DOWN:	return getLenY();
			case NORTH:	return getLenZ();
			case WEST:	return getLenX();
			case UP:	return getLenY();
			case SOUTH:	return getLenZ();
			case EAST:	return getLenX();
			case UNKNOWN: throw new IllegalArgumentException("UNKNOWN direction");
		}

		return 0;
	}

	public Rectangle setSide(ForgeDirection dir, int amount)
	{
		switch(dir)
		{
			case DOWN:	return new Rectangle(new BlockPos(min.x, amount, min.z), max);
			case NORTH:	return new Rectangle(new BlockPos(min.x, min.y, amount), max);
			case WEST:	return new Rectangle(new BlockPos(amount, min.y, min.z), max);
			case UP:	return new Rectangle(min, new BlockPos(max.x, amount, max.z));
			case SOUTH:	return new Rectangle(min, new BlockPos(max.x, max.y, amount));
			case EAST:	return new Rectangle(min, new BlockPos(amount, max.y, max.z));
			case UNKNOWN: throw new IllegalArgumentException("UNKNOWN direction");
		}

		return this;
	}

	public Rectangle expand(ForgeDirection dir, int amount)
	{
		switch(dir)
		{
			case DOWN:	return new Rectangle(new BlockPos(min.x, min.y - amount, min.z), max);
			case NORTH:	return new Rectangle(new BlockPos(min.x, min.y, min.z - amount), max);
			case WEST:	return new Rectangle(new BlockPos(min.x - amount, min.y, min.z), max);
			case UP:	return new Rectangle(min, new BlockPos(max.x, max.y + amount, max.z));
			case SOUTH:	return new Rectangle(min, new BlockPos(max.x, max.y, max.z + amount));
			case EAST:	return new Rectangle(min, new BlockPos(max.x + amount, max.y, max.z));
			case UNKNOWN: throw new IllegalArgumentException("UNKNOWN direction");
		}

		return this;
	}

	public Rectangle compress(ForgeDirection dir, int amount)
	{
		return expand(dir, -amount);
	}

	public Rectangle expandAll(int amount)
	{
		return new Rectangle(new BlockPos(min.x-amount, min.y-amount, min.z-amount), new BlockPos(max.x+amount, max.y+amount, max.z+amount));
	}

	public boolean isIntersects(Rectangle other)
	{
		return RegionUtil.isIntersects(min, max, other.min, other.max);
	}

	public boolean contains(BlockPos point)
	{
		return point.isInAABB(min, max);
	}

	public boolean contains(Rectangle rect)
	{
		return RegionUtil.isBoxInBox(rect.min, rect.max, min, max);
	}

	public static Rectangle read(ByteBuf buf) throws IOException
	{
		return new Rectangle(BlockPos.read(buf), BlockPos.read(buf));
	}

	public void write(ByteBuf buf) throws IOException
	{
		min.write(buf);
		max.write(buf);
	}

	public NBTTagCompound toNBT()
	{
		NBTTagCompound nbt = new NBTTagCompound();
		nbt.setTag("m", min.toNBT());
		nbt.setTag("x", max.toNBT());
		return nbt;
	}

	public static Rectangle fromNBT(NBTTagCompound nbt)
	{
		return new Rectangle(BlockPos.fromNBT(nbt.getCompoundTag("m")), BlockPos.fromNBT(nbt.getCompoundTag("x")));
	}

	public String toString()
	{
		return "Rectangle{min("+min.x + ", "+min.y+", "+min.z+"), max("+max.x + ", "+max.y+", "+max.z+")}";
	}

	public boolean equals(Object o)
	{
		if(!(o instanceof Rectangle))
			return false;
		Rectangle rect = (Rectangle)o;
		return min.equals(rect.min) && max.equals(rect.max);
	}
}