package net.minecraft.item; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.Set; import net.minecraft.block.Block; 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.world.World; import net.minecraftforge.common.ForgeHooks; public class ItemTool extends Item { private Set effectiveBlocksTool; protected float efficiencyOnProperMaterial = 4.0F; /** Damage versus entities. */ private float damageVsEntity; /** The material this tool is made from. */ protected Item.ToolMaterial toolMaterial; private static final String __OBFID = "CL_00000019"; protected ItemTool(float p_i45333_1_, Item.ToolMaterial p_i45333_2_, Set p_i45333_3_) { this.toolMaterial = p_i45333_2_; this.effectiveBlocksTool = p_i45333_3_; this.maxStackSize = 1; this.setMaxDurability(p_i45333_2_.getMaxUses()); this.efficiencyOnProperMaterial = p_i45333_2_.getEfficiencyOnProperMaterial(); this.damageVsEntity = p_i45333_1_ + p_i45333_2_.getDamageVsEntity(); this.setCreativeTab(CreativeTabs.tabTools); if (this instanceof ItemPickaxe) { toolClass = "pickaxe"; } else if (this instanceof ItemAxe) { toolClass = "axe"; } else if (this instanceof ItemSpade) { toolClass = "shovel"; } } public float getStrVsBlock(ItemStack p_150893_1_, Block p_150893_2_) { return this.effectiveBlocksTool.contains(p_150893_2_) ? this.efficiencyOnProperMaterial : 1.0F; } /** * Current implementations of this method in child classes do not use the entry argument beside ev. They just raise * the damage on the stack. */ public boolean hitEntity(ItemStack stack, EntityLivingBase p_77644_2_, EntityLivingBase p_77644_3_) { stack.damageItem(2, p_77644_3_); return true; } public boolean onBlockDestroyed(ItemStack stack, World worldIn, Block blockIn, int p_150894_4_, int p_150894_5_, int p_150894_6_, EntityLivingBase p_150894_7_) { if ((double)blockIn.getBlockHardness(worldIn, p_150894_4_, p_150894_5_, p_150894_6_) != 0.0D) { stack.damageItem(1, p_150894_7_); } return true; } /** * Returns True is the item is renderer in full 3D when hold. */ @SideOnly(Side.CLIENT) public boolean isFull3D() { return true; } public Item.ToolMaterial getToolMaterial() { 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. */ public boolean getIsRepairable(ItemStack p_82789_1_, ItemStack p_82789_2_) { ItemStack mat = this.toolMaterial.getRepairItemStack(); if (mat != null && net.minecraftforge.oredict.OreDictionary.itemMatches(mat, p_82789_2_, false)) return true; return super.getIsRepairable(p_82789_1_, p_82789_2_); } /** * Gets a map of item attribute modifiers, used by ItemSword to increase hit damage. */ public Multimap getItemAttributeModifiers() { Multimap multimap = super.getItemAttributeModifiers(); multimap.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(itemModifierUUID, "Tool modifier", (double)this.damageVsEntity, 0)); return multimap; } /*===================================== FORGE START =================================*/ private String toolClass; @Override public int getHarvestLevel(ItemStack stack, String toolClass) { int level = super.getHarvestLevel(stack, toolClass); if (level == -1 && toolClass != null && toolClass.equals(this.toolClass)) { return this.toolMaterial.getHarvestLevel(); } else { return level; } } @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 efficiencyOnProperMaterial; } return super.getDigSpeed(stack, block, meta); } /*===================================== FORGE END =================================*/ }