Newer
Older
ultramine_bukkit / src / main / java / org / bukkit / block / BlockFace.java
@vlad20012 vlad20012 on 24 Feb 2017 2 KB initial
package org.bukkit.block;

/**
 * Represents the face of a block
 */
public enum BlockFace
{
	NORTH(0, 0, -1),
	EAST(1, 0, 0),
	SOUTH(0, 0, 1),
	WEST(-1, 0, 0),
	UP(0, 1, 0),
	DOWN(0, -1, 0),
	NORTH_EAST(NORTH, EAST),
	NORTH_WEST(NORTH, WEST),
	SOUTH_EAST(SOUTH, EAST),
	SOUTH_WEST(SOUTH, WEST),
	WEST_NORTH_WEST(WEST, NORTH_WEST),
	NORTH_NORTH_WEST(NORTH, NORTH_WEST),
	NORTH_NORTH_EAST(NORTH, NORTH_EAST),
	EAST_NORTH_EAST(EAST, NORTH_EAST),
	EAST_SOUTH_EAST(EAST, SOUTH_EAST),
	SOUTH_SOUTH_EAST(SOUTH, SOUTH_EAST),
	SOUTH_SOUTH_WEST(SOUTH, SOUTH_WEST),
	WEST_SOUTH_WEST(WEST, SOUTH_WEST),
	SELF(0, 0, 0);

	private final int modX;
	private final int modY;
	private final int modZ;

	private BlockFace(final int modX, final int modY, final int modZ)
	{
		this.modX = modX;
		this.modY = modY;
		this.modZ = modZ;
	}

	private BlockFace(final BlockFace face1, final BlockFace face2)
	{
		this.modX = face1.getModX() + face2.getModX();
		this.modY = face1.getModY() + face2.getModY();
		this.modZ = face1.getModZ() + face2.getModZ();
	}

	/**
	 * Get the amount of X-coordinates to modify to get the represented block
	 *
	 * @return Amount of X-coordinates to modify
	 */
	public int getModX()
	{
		return modX;
	}

	/**
	 * Get the amount of Y-coordinates to modify to get the represented block
	 *
	 * @return Amount of Y-coordinates to modify
	 */
	public int getModY()
	{
		return modY;
	}

	/**
	 * Get the amount of Z-coordinates to modify to get the represented block
	 *
	 * @return Amount of Z-coordinates to modify
	 */
	public int getModZ()
	{
		return modZ;
	}

	public BlockFace getOppositeFace()
	{
		switch(this)
		{
		case NORTH:
			return BlockFace.SOUTH;

		case SOUTH:
			return BlockFace.NORTH;

		case EAST:
			return BlockFace.WEST;

		case WEST:
			return BlockFace.EAST;

		case UP:
			return BlockFace.DOWN;

		case DOWN:
			return BlockFace.UP;

		case NORTH_EAST:
			return BlockFace.SOUTH_WEST;

		case NORTH_WEST:
			return BlockFace.SOUTH_EAST;

		case SOUTH_EAST:
			return BlockFace.NORTH_WEST;

		case SOUTH_WEST:
			return BlockFace.NORTH_EAST;

		case WEST_NORTH_WEST:
			return BlockFace.EAST_SOUTH_EAST;

		case NORTH_NORTH_WEST:
			return BlockFace.SOUTH_SOUTH_EAST;

		case NORTH_NORTH_EAST:
			return BlockFace.SOUTH_SOUTH_WEST;

		case EAST_NORTH_EAST:
			return BlockFace.WEST_SOUTH_WEST;

		case EAST_SOUTH_EAST:
			return BlockFace.WEST_NORTH_WEST;

		case SOUTH_SOUTH_EAST:
			return BlockFace.NORTH_NORTH_WEST;

		case SOUTH_SOUTH_WEST:
			return BlockFace.NORTH_NORTH_EAST;

		case WEST_SOUTH_WEST:
			return BlockFace.EAST_NORTH_EAST;

		case SELF:
			return BlockFace.SELF;
		}

		return BlockFace.SELF;
	}
}