===== エンチャントの追加 =====
Mod にエンチャントを追加するには、次のことを行う必要があります:
* ''Enchantment'' または別の既存のエンチャント(''DamageEnchantment'' など)を拡張するクラスを作成する
* エンチャントを登録する
* 必要に応じてカスタム機能またはメカニズムを追加します
* エンチャントの翻訳を追加((エンチャントを登録すると、レベルごとに本が自動的にゲームに追加されます。エンチャントの翻訳名(''enchantment.modid.enchantname'')が本名として表示されます。))
エンチャントは、個別に実装されたカスタム機能(鉱石の製錬など)を持つか、適切な場合に適用される既存のメカニズム(''DamageEnchantment'' など)を使用できます。ベースの ''Enchantment'' クラスには、 "on enemy hit" 〔敵へのヒット〕のメソッドなど、機能を作成するためのいくつかのメソッドもあります。
==== Creating Enchantment Class ====
私たちの新しいエンチャントは //Frost// と呼ばれ、Mob のヒットを遅くします。 エンチャントのレベルに応じて、減速効果、耐久性、効力が増加します。 エンチャントクラスでは、 ''UNCOMMON'' をエンチャントのレアリティとして、 ''WEAPON'' をエンチャント ターゲットとして、 ''MAINHAND'' をエンチャントの唯一の有効なツールタイプとして渡します。
public class FrostEnchantment extends Enchantment {
public FrostEnchantment() {
super(Enchantment.Rarity.UNCOMMON, EnchantmentTarget.WEAPON, new EquipmentSlot[] {EquipmentSlot.MAINHAND});
}
}
基本的な機能のいくつかの基本的なメソッドをオーバーライドします:
''getMinPower'' は、テーブルでエンチャントを表示するために必要な最小レベルに関連していますが、1:1 の比率ではありません。ほとんどのエンチャントは ''10 * level'' のような値を返しますが、エンチャントの最大レベルと希少性に応じてさまざまなスケールが返されます。いつでも利用できるように 1 を返します。 エンチャントの最大パワーはデフォルトで ''min(level) + 5'' に設定されていることに注意してください。これは、このエンチャントが非常に低いレベルでのみ表示されることを意味します。エンチャントプロパティを自分で微調整し、同様のエンチャント値を見ていい感じの数値を見つける必要があります。
@Override
public int getMinPower(int level) {
return 1;
}
''getMaxLevel'' はエンチャントのレベル数です。 シャープネスの最大レベルは 5 です。((複数のレベルを持つエンチャントには、レベルを示すために名前の後にローマ数字が付きます。エンチャントに単一のレベルしかない場合、何も追加されません。))
@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秒、威力はレベルに相当します。
最終的なエンチャントファイルは次のようになります。
public class FrostEnchantment extends Enchantment {
public FrostEnchantment() {
super(Enchantment.Rarity.UNCOMMON, EnchantmentTarget.WEAPON, new EquipmentSlot[] {EquipmentSlot.MAINHAND});
}
@Override
public int getMinPower(int level) {
return 1;
}
@Override
public int getMaxLevel() {
return 3;
}
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);
}
}
==== 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 ====
エンチャントにも翻訳を追加する必要があります。 [[tutorial:lang|Mod の言語ファイル]] に移動して、新しいエントリを追加します。
{
"enchantment.tutorial.frost": "Frost"
}
If you go in-game, [[https://i.imgur.com/31nFl2H.png|you should be able to enchant main hand weapons with your new enchant.]]