package ttftcuts.physis.common.item;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentDurability;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemBow;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
public abstract class ItemPhysisNBTDamage extends ItemPhysis implements INBTDamageItem {
@Override
public int getNBTDamage(ItemStack stack) {
if (stack.getTagCompound() == null) {
return 0;
} else {
if (stack.getTagCompound().hasKey(NBTDAMAGETAG)) {
return stack.getTagCompound().getInteger(NBTDAMAGETAG);
}
}
return 0;
}
@Override
public int getNBTMaxDamage(ItemStack stack) {
return 1;
}
@Override
public boolean setNBTDamage(ItemStack stack, int damage) {
if (stack.getTagCompound() == null) {
stack.setTagCompound(new NBTTagCompound());
}
stack.getTagCompound().setInteger(NBTDAMAGETAG, damage);
return damage > getNBTMaxDamage(stack);
}
private boolean attemptNBTDamage(ItemStack stack, int damage, Random rand) {
if (!this.isItemStackNBTDamageable(stack))
{
return false;
}
else
{
if (damage > 0)
{
int j = EnchantmentHelper.getEnchantmentLevel(Enchantment.unbreaking.effectId, stack);
int k = 0;
for (int l = 0; j > 0 && l < damage; ++l)
{
if (EnchantmentDurability.negateDamage(stack, j, rand))
{
++k;
}
}
damage -= k;
if (damage <= 0)
{
return false;
}
}
setNBTDamage(stack, getNBTDamage(stack) + damage);
return getNBTDamage(stack) > getNBTMaxDamage(stack);
}
}
private boolean isItemStackNBTDamageable(ItemStack stack) {
return this.getNBTMaxDamage(stack) < 0 ? false : !stack.hasTagCompound() || !stack.getTagCompound().getBoolean("Unbreakable");
}
@Override
public void applyNBTDamage(ItemStack stack, EntityLivingBase entity, int damage) {
if (!(entity instanceof EntityPlayer) || !((EntityPlayer)entity).capabilities.isCreativeMode)
{
if (this.isItemStackNBTDamageable(stack))
{
if (this.attemptNBTDamage(stack, damage, entity.getRNG()))
{
entity.renderBrokenItemStack(stack);
--stack.stackSize;
if (entity instanceof EntityPlayer)
{
EntityPlayer entityplayer = (EntityPlayer)entity;
//entityplayer.addStat(StatList.objectBreakStats[Item.getIdFromItem(stack.field_151002_e)], 1);
if (stack.stackSize == 0 && stack.getItem() instanceof ItemBow)
{
entityplayer.destroyCurrentEquippedItem();
}
}
if (stack.stackSize < 0)
{
stack.stackSize = 0;
}
//stack.itemDamage = 0;
}
}
}
}
@Override
public boolean showDurabilityBar(ItemStack stack)
{
return this.isItemStackNBTDamageable(stack) && this.isDamaged(stack);
}
@Override
public boolean isDamaged(ItemStack stack)
{
return getNBTDamage(stack) > 0;
}
@Override
public int getDisplayDamage(ItemStack stack)
{
return getNBTDamage(stack);
}
@Override
public double getDurabilityForDisplay(ItemStack stack)
{
return (double)stack.getItemDamageForDisplay() / (double)getNBTMaxDamage(stack);
}
@Override
public boolean hitEntity(ItemStack stack, EntityLivingBase target, EntityLivingBase user)
{
this.applyNBTDamage(stack, user, 2);
return true;
}
@Override
public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase user)
{
if ((double)block.getBlockHardness(world, x, y, z) != 0.0D)
{
this.applyNBTDamage(stack, user, 1);
}
return true;
}
@Override
public boolean isDamageable()
{
return false;
}
@Override
public boolean isRepairable()
{
return canRepair;
}
}