154 lines
4.0 KiB
Java
154 lines
4.0 KiB
Java
package org.bukkit.craftbukkit.block;
|
|
|
|
import com.google.common.base.Preconditions;
|
|
import com.mojang.authlib.GameProfile;
|
|
import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.server.TileEntitySkull;
|
|
import org.bukkit.Bukkit;
|
|
import org.bukkit.Material;
|
|
import org.bukkit.OfflinePlayer;
|
|
|
|
import org.bukkit.SkullType;
|
|
import org.bukkit.block.Block;
|
|
import org.bukkit.block.BlockFace;
|
|
import org.bukkit.block.Skull;
|
|
import org.bukkit.block.data.Rotatable;
|
|
|
|
public class CraftSkull extends CraftBlockEntityState<TileEntitySkull> implements Skull {
|
|
|
|
private static final int MAX_OWNER_LENGTH = 16;
|
|
private GameProfile profile;
|
|
|
|
public CraftSkull(final Block block) {
|
|
super(block, TileEntitySkull.class);
|
|
}
|
|
|
|
public CraftSkull(final Material material, final TileEntitySkull te) {
|
|
super(material, te);
|
|
}
|
|
|
|
@Override
|
|
public void load(TileEntitySkull skull) {
|
|
super.load(skull);
|
|
|
|
profile = skull.getGameProfile();
|
|
}
|
|
|
|
static int getSkullType(SkullType type) {
|
|
switch(type) {
|
|
default:
|
|
case SKELETON:
|
|
return 0;
|
|
case WITHER:
|
|
return 1;
|
|
case ZOMBIE:
|
|
return 2;
|
|
case PLAYER:
|
|
return 3;
|
|
case CREEPER:
|
|
return 4;
|
|
case DRAGON:
|
|
return 5;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean hasOwner() {
|
|
return profile != null;
|
|
}
|
|
|
|
@Override
|
|
public String getOwner() {
|
|
return hasOwner() ? profile.getName() : null;
|
|
}
|
|
|
|
@Override
|
|
public boolean setOwner(String name) {
|
|
if (name == null || name.length() > MAX_OWNER_LENGTH) {
|
|
return false;
|
|
}
|
|
|
|
GameProfile profile = MinecraftServer.getServer().getUserCache().getProfile(name);
|
|
if (profile == null) {
|
|
return false;
|
|
}
|
|
|
|
this.profile = profile;
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public OfflinePlayer getOwningPlayer() {
|
|
if (profile != null) {
|
|
if (profile.getId() != null) {
|
|
return Bukkit.getOfflinePlayer(profile.getId());
|
|
}
|
|
|
|
if (profile.getName() != null) {
|
|
return Bukkit.getOfflinePlayer(profile.getName());
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
public void setOwningPlayer(OfflinePlayer player) {
|
|
Preconditions.checkNotNull(player, "player");
|
|
|
|
this.profile = new GameProfile(player.getUniqueId(), player.getName());
|
|
}
|
|
|
|
@Override
|
|
public BlockFace getRotation() {
|
|
return ((Rotatable) getBlockData()).getRotation();
|
|
}
|
|
|
|
@Override
|
|
public void setRotation(BlockFace rotation) {
|
|
Rotatable blockData = (Rotatable) getBlockData();
|
|
blockData.setRotation(rotation);
|
|
setBlockData(blockData);
|
|
}
|
|
|
|
@Override
|
|
public SkullType getSkullType() {
|
|
switch (getType()) {
|
|
case SKELETON_SKULL:
|
|
case SKELETON_WALL_SKULL:
|
|
return SkullType.SKELETON;
|
|
case WITHER_SKELETON_SKULL:
|
|
case WITHER_SKELETON_WALL_SKULL:
|
|
return SkullType.WITHER;
|
|
case ZOMBIE_HEAD:
|
|
case ZOMBIE_WALL_HEAD:
|
|
return SkullType.ZOMBIE;
|
|
case PLAYER_HEAD:
|
|
case PLAYER_WALL_HEAD:
|
|
return SkullType.PLAYER;
|
|
case CREEPER_HEAD:
|
|
case CREEPER_WALL_HEAD:
|
|
return SkullType.CREEPER;
|
|
case DRAGON_HEAD:
|
|
case DRAGON_WALL_HEAD:
|
|
return SkullType.DRAGON;
|
|
default:
|
|
throw new IllegalArgumentException("Unknown SkullType for " + getType());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setSkullType(SkullType skullType) {
|
|
throw new UnsupportedOperationException("Must change block type");
|
|
}
|
|
|
|
@Override
|
|
public void applyTo(TileEntitySkull skull) {
|
|
super.applyTo(skull);
|
|
|
|
if (getSkullType() == SkullType.PLAYER) {
|
|
skull.setGameProfile(profile);
|
|
}
|
|
}
|
|
}
|