====== 添加工具 ======
:!: 本教程自 1.20.5 之后可能已经过时,因为使用了物品组件。最新教程可见 Fabric Docs 上的对应页面。
==== 创建工具材料 ====
工具需要''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]]的最后一段。