====== 添加工具 ====== ==== 创建工具材料 ==== 工具需要''ToolMaterial''来定义以下行为: * 耐久 * 挖掘速度 * 攻击伤害 * 挖掘等级 * 附魔级别 * 修复原料 换句话说,工具材料定义了该类工具的//基本//功能,工具可以选择使用由材料提供的值,或者使用其自己的。 原版的工具材料在''ToolMaterials''中。我们为我们的材料创建单独的类: public class PotatoToolMaterial implements ToolMaterial { [...] } ''ToolMaterial''需要实现一系列方法: === 耐久 === ''getDurability''定义了工具在使用此材料时的耐久。所有相同类型的原版工具都有相同的耐久。 @Override public int getDurability() { return 500; } === 挖掘速度 === ''getMiningSpeedMultiplier''定义了工具破坏方块的速度。木制工具的速度为2.0F,钻石工具的速度为8.0F。 @Override public float getMiningSpeedMultiplier() { return 5.0F; } === 攻击伤害 === ''getAttackDamage''返回工具的基本伤害。注意//大多数//工具在其构造器中都需要一个整数,这意味着最终的攻击伤害为''(float) materialDamage + (int) toolDamage + 1''。如果你需要工具在其构造器中完全控制其伤害数量,你可以让材料返回0F的攻击伤害。 @Override public float getAttackDamage() { return 3.0F; } === 挖掘等级 === ''getMiningLevel''设置了工具的挖掘等级。钻石的挖掘等级为3,黑曜石需要3+的挖掘等级来挖掘。 @Override public int getMiningLevel() { return 2; } === 附魔能力 === ''getEnchantability''定义了工具可以如何附魔。金有22的附魔能力,钻石的附魔能力为10。更高的附魔能力意味着更好(更高等级)的附魔。 @Override public int getEnchantability() { return 15; } === 修复原料 === ''getRepairIngredient''返回在铁砧中修复物品所需要的''Ingredient''。 @Override public Ingredient getRepairIngredient() { return Ingredient.ofItems(Items.POTATO); } ''ToolMaterial''//不需要//注册。将其传递给需要的工具的一种较好的方法,是将实例保存在某个地方(然后在需要时引用它)。在本例中,我们把实例放在ToolMaterial类的顶部: public class PotatoToolMaterial implements ToolMaterial { public static final PotatoToolMaterial INSTANCE = new PotatoToolMaterial(); [...] } ''PotatoToolMaterial''可以使用''PotatoToolMaterial.INSTANCE''引用。 ==== 创建工具 ==== 所有的基本工具类(''PickaxeItem''、''ShovelItem''、''HoeItem''、''AxeItem''、''SwordItem'')都需要一个''ToolMaterial''、攻击速度(浮点)、额外攻击伤害数量(整数)、''Item.Settings''实例。 public static ToolItem POTATO_SHOVEL = new ShovelItem(PotatoToolMaterial.INSTANCE, 1.5F, -3.0F, new Item.Settings()); public static ToolItem POTATO_SWORD = new SwordItem(PotatoToolMaterial.INSTANCE, 3, -2.4F, new Item.Settings()); `PickaxeItem`、`HoeItem`和`AxeItem`都有受保护的构造器,这意味着你需要用公开的构造器创建子类: public class CustomPickaxeItem extends PickaxeItem { public CustomPickaxeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { super(material, attackDamage, attackSpeed, settings); } } 使用自定义的子类: public static ToolItem POTATO_PICKAXE = new CustomPickaxeItem(PotatoToolMaterial.INSTANCE, 1, -2.8F, new Item.Settings()); public static ToolItem POTATO_AXE = new CustomAxeItem(PotatoToolMaterial.INSTANCE, 7.0F, -3.2F, new Item.Settings()); public static ToolItem POTATO_HOE = new CustomHoeItem(PotatoToolMaterial.INSTANCE, 7, -3.2F, new Item.Settings()); 如果要向工具添加任何特殊属性或行为,请创建一个子类来扩展基本工具类,并重写任何需要的的方法。 ==== 注册物品 ==== 注册物品可以参考[[zh_cn:tutorial:items|此教程]]。 ==== 让你的工具对非原版方块起作用 ==== 请参考[[zh_cn:tutorial:mining_levels]]的最后一段。