package minefantasy.mf2.item.custom.tool;
import com.google.common.collect.ImmutableSet;
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;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import minefantasy.mf2.MineFantasyII;
import minefantasy.mf2.api.material.CustomMaterial;
import minefantasy.mf2.item.list.ComponentListMF;
import minefantasy.mf2.item.list.CreativeTabMF;
import minefantasy.mf2.util.MFLogUtil;
import net.minecraft.block.Block;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.creativetab.CreativeTabs;
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.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.ItemTool;
import net.minecraft.util.IIcon;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
public abstract class ItemCustomTool extends ItemTool
{
@SideOnly(Side.CLIENT)
public IIcon baseTex, gripTex, braceTex, headTex;
public ItemCustomTool(String name, Set set)
{
super(0F, ToolMaterial.IRON, set);
this.setCreativeTab(CreativeTabMF.tabTool);
GameRegistry.registerItem(this, name, MineFantasyII.MODID);
this.setUnlocalizedName(name);
}
@Override
public float func_150893_a(ItemStack tool, Block block)
{
return ForgeHooks.isToolEffective(tool, block, 0) ? getEfficiency(tool) : 1.0F;
}
public float getEfficiency(ItemStack tool)
{
float efficiency = 2.0F;
CustomMaterial base = getBase(tool);
if(base != null)
{
efficiency += (base.sharpness*2F);
}
return efficiency;
}
public float getHitDamage(ItemStack tool)
{
CustomMaterial base = getBase(tool);
if(base != null)
{
return base.sharpness;
}
return 1.0F;
}
public int getMaxUses(ItemStack tool)
{
float efficiency = 1.0F;
CustomMaterial base = getBase(tool);
CustomMaterial shaft = getHaftBase(tool);
CustomMaterial grip = getHaftGrip(tool);
CustomMaterial brace = getHaftBrace(tool);
if(base != null)
{
efficiency *= base.hardness;
}
if(shaft != null)
{
efficiency += (efficiency *= shaft.hardness * 0.25F);
}
if(grip != null)
{
efficiency += (efficiency *= grip.hardness * 0.1F);
}
if(brace != null)
{
efficiency += (efficiency *= brace.hardness * 0.25F);
}
return (int)(250*efficiency);
}
public int getHarvestLevel(ItemStack tool)
{
CustomMaterial base = getBase(tool);
if(base != null && base.tier > 3)
{
return base.tier-1;
}
return 2;
}
public float getWeightInKg(ItemStack tool)
{
float mass = 0F;
CustomMaterial base = getBase(tool);
CustomMaterial haft = getHaftBase(tool);
CustomMaterial grip = getHaftGrip(tool);
CustomMaterial brace = getHaftBrace(tool);
if(base != null)
{
mass += base.density;
}
if(haft != null)
{
mass += haft.density;
}
if(grip != null)
{
mass += grip.density;
}
if(brace != null)
{
mass += brace.density;
}
return mass;
}
public CustomMaterial getBase(ItemStack head)
{
return CustomMaterial.getMaterialFor(head, "head");
}
public CustomMaterial getHaftBase(ItemStack haft)
{
return CustomMaterial.getMaterialFor(haft, "base");
}
public CustomMaterial getHaftGrip(ItemStack haft)
{
return CustomMaterial.getMaterialFor(haft, "grip");
}
public CustomMaterial getHaftBrace(ItemStack haft)
{
return CustomMaterial.getMaterialFor(haft, "brace");
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack tool, EntityPlayer user, List list, boolean fullInfo)
{
super.addInformation(tool, user, list, fullInfo);
float efficiency = getEfficiency(tool);
int uses = getMaxUses(tool);
float mass = getWeightInKg(tool);
float damage = getHitDamage(tool);
list.add("Efficiency: "+efficiency);
list.add("Damage: "+ damage);
list.add("Uses: "+uses);
list.add(CustomMaterial.getWeightString(mass));
}
/**
* Current implementations of this method in child classes do not use the entry argument beside ev. They just raise
* the damage on the stack.
*/
@Override
public boolean hitEntity(ItemStack tool, EntityLivingBase target, EntityLivingBase user)
{
tool.damageItem(2, user);
return true;
}
@Override
public boolean onBlockDestroyed(ItemStack tool, World world, Block block, int x, int y, int z, EntityLivingBase user)
{
if ((double)block.getBlockHardness(world, x, y, z) != 0.0D)
{
tool.damageItem(1, user);
}
return true;
}
/**
* Returns True is the item is renderer in full 3D when hold.
*/
@Override
@SideOnly(Side.CLIENT)
public boolean isFull3D()
{
return true;
}
public Item.ToolMaterial func_150913_i()
{
return this.toolMaterial;
}
/**
* Return the enchantability factor of the item, most of the time is based on material.
*/
public int getItemEnchantability()
{
return this.toolMaterial.getEnchantability();
}
/**
* Return the name for this tool's material.
*/
public String getToolMaterialName()
{
return this.toolMaterial.toString();
}
/**
* Return whether this item is repairable in an anvil.
*/
@Override
public boolean getIsRepairable(ItemStack item, ItemStack item2)
{
return false;//this.toolMaterial.func_150995_f() == item2.getItem() ? true : super.getIsRepairable(item, item2);
}
/**
* Gets a map of item attribute modifiers, used by ItemSword to increase hit damage.
*/
@Override
public Multimap getItemAttributeModifiers()
{
Multimap multimap = super.getItemAttributeModifiers();
multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", 0D, 0));
return multimap;
}
@Override
@SideOnly(Side.CLIENT)
public int getRenderPasses(int metadata)
{
return 4;
}
@Override
@SideOnly(Side.CLIENT)
public int getColorFromItemStack(ItemStack item, int layer)
{
CustomMaterial head = getBase(item);
CustomMaterial base = getHaftBase(item);
CustomMaterial grip = getHaftGrip(item);
CustomMaterial brace = getHaftBrace(item);
if(layer == 0 && base != null)
{
return base.getColourInt();
}
if(layer == 1 && grip != null)
{
return grip.getColourInt();
}
if(layer == 2 && brace != null)
{
return brace.getColourInt();
}
return head.getColourInt();
}
@Override
@SideOnly(Side.CLIENT)
public IIcon getIcon(ItemStack item, int layer)
{
CustomMaterial head = getBase(item);
CustomMaterial base = getHaftBase(item);
CustomMaterial grip = getHaftGrip(item);
CustomMaterial brace = getHaftBrace(item);
if(layer == 0)
{
return baseTex;
}
if(layer == 1 && grip != null)
{
return gripTex;
}
if(layer == 2 && brace != null)
{
return braceTex;
}
return headTex;
}
@Override
@SideOnly(Side.CLIENT)
public boolean requiresMultipleRenderPasses()
{
return true;
}
@Override
@SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister reg)
{
baseTex = reg.registerIcon("minefantasy2:custom/haft/haft_base");
gripTex = reg.registerIcon("minefantasy2:custom/haft/haft_grip");
braceTex = reg.registerIcon("minefantasy2:custom/haft/haft_brace");
headTex = reg.registerIcon("minefantasy2:custom/commodity/"+getName() + "_head");
}
@Override
public String getItemStackDisplayName(ItemStack tool)
{
CustomMaterial head = getBase(tool);
return StatCollector.translateToLocalFormatted("item.tool_"+ getName() +".name", StatCollector.translateToLocal("material."+head.name.toLowerCase() + ".name"));
}
public abstract String getName();
@Override
public void getSubItems(Item item, CreativeTabs tab, List list)
{
ArrayList<CustomMaterial> metal = CustomMaterial.getList("metal");
Iterator iteratorMetal = metal.iterator();
while(iteratorMetal.hasNext())
{
CustomMaterial material = (CustomMaterial) iteratorMetal.next();
list.add(this.createTool(material.name, "OakWood", "Leather", null));
}
list.add(this.createTool("Iron", "OakWood", null, null));
list.add(this.createTool("Iron", "OakWood", "Leather", "Bronze"));
list.add(this.createTool("Steel", "EbonyWood", "DragonSkin", "Iron"));
}
public ItemStack createTool(String head, String base, String grip, String brace)
{
ItemStack item = new ItemStack(this);
CustomMaterial.addMaterial(item, "head", head);
CustomMaterial.addMaterial(item, "base", base);
CustomMaterial.addMaterial(item, "grip", grip);
CustomMaterial.addMaterial(item, "brace", brace);
item.getAttributeModifiers().clear();
item.getAttributeModifiers().put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Material modifier", getHitDamage(item), 0));
return item;
}
/*===================================== FORGE START =================================*/
private String toolClass;
@Override
public int getHarvestLevel(ItemStack stack, String toolClass)
{
return getHarvestLevel(stack);
}
@Override
public Set<String> getToolClasses(ItemStack stack)
{
return toolClass != null ? ImmutableSet.of(toolClass) : super.getToolClasses(stack);
}
@Override
public float getDigSpeed(ItemStack stack, Block block, int meta)
{
if (ForgeHooks.isToolEffective(stack, block, meta))
{
return getEfficiency(stack);
}
return func_150893_a(stack, block);
}
/*===================================== FORGE END =================================*/
}