Table of Contents

エンチャントの追加

Mod にエンチャントを追加するには、次のことを行う必要があります:

エンチャントは、個別に実装されたカスタム機能(鉱石の製錬など)を持つか、適切な場合に適用される既存のメカニズム(DamageEnchantment など)を使用できます。ベースの Enchantment クラスには、 “on enemy hit” 〔敵へのヒット〕のメソッドなど、機能を作成するためのいくつかのメソッドもあります。

Creating Enchantment Class

私たちの新しいエンチャントは Frost と呼ばれ、Mob のヒットを遅くします。 エンチャントのレベルに応じて、減速効果、耐久性、効力が増加します。 エンチャントクラスでは、 UNCOMMON をエンチャントのレアリティとして、 WEAPON をエンチャント ターゲットとして、 MAINHAND をエンチャントの唯一の有効なツールタイプとして渡します。

  1. public class FrostEnchantment extends Enchantment {
  2. public FrostEnchantment() {
  3. super(Enchantment.Rarity.UNCOMMON, EnchantmentTarget.WEAPON, new EquipmentSlot[] {EquipmentSlot.MAINHAND});
  4. }
  5. }

基本的な機能のいくつかの基本的なメソッドをオーバーライドします:

getMinPower は、テーブルでエンチャントを表示するために必要な最小レベルに関連していますが、1:1 の比率ではありません。ほとんどのエンチャントは 10 * level のような値を返しますが、エンチャントの最大レベルと希少性に応じてさまざまなスケールが返されます。いつでも利用できるように 1 を返します。 エンチャントの最大パワーはデフォルトで min(level) + 5 に設定されていることに注意してください。これは、このエンチャントが非常に低いレベルでのみ表示されることを意味します。エンチャントプロパティを自分で微調整し、同様のエンチャント値を見ていい感じの数値を見つける必要があります。

@Override
public int getMinPower(int level) {
    return 1;
}

getMaxLevel はエンチャントのレベル数です。 シャープネスの最大レベルは 5 です。2)

@Override
public int getMaxLevel() {
    return 3;
}

最後に、 onTargetDamage メソッドにスロー効果を実装します。このメソッドは、エンチャントを持つツールで敵を叩いたときに呼び出されます。

@Override
public void onTargetDamaged(LivingEntity user, Entity target, int level) {
    if(target instanceof LivingEntity) {
        ((LivingEntity) target).addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 20 * 2 * level, level - 1));
    }
 
    super.onTargetDamaged(user, target, level);
}

ヒットしているエンティティがステータス効果を持つことができる場合(LivingEntity はステータス効果を持つことができますが、Entity はステータス効果を持つことができません)、それに減速効果を与えます。効果時間はレベルごとに2秒、威力はレベルに相当します。

最終的なエンチャントファイルは次のようになります。

  1. public class FrostEnchantment extends Enchantment {
  2. public FrostEnchantment() {
  3. super(Enchantment.Rarity.UNCOMMON, EnchantmentTarget.WEAPON, new EquipmentSlot[] {EquipmentSlot.MAINHAND});
  4. }
  5.  
  6. @Override
  7. public int getMinPower(int level) {
  8. return 1;
  9. }
  10.  
  11. @Override
  12. public int getMaxLevel() {
  13. return 3;
  14. }
  15.  
  16. public void onTargetDamaged(LivingEntity user, Entity target, int level) {
  17. if(target instanceof LivingEntity) {
  18. ((LivingEntity) target).addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 20 * 2 * level, level - 1));
  19. }
  20.  
  21. super.onTargetDamaged(user, target, level);
  22. }
  23. }

Registering Enchantment

エンチャントの登録は、通常と同じプロセスに従います:

public class EnchantingExample implements ModInitializer {
    public static Enchantment FROST = new FrostEnchantment();
 
    @Override
    public void onInitialize() {
        Registry.register(Registries.ENCHANTMENT, new Identifier("tutorial", "frost"), FROST);
    }
}

これにより、名前空間 tutorial:frost の下にエンチャントが登録されます。宝物以外のすべてのエンチャントは、登録したエンチャントを含め、エンチャントテーブルで利用できます。

Adding Translations & Testing

エンチャントにも翻訳を追加する必要があります。 Mod の言語ファイル に移動して、新しいエントリを追加します。

{
    "enchantment.tutorial.frost": "Frost"
}

If you go in-game, you should be able to enchant main hand weapons with your new enchant.

1)
エンチャントを登録すると、レベルごとに本が自動的にゲームに追加されます。エンチャントの翻訳名(enchantment.modid.enchantname)が本名として表示されます。
2)
複数のレベルを持つエンチャントには、レベルを示すために名前の後にローマ数字が付きます。エンチャントに単一のレベルしかない場合、何も追加されません。