package minefantasy.mf2.item.gadget;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import minefantasy.mf2.MineFantasyII;
import minefantasy.mf2.api.helpers.ToolHelper;
import minefantasy.mf2.api.stamina.StaminaBar;
import minefantasy.mf2.api.tier.IToolMaterial;
import minefantasy.mf2.config.ConfigTools;
import minefantasy.mf2.item.list.CreativeTabMF;
import minefantasy.mf2.item.list.ToolListMF;
import minefantasy.mf2.item.tool.ToolMaterialMF;
import minefantasy.mf2.item.weapon.ItemWeaponMF;
import net.minecraft.block.Block;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumAction;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemPickaxe;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import cpw.mods.fml.common.registry.GameRegistry;
/**
* @author Anonymous Productions
*/
public class ItemClimbingPick extends ItemPickaxe implements IToolMaterial
{
private Random rand = new Random();
public ItemClimbingPick(String name, ToolMaterial material, int rarity)
{
super(material);
itemRarity = rarity;
setCreativeTab(CreativeTabMF.tabGadget);
setTextureName("minefantasy2:Other/"+name);
GameRegistry.registerItem(this, name, MineFantasyII.MODID);
this.setUnlocalizedName(name);
setMaxDamage(material.getMaxUses());
}
private int itemRarity;
@Override
public EnumRarity getRarity(ItemStack item)
{
int lvl = itemRarity+1;
if(item.isItemEnchanted())
{
if(lvl == 0)
{
lvl++;
}
lvl ++;
}
if(lvl >= ToolListMF.rarity.length)
{
lvl = ToolListMF.rarity.length-1;
}
return ToolListMF.rarity[lvl];
}
@Override
public ToolMaterial getMaterial()
{
return toolMaterial;
}
@Override
public int getMaxDamage(ItemStack stack)
{
return ToolHelper.setDuraOnQuality(stack, super.getMaxDamage());
}
public boolean isInWall(EntityPlayer player, boolean init)
{
if(player.getHeldItem() == null)return false;
World world = player.worldObj;
MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true);
if (movingobjectposition == null)
{
return false;
} else
{
if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK)
{
int x = movingobjectposition.blockX;
int y = movingobjectposition.blockY;
int z = movingobjectposition.blockZ;
NBTTagCompound nbt = getOrCreateNBT(player.getHeldItem());
if(init)
{
nbt.setInteger("MF_HeldPosX", x);
nbt.setInteger("MF_HeldPosY", y);
nbt.setInteger("MF_HeldPosZ", z);
}
else
{
int x1 = nbt.getInteger("MF_HeldPosX");
int y1 = nbt.getInteger("MF_HeldPosY");
int z1 = nbt.getInteger("MF_HeldPosZ");
if(x1 != x || y1 != y || z1 != z)
{
player.stopUsingItem();
return false;
}
}
Block block = world.getBlock(x, y, z);
if(player.posY < (y+2.8F) && player.posY > (y-3) && player.getDistance(x+0.5, player.posY, z+0.5) < 1D && player.fallDistance < 5 && block.getMaterial().isSolid() && block.isOpaqueCube())
{
return true;
}
}
}
return false;
}
private NBTTagCompound getOrCreateNBT(ItemStack item)
{
if(!item.hasTagCompound())
{
item.setTagCompound(new NBTTagCompound());
}
return item.getTagCompound();
}
@Override
public void onUsingTick(ItemStack stack, EntityPlayer player, int count)
{
float cost = 0.5F;
if(stack.getItemDamage() >= stack.getMaxDamage())
{
player.destroyCurrentEquippedItem();
}
World world = player.worldObj;
MovingObjectPosition movingobjectposition = this.getMovingObjectPositionFromPlayer(world, player, true);
if (movingobjectposition == null)
{
if(!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost))
{
player.stopUsingItem();
}
return;
} else
{
if (movingobjectposition.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK)
{
int x = movingobjectposition.blockX;
int y = movingobjectposition.blockY;
int z = movingobjectposition.blockZ;
Block block = world.getBlock(x, y, z);
if(isInWall(player, false))
{
if(!player.isSwingInProgress)
{
cost *= 0.5F;
player.motionY = 0;
}
else
{
player.fallDistance = 0;
if(!player.isSneaking() && player.posY < y+3)
{
player.motionY = 0.05D;
}
else if(player.isSneaking() && player.posY > y-2)
{
player.motionY = -0.05D;
cost *= 0.75F;
}
else
{
player.motionY = 0;
cost *= 0.5F;
}
}
}
}
}
if(!world.isRemote && StaminaBar.isSystemActive && !tryPerformAbility(player, cost))
{
player.stopUsingItem();
}
}
@Override
public EnumAction getItemUseAction(ItemStack item)
{
return EnumAction.bow;
}
@Override
public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer user)
{
if(user.isUsingItem())return item;
if(StaminaBar.isSystemActive && !StaminaBar.isAnyStamina(user, true))
{
return item;
}
if(isInWall(user, true))
{
user.setItemInUse(item, getMaxItemUseDuration(item));
if(!world.isRemote)
{
item.damageItem(1, user);
}
user.playSound("mob.sheep.shear", 1.0F, 2.0F);
}
return item;
}
@Override
public int getMaxItemUseDuration(ItemStack item)
{
return Integer.MAX_VALUE;
}
public static boolean tryPerformAbility(EntityLivingBase user, float points)
{
if(StaminaBar.isSystemActive && StaminaBar.doesAffectEntity(user))
{
points *= StaminaBar.getClimbinbDecayModifier(user, true);
if(StaminaBar.isStaminaAvailable(user, points, true))
{
ItemWeaponMF.applyFatigue(user, points);
return true;
}
else
{
return false;
}
}
return true;
}
}