本教程自 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());
如果要向工具添加任何特殊属性或行为,请创建一个子类来扩展基本工具类,并重写任何需要的的方法。
注册物品可以参考此教程。
请参考mining_levels的最后一段。