218 lines
7.6 KiB
Java
218 lines
7.6 KiB
Java
package net.minecraft.item;
|
|
|
|
import com.mojang.authlib.GameProfile;
|
|
import java.util.UUID;
|
|
import net.minecraft.advancements.CriteriaTriggers;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockSkull;
|
|
import net.minecraft.block.state.IBlockState;
|
|
import net.minecraft.creativetab.CreativeTabs;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.entity.player.EntityPlayerMP;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.nbt.NBTUtil;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.tileentity.TileEntitySkull;
|
|
import net.minecraft.util.EnumActionResult;
|
|
import net.minecraft.util.EnumFacing;
|
|
import net.minecraft.util.EnumHand;
|
|
import net.minecraft.util.NonNullList;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.util.math.MathHelper;
|
|
import net.minecraft.util.text.translation.I18n;
|
|
import net.minecraft.world.World;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
public class ItemSkull extends Item
|
|
{
|
|
private static final String[] SKULL_TYPES = new String[] {"skeleton", "wither", "zombie", "char", "creeper", "dragon"};
|
|
|
|
public ItemSkull()
|
|
{
|
|
this.setCreativeTab(CreativeTabs.DECORATIONS);
|
|
this.setMaxDamage(0);
|
|
this.setHasSubtypes(true);
|
|
}
|
|
|
|
/**
|
|
* Called when a Block is right-clicked with this Item
|
|
*/
|
|
public EnumActionResult onItemUse(EntityPlayer player, World worldIn, BlockPos pos, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ)
|
|
{
|
|
if (facing == EnumFacing.DOWN)
|
|
{
|
|
return EnumActionResult.FAIL;
|
|
}
|
|
else
|
|
{
|
|
if (worldIn.getBlockState(pos).getBlock().isReplaceable(worldIn, pos))
|
|
{
|
|
facing = EnumFacing.UP;
|
|
pos = pos.down();
|
|
}
|
|
IBlockState iblockstate = worldIn.getBlockState(pos);
|
|
Block block = iblockstate.getBlock();
|
|
boolean flag = block.isReplaceable(worldIn, pos);
|
|
|
|
if (!flag)
|
|
{
|
|
if (!worldIn.getBlockState(pos).getMaterial().isSolid() && !worldIn.isSideSolid(pos, facing, true))
|
|
{
|
|
return EnumActionResult.FAIL;
|
|
}
|
|
|
|
pos = pos.offset(facing);
|
|
}
|
|
|
|
ItemStack itemstack = player.getHeldItem(hand);
|
|
|
|
if (player.canPlayerEdit(pos, facing, itemstack) && Blocks.SKULL.canPlaceBlockAt(worldIn, pos))
|
|
{
|
|
if (worldIn.isRemote)
|
|
{
|
|
return EnumActionResult.SUCCESS;
|
|
}
|
|
else
|
|
{
|
|
worldIn.setBlockState(pos, Blocks.SKULL.getDefaultState().withProperty(BlockSkull.FACING, facing), 11);
|
|
int i = 0;
|
|
|
|
if (facing == EnumFacing.UP)
|
|
{
|
|
i = MathHelper.floor((double)(player.rotationYaw * 16.0F / 360.0F) + 0.5D) & 15;
|
|
}
|
|
|
|
TileEntity tileentity = worldIn.getTileEntity(pos);
|
|
|
|
if (tileentity instanceof TileEntitySkull)
|
|
{
|
|
TileEntitySkull tileentityskull = (TileEntitySkull)tileentity;
|
|
|
|
if (itemstack.getMetadata() == 3)
|
|
{
|
|
GameProfile gameprofile = null;
|
|
|
|
if (itemstack.hasTagCompound())
|
|
{
|
|
NBTTagCompound nbttagcompound = itemstack.getTagCompound();
|
|
|
|
if (nbttagcompound.hasKey("SkullOwner", 10))
|
|
{
|
|
gameprofile = NBTUtil.readGameProfileFromNBT(nbttagcompound.getCompoundTag("SkullOwner"));
|
|
}
|
|
else if (nbttagcompound.hasKey("SkullOwner", 8) && !StringUtils.isBlank(nbttagcompound.getString("SkullOwner")))
|
|
{
|
|
gameprofile = new GameProfile((UUID)null, nbttagcompound.getString("SkullOwner"));
|
|
}
|
|
}
|
|
|
|
tileentityskull.setPlayerProfile(gameprofile);
|
|
}
|
|
else
|
|
{
|
|
tileentityskull.setType(itemstack.getMetadata());
|
|
}
|
|
|
|
tileentityskull.setSkullRotation(i);
|
|
Blocks.SKULL.checkWitherSpawn(worldIn, pos, tileentityskull);
|
|
}
|
|
|
|
if (player instanceof EntityPlayerMP)
|
|
{
|
|
CriteriaTriggers.PLACED_BLOCK.trigger((EntityPlayerMP)player, pos, itemstack);
|
|
}
|
|
|
|
itemstack.shrink(1);
|
|
return EnumActionResult.SUCCESS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return EnumActionResult.FAIL;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* returns a list of items with the same ID, but different meta (eg: dye returns 16 items)
|
|
*/
|
|
public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items)
|
|
{
|
|
if (this.isInCreativeTab(tab))
|
|
{
|
|
for (int i = 0; i < SKULL_TYPES.length; ++i)
|
|
{
|
|
items.add(new ItemStack(this, 1, i));
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Converts the given ItemStack damage value into a metadata value to be placed in the world when this Item is
|
|
* placed as a Block (mostly used with ItemBlocks).
|
|
*/
|
|
public int getMetadata(int damage)
|
|
{
|
|
return damage;
|
|
}
|
|
|
|
/**
|
|
* Returns the unlocalized name of this item. This version accepts an ItemStack so different stacks can have
|
|
* different names based on their damage or NBT.
|
|
*/
|
|
public String getUnlocalizedName(ItemStack stack)
|
|
{
|
|
int i = stack.getMetadata();
|
|
|
|
if (i < 0 || i >= SKULL_TYPES.length)
|
|
{
|
|
i = 0;
|
|
}
|
|
|
|
return super.getUnlocalizedName() + "." + SKULL_TYPES[i];
|
|
}
|
|
|
|
public String getItemStackDisplayName(ItemStack stack)
|
|
{
|
|
if (stack.getMetadata() == 3 && stack.hasTagCompound())
|
|
{
|
|
if (stack.getTagCompound().hasKey("SkullOwner", 8))
|
|
{
|
|
return I18n.translateToLocalFormatted("item.skull.player.name", stack.getTagCompound().getString("SkullOwner"));
|
|
}
|
|
|
|
if (stack.getTagCompound().hasKey("SkullOwner", 10))
|
|
{
|
|
NBTTagCompound nbttagcompound = stack.getTagCompound().getCompoundTag("SkullOwner");
|
|
|
|
if (nbttagcompound.hasKey("Name", 8))
|
|
{
|
|
return I18n.translateToLocalFormatted("item.skull.player.name", nbttagcompound.getString("Name"));
|
|
}
|
|
}
|
|
}
|
|
|
|
return super.getItemStackDisplayName(stack);
|
|
}
|
|
|
|
/**
|
|
* Called when an ItemStack with NBT data is read to potentially that ItemStack's NBT data
|
|
*/
|
|
public boolean updateItemStackNBT(NBTTagCompound nbt)
|
|
{
|
|
super.updateItemStackNBT(nbt);
|
|
|
|
if (nbt.hasKey("SkullOwner", 8) && !StringUtils.isBlank(nbt.getString("SkullOwner")))
|
|
{
|
|
GameProfile gameprofile = new GameProfile((UUID)null, nbt.getString("SkullOwner"));
|
|
gameprofile = TileEntitySkull.updateGameprofile(gameprofile);
|
|
nbt.setTag("SkullOwner", NBTUtil.writeGameProfile(new NBTTagCompound(), gameprofile));
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
} |