package minefantasy.mf2.item.tool.crafting;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import minefantasy.mf2.MineFantasyII;
import minefantasy.mf2.api.helpers.CustomToolHelper;
import minefantasy.mf2.api.helpers.ToolHelper;
import minefantasy.mf2.api.material.CustomMaterial;
import minefantasy.mf2.api.stamina.StaminaBar;
import minefantasy.mf2.api.tier.IToolMaterial;
import minefantasy.mf2.api.tool.IToolMF;
import minefantasy.mf2.api.weapon.IDamageType;
import minefantasy.mf2.config.ConfigTools;
import minefantasy.mf2.item.list.CreativeTabMF;
import minefantasy.mf2.item.list.ToolListMF;
import minefantasy.mf2.item.tool.ToolMaterialMF;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.EnumRarity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemAxe;
import net.minecraft.item.ItemStack;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
import net.minecraftforge.common.util.ForgeDirection;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
/**
* @author Anonymous Productions
*/
public class ItemSaw extends ItemAxe implements IToolMaterial, IDamageType, IToolMF
{
private Random rand = new Random();
private float hitDamage;
private float baseDamage;
private String name;
private int tier;
/**
*/
public ItemSaw(String name, ToolMaterial material, int rarity, int tier)
{
super(material);
this.tier=tier;
itemRarity = rarity;
setCreativeTab(CreativeTabMF.tabOldTools);
this.hitDamage = (2.0F + material.getDamageVsEntity())/2F;
setTextureName("minefantasy2:Tool/Crafting/"+name);
GameRegistry.registerItem(this, name, MineFantasyII.MODID);
this.setUnlocalizedName(name);
this.name = name;
this.setHarvestLevel("axe", material.getHarvestLevel());
}
@Override
public ToolMaterial getMaterial()
{
return toolMaterial;
}
@Override
public boolean onBlockDestroyed(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user)
{
if(user instanceof EntityPlayer && canAcceptCost(user))
{
breakChain(world, x, y, z, item, block, user, 32, block, world.getBlockMetadata(x, y, z));
}
return super.onBlockDestroyed(item, world, block, x, y, z, user);
}
private void breakChain(World world, int x, int y, int z, ItemStack item, Block block, EntityLivingBase user, int maxLogs, Block orient, int orientM)
{
if(maxLogs > 0 && isLog(world, x, y, z, orient, orientM))
{
Block newblock = world.getBlock(x, y, z);
breakSurrounding(item, world, newblock, x, y, z, user);
newblock.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), EnchantmentHelper.getFortuneModifier(user));
world.setBlockToAir(x, y, z);
item.damageItem(1, user);
maxLogs --;
for(int x1 = -1; x1 <= 1; x1 ++)
{
for(int y1 = -1; y1 <= 1; y1 ++)
{
for(int z1 = -1; z1 <= 1; z1 ++)
{
breakChain(world, x+x1, y+y1, z+z1, item, newblock, user, maxLogs, orient, orientM);
}
}
}
if(user instanceof EntityPlayer)
{
tirePlayer(user, 2.0F);
}
}
}
public static boolean canAcceptCost(EntityLivingBase user)
{
return canAcceptCost(user, 0.1F);
}
public static boolean canAcceptCost(EntityLivingBase user, float cost)
{
if(user instanceof EntityPlayer && StaminaBar.isSystemActive)
{
return StaminaBar.isPercentStamAvailable(user, cost, true);
}
return true;
}
public static void tirePlayer(EntityLivingBase user, float points)
{
if(user instanceof EntityPlayer && StaminaBar.isSystemActive)
{
StaminaBar.modifyStaminaValue(user, -StaminaBar.getBaseDecayModifier(user, true, true)*points);
StaminaBar.ModifyIdleTime(user, 5F*points);
}
}
private boolean isLog(World world, int x, int y, int z, Block orient, int orientM)
{
Block block = world.getBlock(x, y, z);
int meta = world.getBlockMetadata(x, y, z);
if(block != null)
{
return block == orient && block.getMaterial() == Material.wood;
}
return false;
}
public void breakSurrounding(ItemStack item, World world, Block block, int x, int y, int z, EntityLivingBase user)
{
if(!world.isRemote && ForgeHooks.isToolEffective(item, block, world.getBlockMetadata(x, y, z)))
{
for(int x1 = -2; x1 <= 2; x1 ++)
{
for(int y1 = -2; y1 <= 2; y1 ++)
{
for(int z1 = -2; z1 <= 2; z1 ++)
{
ForgeDirection FD = getFDFor(user);
int blockX = x+x1 + FD.offsetX;
int blockY = y+y1 + FD.offsetY;
int blockZ = z+z1 + FD.offsetZ;
if(!(x1+FD.offsetX == 0 && y1+FD.offsetY == 0 && z1+FD.offsetZ == 0))
{
Block newblock = world.getBlock(blockX, blockY, blockZ);
int m = world.getBlockMetadata(blockX, blockY, blockZ);
if(item.getItemDamage() < item.getMaxDamage() && newblock != null && user instanceof EntityPlayer && newblock.getMaterial() == Material.leaves)
{
if(rand.nextFloat()*100F < (100F - ConfigTools.hvyDropChance))
{
newblock.dropBlockAsItem(world, blockX, blockY, blockZ, m, EnchantmentHelper.getFortuneModifier(user));
}
world.setBlockToAir(blockX, blockY, blockZ);
item.damageItem(1, user);
}
}
}
}
}
}
}
private ForgeDirection getFDFor(EntityLivingBase user)
{
return ForgeDirection.UNKNOWN;//TODO: FD
}
@Override
public Multimap getItemAttributeModifiers()
{
Multimap multimap = super.getItemAttributeModifiers();
multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", this.hitDamage, 0));
return multimap;
}
@Override
public float[] getDamageRatio(Object... implement)
{
return new float[]{1,0, 0};
}
@Override
public String getToolType(ItemStack item)
{
return "saw";
}
@Override
public float getPenetrationLevel(Object implement)
{
return 0.5F;
}
//===================================================== CUSTOM START =============================================================\\
private boolean isCustom = false;
public ItemSaw setCustom(String s)
{
canRepair = false;
setTextureName("minefantasy2:custom/tool/"+s+"/"+name);
isCustom = true;
return this;
}
public ItemSaw setBaseDamage(float baseDamage)
{
this.baseDamage = baseDamage;
return this;
}
@Override
public float getEfficiency(ItemStack item)
{
return CustomToolHelper.getEfficiency(item, toolMaterial.getEfficiencyOnProperMaterial(), efficiencyMod);
}
@Override
public int getTier(ItemStack item)
{
return CustomToolHelper.getCrafterTier(item, tier);
}
private float efficiencyMod = 1.0F;
public ItemSaw setEfficiencyMod(float efficiencyMod)
{
this.efficiencyMod = efficiencyMod;
return this;
}
@Override
public Multimap getAttributeModifiers(ItemStack item)
{
Multimap map = HashMultimap.create();
map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Weapon modifier", getMeleeDamage(item), 0));
return map;
}
/**
* Gets a stack-sensitive value for the melee dmg
*/
protected float getMeleeDamage(ItemStack item)
{
return baseDamage + CustomToolHelper.getMeleeDamage(item, toolMaterial.getDamageVsEntity());
}
protected float getWeightModifier(ItemStack stack)
{
return CustomToolHelper.getWeightModifier(stack, 1.0F);
}
private IIcon detailTex = null;
private IIcon haftTex = null;
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister reg)
{
if(isCustom)
{
haftTex = reg.registerIcon(this.getIconString()+"_haft");
detailTex = reg.registerIcon(this.getIconString()+"_detail");
}
super.registerIcons(reg);
}
@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
public IIcon getIcon(ItemStack stack, int pass)
{
if(isCustom && pass == 1 && haftTex != null)
{
return haftTex;
}
if(isCustom && pass == 2 && detailTex != null)
{
return detailTex;
}
return super.getIcon(stack, pass);
}
@Override
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(ItemStack item, int layer)
{
return CustomToolHelper.getColourFromItemStack(item, layer, super.getColorFromItemStack(item, layer));
}
@Override
public int getMaxDamage(ItemStack stack)
{
return CustomToolHelper.getMaxDamage(stack, super.getMaxDamage(stack));
}
public ItemStack construct(String main, String haft)
{
return CustomToolHelper.construct(this, main, haft);
}
protected int itemRarity;
@Override
public EnumRarity getRarity(ItemStack item)
{
return CustomToolHelper.getRarity(item, itemRarity);
}
@Override
public float getDigSpeed(ItemStack stack, Block block, int meta)
{
if (!ForgeHooks.isToolEffective(stack, block, meta))
{
return this.func_150893_a(stack, block);
}
return CustomToolHelper.getEfficiency(stack, super.getDigSpeed(stack, block, meta), efficiencyMod);
}
public float func_150893_a(ItemStack stack, Block block)
{
float base = super.func_150893_a(stack, block);
return base <= 1.0F ? base : CustomToolHelper.getEfficiency(stack, this.efficiencyOnProperMaterial, efficiencyMod);
}
@Override
public int getHarvestLevel(ItemStack stack, String toolClass)
{
return CustomToolHelper.getHarvestLevel(stack, super.getHarvestLevel(stack, toolClass));
}
@Override
public void getSubItems(Item item, CreativeTabs tab, List list)
{
if(isCustom)
{
ArrayList<CustomMaterial> metal = CustomMaterial.getList("metal");
Iterator iteratorMetal = metal.iterator();
while(iteratorMetal.hasNext())
{
CustomMaterial customMat = (CustomMaterial) iteratorMetal.next();
if(MineFantasyII.isDebug() || customMat.getItem() != null)
{
list.add(this.construct(customMat.name,"OakWood"));
}
}
}
else
{
super.getSubItems(item, tab, list);
}
}
@Override
public void addInformation(ItemStack item, EntityPlayer user, List list, boolean extra)
{
if(isCustom)
{
CustomToolHelper.addInformation(item, list);
}
super.addInformation(item, user, list, extra);
}
@Override
@SideOnly(Side.CLIENT)
public String getItemStackDisplayName(ItemStack item)
{
String unlocalName = this.getUnlocalizedNameInefficiently(item) + ".name";
return CustomToolHelper.getLocalisedName(item, unlocalName);
}
//====================================================== CUSTOM END ==============================================================\\
}