-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 itemTool
與toolClass = "pickaxe"
和自定義設置(ItemTool
構造函數中的第三個參數),但toolClass
字符串是private
變量。如何建立既
- 擴展
ItemPickaxe
一類,但仍通過這組在構造函數中它的ItemTool
構造 - 延伸
ItemTool
和一類具有toolClass = "pickaxe"
ItemPickaxe
和ItemTool
不能由我修改。否則,我會使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 =================================*/
}
你試過重載構造函數? – SanVed
沒有更多的ItemTool源代碼,不可能告訴你。如果toolClass是最終的,那麼你就卡住了。 如果不是這樣,你可以用[反射](https://docs.oracle.com/javase/tutorial/reflect/)來做你想做的。 –
我沒有嘗試重載構造函數,雖然我不認爲這會幫助,因爲我不能重載ItemTool或ItemPickaxe。 – Schulace