package minefantasy.mf2.item.archery;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import minefantasy.mf2.MineFantasyII;
import minefantasy.mf2.api.archery.AmmoMechanicsMF;
import minefantasy.mf2.api.archery.IAmmo;
import minefantasy.mf2.api.archery.IDisplayMFAmmo;
import minefantasy.mf2.api.archery.IFirearm;
import minefantasy.mf2.api.archery.ISpecialBow;
import minefantasy.mf2.api.helpers.CustomToolHelper;
import minefantasy.mf2.api.helpers.ToolHelper;
import minefantasy.mf2.api.material.CustomMaterial;
import minefantasy.mf2.item.list.CreativeTabMF;
import minefantasy.mf2.item.list.CustomToolListMF;
import minefantasy.mf2.item.list.ToolListMF;
import minefantasy.mf2.item.tool.ToolMaterialMF;
import minefantasy.mf2.material.BaseMaterialMF;
import minefantasy.mf2.util.MFLogUtil;
import mods.battlegear2.api.PlayerEventChild.OffhandAttackEvent;
import mods.battlegear2.api.weapons.IBattlegearWeapon;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.projectile.EntityArrow;
import net.minecraft.init.Items;
import net.minecraft.item.EnumAction;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBow;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IIcon;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.entity.player.ArrowLooseEvent;
import net.minecraftforge.event.entity.player.ArrowNockEvent;
import net.minecraftforge.event.entity.player.PlayerInteractEvent;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import minefantasy.mf2.container.ContainerReload;
public class ItemBowMF extends ItemBow implements ISpecialBow, IDisplayMFAmmo, IBattlegearWeapon, IFirearm
{
public static final DecimalFormat decimal_format = new DecimalFormat("#.##");
private final EnumBowType model;
private ToolMaterial material = ToolMaterial.WOOD;
private int itemRarity;
private float baseDamage = 1.0F;
private String name;
public ItemBowMF(String name, EnumBowType type)
{
this(name, ToolMaterial.WOOD, type, 0);
}
public ItemBowMF(String name, ToolMaterial mat, EnumBowType type, int rarity)
{
this(name, (int)(mat.getMaxUses()*type.durabilityModifier), type, mat.getDamageVsEntity(), rarity);
material = mat;
}
private ItemBowMF(String name, int dura, EnumBowType type, float damage, int rarity)
{
this.name=name;
this.baseDamage = damage;
model = type;
this.maxStackSize = 1;
this.setMaxDamage(dura);
itemRarity = rarity;
setTextureName("minefantasy2:Bow/"+name);
this.setUnlocalizedName(name);
GameRegistry.registerItem(this, name, MineFantasyII.MODID);
setCreativeTab(CreativeTabMF.tabOldTools);
}
@Override
@SideOnly(Side.CLIENT)
/**
* Returns True is the item is renderer in full 3D when hold.
*/
public boolean isFull3D()
{
return true;
}
/**
* called when the player releases the use item button. Args: itemstack, world, entityplayer, itemInUseCount
*/
@Override
public void onPlayerStoppedUsing(ItemStack item, World world, EntityPlayer player, int time)
{
int power = (this.getMaxItemUseDuration(item) - time);
ArrowLooseEvent event = new ArrowLooseEvent(player, item, power);
MinecraftForge.EVENT_BUS.post(event);
if (event.isCanceled())
{
return;
}
power = event.charge;
boolean var5 = player.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, item) > 0;
if (var5 || player.inventory.hasItem(Items.arrow))
{
float firepower = power / model.chargeTime;
if (firepower < 0.1D)
{
return;
}
if (firepower > 1.0F)
{
firepower = 1.0F;
}
EntityArrow var8 = new EntityArrow(world, player, firepower * 2.0F);
if (firepower == 1.0F)
{
var8.setIsCritical(true);
}
int var9 = EnchantmentHelper.getEnchantmentLevel(Enchantment.power.effectId, item);
if (var9 > 0)
{
var8.setDamage(var8.getDamage() + var9 * 0.5D + 0.5D);
}
int var10 = EnchantmentHelper.getEnchantmentLevel(Enchantment.punch.effectId, item);
if (var10 > 0)
{
var8.setKnockbackStrength(var10);
}
if (EnchantmentHelper.getEnchantmentLevel(Enchantment.flame.effectId, item) > 0)
{
var8.setFire(100);
}
AmmoMechanicsMF.damageFirearm(item, player, 1);
world.playSoundAtEntity(player, "minefantasy2:weapon.bowFire", 1.0F, 1.0F / (itemRand.nextFloat() * 0.4F + 1.2F) + firepower * 0.5F);
if (var5)
{
var8.canBePickedUp = 2;
}
else
{
player.inventory.consumeInventoryItem(Items.arrow);
}
var8 = (EntityArrow) modifyArrow(item, var8);
if (!world.isRemote)
{
world.spawnEntityInWorld(var8);
}
}
}
public ItemStack onFoodEaten(ItemStack item, World world, EntityPlayer player)
{
return item;
}
/**
* How long it takes to use or consume an item
*/
@Override
public int getMaxItemUseDuration(ItemStack item)
{
return 72000;
}
/**
* returns the action that specifies what animation to play when the items is being used
*/
@Override
public EnumAction getItemUseAction(ItemStack item)
{
return EnumAction.bow;
}
@Override
public void addInformation(ItemStack item, EntityPlayer player, List desc, boolean flag)
{
super.addInformation(item, player, desc, flag);
CustomToolHelper.addBowInformation(item, desc);
ItemStack ammo = AmmoMechanicsMF.getAmmo(item);
if(ammo != null)
{
desc.add(EnumChatFormatting.DARK_GRAY + ammo.getDisplayName() + " x" + ammo.stackSize);
}
desc.add(EnumChatFormatting.BLUE + StatCollector.translateToLocalFormatted("attribute.bowPower.name", decimal_format.format(getBowDamage(item))));
}
/**
* Called whenever this item is equipped and the right mouse button is pressed. Args: itemStack, world, entityPlayer
*/
@Override
///Item is the bow.
public ItemStack onItemRightClick(ItemStack item, World world, EntityPlayer player)
{
if(player.isSneaking())
{
reloadBow(item, player);
return item;
}
ArrowNockEvent event = new ArrowNockEvent(player, item);
MinecraftForge.EVENT_BUS.post(event);
System.out.println(event.result);
if (event.isCanceled())
{
return event.result;
}
return item;
//player.inventory.hasItem(Items.arrow)
}
public boolean canAccept(ItemStack ammo)
{
String ammoType = "null";
ItemStack weapon = new ItemStack(this);
if(ammo != null && ammo.getItem() instanceof IAmmo)
{
ammoType = ((IAmmo)ammo.getItem()).getAmmoType(ammo);
}
if(weapon != null && weapon.getItem() instanceof IFirearm)
{
return ((IFirearm)weapon.getItem()).canAcceptAmmo(weapon, ammoType);
}
return ammoType.equalsIgnoreCase("arrow");
}
private void reloadBow(ItemStack item, EntityPlayer player)
{
player.openGui(MineFantasyII.instance, 1, player.worldObj, 1, 0, 0);
}
/**
* Return the enchantability factor of the item, most of the time is based on material.
*/
@Override
public int getItemEnchantability()
{
return 1;
}
@Override
public void onUpdate(ItemStack item, World world, Entity entity, int i, boolean b)
{
super.onUpdate(item, world, entity, i, b);
if(!item.hasTagCompound())
item.setTagCompound(new NBTTagCompound());
item.stackTagCompound.setInteger("Use", i);
}
public int getDrawAmount(int timer)
{
float maxCharge = this.getMaxCharge();
if (timer > (maxCharge*0.9F))
return 2;
else if (timer > (maxCharge*0.65F))
return 1;
else if (timer > 0)
return 0;
return -2;
}
@Override
public EnumRarity getRarity(ItemStack item)
{
int lvl = itemRarity;
EnumRarity[] rarity = new EnumRarity[]{EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.epic};
if(item.isItemEnchanted())
{
if(lvl == 0)
{
lvl++;
}
lvl ++;
}
if(lvl >= rarity.length)
{
lvl = rarity.length-1;
}
return rarity[lvl];
}
private ToolMaterial getMaterial()
{
return material;
}
private EnumRarity rarity(ItemStack item, int lvl)
{
EnumRarity[] rarity = new EnumRarity[]{EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare, EnumRarity.epic};
if(item.isItemEnchanted())
{
if(lvl == 0)
{
lvl++;
}
lvl ++;
}
if(lvl >= rarity.length)
{
lvl = rarity.length-1;
}
return rarity[lvl];
}
@Override
public Entity modifyArrow(ItemStack bow, Entity arrow)
{
if (getMaterial() == BaseMaterialMF.getMaterial("dragonforge").getToolConversion())
{
arrow.setFire(60);
}
if (getMaterial() == BaseMaterialMF.getMaterial("silver").getToolConversion() || getMaterial() == BaseMaterialMF.getMaterial("ornate").getToolConversion())
{
arrow.getEntityData().setBoolean("MF_Silverbow", true);
}
float dam = getBowDamage(bow);
arrow.getEntityData().setFloat("MF_Bow_Damage", dam);
return arrow;
}
public boolean canUseRenderer(ItemStack item)
{
return true;
}
private void addSet(List list, Item[] items)
{
for(Item item:items)
{
list.add(new ItemStack(item));
}
}
@Override
public boolean sheatheOnBack(ItemStack item) {
return true;
}
@Override
public boolean isOffhandHandDual(ItemStack off) {
return false;
}
@Override
public boolean offhandAttackEntity(OffhandAttackEvent event,
ItemStack mainhandItem, ItemStack offhandItem) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean offhandClickAir(PlayerInteractEvent event,
ItemStack mainhandItem, ItemStack offhandItem) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean offhandClickBlock(PlayerInteractEvent event, ItemStack mainhandItem, ItemStack offhandItem)
{
return false;
}
@Override
public void performPassiveEffects(Side effectiveSide, ItemStack mainhandItem, ItemStack offhandItem)
{
}
@Override
public boolean allowOffhand(ItemStack mainhand, ItemStack offhand)
{
return false;
}
@Override
public boolean canAcceptAmmo(ItemStack weapon, String ammo)
{
return ammo.equalsIgnoreCase("arrow");
}
@Override
public int getAmmoCapacity(ItemStack item) {
return 1;
}
//===================================================== CUSTOM START =============================================================\\
private boolean isCustom = false;
public ItemBowMF setCustom(String designType)
{
canRepair = false;
setTextureName("minefantasy2:custom/bow/"+designType+"/"+name);
isCustom = true;
return this;
}
public IIcon[] mainIcons = new IIcon[3];
public IIcon cus_metal_standby;
public IIcon[] cus_metal_pulling = new IIcon[3];
public IIcon cus_wood_standby;
public IIcon[] cus_wood_pulling = new IIcon[3];
public IIcon cus_detail_standby;
public IIcon[] cus_detail_pulling = new IIcon[3];
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack stack, int pass)
{
return getIcon(stack, pass, -1);
}
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack bow, int layer, int pull)
{
if(!isCustom)
{
return pull >= 0 ? mainIcons[pull] : this.itemIcon;
}
if(layer == 0)
{
return pull >= 0 ? cus_metal_pulling[pull] : cus_metal_standby;
}
if(layer == 1)
{
return pull >= 0 ? cus_wood_pulling[pull] : cus_wood_standby;
}
else
{
return pull >= 0 ? cus_detail_pulling[pull] : cus_detail_standby;
}
}
@SideOnly(Side.CLIENT)
@Override
public void registerIcons(IIconRegister reg)
{
this.itemIcon = reg.registerIcon(this.getIconString()+"_standby");
for (int i = 0; i < 3; ++i)
{
this.mainIcons[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i));
}
if(isCustom)
{
this.cus_metal_standby = reg.registerIcon(this.getIconString()+"_standby");
this.cus_wood_standby = reg.registerIcon(this.getIconString()+"_standby_haft");
this.cus_detail_standby = reg.registerIcon(this.getIconString()+"_standby_detail");
for (int i = 0; i < 3; ++i)
{
this.cus_metal_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i));
this.cus_wood_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_haft");
this.cus_detail_pulling[i] = reg.registerIcon(this.getIconString() + "_pulling_" + (i) + "_detail");
}
}
}
@Override
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(ItemStack item, int layer)
{
int c = CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer));
return c;
}
public ItemStack construct(String main, String haft)
{
return CustomToolHelper.construct(this, main, haft);
}
@Override
@SideOnly(Side.CLIENT)
public boolean requiresMultipleRenderPasses()
{
return isCustom;
}
//Returns the number of render passes this item has.
@Override
public int getRenderPasses(int metadata)
{
return 3;
}
@Override
@SideOnly(Side.CLIENT)
public String getItemStackDisplayName(ItemStack item)
{
String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name";
return CustomToolHelper.getWoodenLocalisedName(item, unlocalName);
}
@Override
public int getMaxDamage(ItemStack stack)
{
return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack));
}
@Override
public void getSubItems(Item item, CreativeTabs tab, List list)
{
if(isCustom)
{
ArrayList<CustomMaterial> wood = CustomMaterial.getList("wood");
Iterator iteratorWood = wood.iterator();
while(iteratorWood.hasNext())
{
CustomMaterial customMat = (CustomMaterial) iteratorWood.next();
if(MineFantasyII.isDebug() || customMat.getItem() != null)
{
list.add(this.construct("Iron", customMat.name));
}
}
return;
}
}
public float getBowDamage(ItemStack item)
{
return CustomToolHelper.getBowDamage(item, baseDamage) * model.damageModifier;
}
//====================================================== CUSTOM END ==============================================================\\
@Override
public float getMaxCharge()
{
return model.chargeTime;
}
}