Files
PrimalSorcery/build/tmp/recompileMc/sources/net/minecraft/item/ItemSkull.java
Mohammad-Ali Minaie b86dedad2f base mod created
2018-10-08 09:07:47 -04:00

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;
}
}
}