ツールには、次の動作を定義する 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
は登録する必要はありません。それらを必要とする道具にそれらを渡す良い方法は、インスタンスをどこかに保持することです(そして、必要なときにそれを参照します)。この場合、インスタンスを道具材料クラスの先頭に配置します。
public class PotatoToolMaterial implements ToolMaterial { public static final PotatoToolMaterial INSTANCE = new PotatoToolMaterial(); [...] }
PotatoToolMaterial
は PotatoToolMaterial.INSTANCE
で参照できるようになりました。
すべての基本道具クラス(PickaxeItem
、ShovelItem
、HoeItem
、AxeItem
、SwordItem
)には ToolMaterial
、攻撃速度(float)、追加の攻撃力(AxeItem は float、残りは int)、および Item.Settings
インスタンスが必要です。
public static ToolItem POTATO_SHOVEL = new ShovelItem(PotatoToolMaterial.INSTANCE, 1.5F, -3.0F, new Item.Settings().method_7892(ItemGroup.field_7930)); public static ToolItem POTATO_SWORD = new SwordItem(PotatoToolMaterial.INSTANCE, 3, -2.4F, new Item.Settings().method_7892(ItemGroup.field_7916));
PickaxeItem
、 HoeItem
および AxeItem
には保護されたコンストラクターがあります。つまり、 public コンストラクターを使用して独自のクラスを作成する必要があります:
public class CustomPickaxeItem extends PickaxeItem { public CustomPickaxeItem(ToolMaterial material, int attackDamage, float attackSpeed, Settings settings) { super(material, attackDamage, attackSpeed, settings); } }
public クラスの使用:
public static ToolItem POTATO_PICKAXE = new CustomPickaxeItem(PotatoToolMaterial.INSTANCE, 1, -2.8F, new Item.Settings().method_7892(ItemGroup.field_7930)); public static ToolItem POTATO_AXE = new CustomAxeItem(PotatoToolMaterial.INSTANCE, 7.0F, -3.2F, new Item.Settings().method_7892(ItemGroup.field_7930)); public static ToolItem POTATO_HOE = new CustomHoeItem(PotatoToolMaterial.INSTANCE, 7, -3.2F, new Item.Settings().method_7892(ItemGroup.field_7930));
道具に特別な属性または動作を追加する場合は、基本道具クラスの 1 つを拡張するサブクラスを作成し、必要なメソッドをオーバーライドします。
アイテム登録のまとめについては、 アイテムのチュートリアル をお読みください。
https://fabricmc.net/wiki/tutorial:mining_levels の最後のセクションにアクセスしてください。