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

import com.mojang.authlib.GameProfile;
import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntitySkull;
import org.bukkit.SkullType;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Skull;
import org.bukkit.craftbukkit.CraftWorld;
import org.ultramine.mods.bukkit.interfaces.tileentity.IMixinTileEntitySkull;

public class CraftSkull extends CraftBlockState implements Skull
{
	private static final int MAX_OWNER_LENGTH = 16;
	private final TileEntitySkull skull;
	private GameProfile profile;
	private SkullType skullType;
	private byte rotation;

	public CraftSkull(final Block block)
	{
		super(block);

		CraftWorld world = (CraftWorld) block.getWorld();
		skull = (TileEntitySkull) world.getTileEntityAt(getX(), getY(), getZ());
		profile = skull.func_152108_a();
		skullType = getSkullType(skull.func_145904_a());
		rotation = (byte) ((IMixinTileEntitySkull) skull).getRotation();
	}

	static SkullType getSkullType(int id)
	{
		switch(id)
		{
		case 0:
			return SkullType.SKELETON;
		case 1:
			return SkullType.WITHER;
		case 2:
			return SkullType.ZOMBIE;
		case 3:
			return SkullType.PLAYER;
		case 4:
			return SkullType.CREEPER;
		default:
			throw new AssertionError(id);
		}
	}

	static int getSkullType(SkullType type)
	{
		switch(type)
		{
		case SKELETON:
			return 0;
		case WITHER:
			return 1;
		case ZOMBIE:
			return 2;
		case PLAYER:
			return 3;
		case CREEPER:
			return 4;
		default:
			throw new AssertionError(type);
		}
	}

	static byte getBlockFace(BlockFace rotation)
	{
		switch(rotation)
		{
		case NORTH:
			return 0;
		case NORTH_NORTH_EAST:
			return 1;
		case NORTH_EAST:
			return 2;
		case EAST_NORTH_EAST:
			return 3;
		case EAST:
			return 4;
		case EAST_SOUTH_EAST:
			return 5;
		case SOUTH_EAST:
			return 6;
		case SOUTH_SOUTH_EAST:
			return 7;
		case SOUTH:
			return 8;
		case SOUTH_SOUTH_WEST:
			return 9;
		case SOUTH_WEST:
			return 10;
		case WEST_SOUTH_WEST:
			return 11;
		case WEST:
			return 12;
		case WEST_NORTH_WEST:
			return 13;
		case NORTH_WEST:
			return 14;
		case NORTH_NORTH_WEST:
			return 15;
		default:
			throw new IllegalArgumentException("Invalid BlockFace rotation: " + rotation);
		}
	}

	static BlockFace getBlockFace(byte rotation)
	{
		switch(rotation)
		{
		case 0:
			return BlockFace.NORTH;
		case 1:
			return BlockFace.NORTH_NORTH_EAST;
		case 2:
			return BlockFace.NORTH_EAST;
		case 3:
			return BlockFace.EAST_NORTH_EAST;
		case 4:
			return BlockFace.EAST;
		case 5:
			return BlockFace.EAST_SOUTH_EAST;
		case 6:
			return BlockFace.SOUTH_EAST;
		case 7:
			return BlockFace.SOUTH_SOUTH_EAST;
		case 8:
			return BlockFace.SOUTH;
		case 9:
			return BlockFace.SOUTH_SOUTH_WEST;
		case 10:
			return BlockFace.SOUTH_WEST;
		case 11:
			return BlockFace.WEST_SOUTH_WEST;
		case 12:
			return BlockFace.WEST;
		case 13:
			return BlockFace.WEST_NORTH_WEST;
		case 14:
			return BlockFace.NORTH_WEST;
		case 15:
			return BlockFace.NORTH_NORTH_WEST;
		default:
			throw new AssertionError(rotation);
		}
	}

	public boolean hasOwner()
	{
		return profile != null;
	}

	public String getOwner()
	{
		return hasOwner() ? profile.getName() : null;
	}

	public boolean setOwner(String name)
	{
		if(name == null || name.length() > MAX_OWNER_LENGTH)
		{
			return false;
		}

		GameProfile profile = MinecraftServer.getServer().func_152358_ax().func_152655_a(name);
		if(profile == null)
		{
			return false;
		}

		if(skullType != SkullType.PLAYER)
		{
			skullType = SkullType.PLAYER;
		}

		this.profile = profile;
		return true;
	}

	public BlockFace getRotation()
	{
		return getBlockFace(rotation);
	}

	public void setRotation(BlockFace rotation)
	{
		this.rotation = getBlockFace(rotation);
	}

	public SkullType getSkullType()
	{
		return skullType;
	}

	public void setSkullType(SkullType skullType)
	{
		this.skullType = skullType;

		if(skullType != SkullType.PLAYER)
		{
			profile = null;
		}
	}

	@Override
	public boolean update(boolean force, boolean applyPhysics)
	{
		boolean result = super.update(force, applyPhysics);

		if(result)
		{
			if(skullType == SkullType.PLAYER)
			{
				skull.func_152106_a(profile);
			}
			else
			{
				skull.func_152107_a(getSkullType(skullType));
			}

			skull.func_145903_a(rotation);
			skull.markDirty();
		}

		return result;
	}
}