-1

I'm a buildding minecraft modder as of about 18 hours ago. I'm trying to create an item which is of type ItemPickaxe, but would also like to be able to modify a parameter in the ItemPickaxe's super constructor that's not one of the parameters for ItemPickaxe. Here's an explanation with code as the above makes little sense.

Here is the ItemPickaxe class constructor:

public class ItemPickaxe extends ItemTool
{
    protected ItemPickaxe(Item.ToolMaterial material)
    {
        super(2.0F, material, field); // 2.0F is an efficiency, material is the material, and field is a set of blocks that the tool works on.

    }
}

This is the ItemTool class constructor:

public class ItemTool extends Item
{

protected ItemTool(float p_i45333_1_, Item.ToolMaterial p_i45333_2_, Set p_i45333_3_)
{
    this.toolMaterial = p_i45333_2_;
    this.field_150914_c = p_i45333_3_;
    this.maxStackSize = 1;
    this.setMaxDamage(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";
    }
}

What I'm trying to do is create a class that extends itemTool with toolClass = "pickaxe" and a custom set (the third parameter in the ItemTool constructor), but the toolClass string is a private variable. How can I create either

  1. a class extending ItemPickaxe and but still pass the set in the constructor to it's ItemTool constructor
  2. a class extending ItemTool and have toolClass = "pickaxe"

ItemPickaxe and ItemTool can't be modified by me. Otherwise I would have made the toolClass variable public.

The rest of the ItemTool class was requested, and is as follows.

package net.minecraft.item;


public class ItemTool extends Item
{
    private Set field_150914_c;
    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.field_150914_c = p_i45333_3_;
    this.maxStackSize = 1;
    this.setMaxDamage(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 func_150893_a(ItemStack p_150893_1_, Block p_150893_2_)
{
    return this.field_150914_c.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 p_77644_1_, EntityLivingBase p_77644_2_, EntityLivingBase p_77644_3_)
{
    p_77644_1_.damageItem(2, p_77644_3_);
    return true;
}

public boolean onBlockDestroyed(ItemStack p_150894_1_, World p_150894_2_, Block p_150894_3_, int p_150894_4_, int p_150894_5_, int p_150894_6_, EntityLivingBase p_150894_7_)
{
    if ((double)p_150894_3_.getBlockHardness(p_150894_2_, p_150894_4_, p_150894_5_, p_150894_6_) != 0.0D)
    {
        p_150894_1_.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 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.
 */
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(field_111210_e, "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 =================================*/
}
Unihedron
  • 10,902
  • 13
  • 62
  • 72
Schulace
  • 13
  • 4

1 Answers1

1

The only way is to use reflection to assign a value to toolClass, overriding the private flag.

https://stackoverflow.com/a/3239068/3622940

Community
  • 1
  • 1
Unihedron
  • 10,902
  • 13
  • 62
  • 72