2015-10-04 35 views
-1

約18小時前,我是構建的minecraft modder。我試圖創建一個類型爲ItemPickaxe的項目,但也希望能夠修改ItemPickaxe的超級構造函數中的參數,該參數不是ItemPickaxe的參數之一。以上是對代碼的解釋,因爲上述內容毫無意義。我如何訪問我使用的構造函數的構造函數,同時仍然保持類型

這裏是ItemPickaxe類的構造函數:

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. 

    } 
} 

這是ItemTool類的構造函數:

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"; 
    } 
} 

我想要做的就是創建一個類,extends itemTooltoolClass = "pickaxe"和自定義設置(ItemTool構造函數中的第三個參數),但toolClass字符串是private變量。如何建立既

  1. 擴展ItemPickaxe一類,但仍通過這組在構造函數中它的ItemTool構造
  2. 延伸ItemTool和一類具有toolClass = "pickaxe"

ItemPickaxeItemTool不能由我修改。否則,我會使toolClass變量公開。

請求了ItemTool類的其餘部分,如下所示。

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 =================================*/ 
} 
+0

你試過重載構造函數? – SanVed

+0

沒有更多的ItemTool源代碼,不可能告訴你。如果toolClass是最終的,那麼你就卡住了。 如果不是這樣,你可以用[反射](https://docs.oracle.com/javase/tutorial/reflect/)來做你想做的。 –

+0

我沒有嘗試重載構造函數,雖然我不認爲這會幫助,因爲我不能重載ItemTool或ItemPickaxe。 – Schulace

回答

相關問題