======= インターフェイスインジェクション ======= これは、特定の既存のクラスにメソッドを追加するために Loom 0.11 で導入された新しい手法です。 より具体的には、インターフェイスを作成し、このインターフェイスをクラスに注入できます。 その結果、ターゲットクラスは、インターフェイスのすべてのメソッドを、常に持っているかのように取得します。 インターフェイスインジェクションはコンパイル時のみの機能です。これは、ミックスインを使用してインターフェイスをターゲットクラスに実装する必要があることを意味します。 これはライブラリで特に便利です。これにより、既存のクラスに新しいメソッドを追加して、毎回インターフェイスをキャストまたは再実装する必要なくそれらを使用できます。 例を挙げて説明しましょう: この例のスコープは、次のメソッドを '''' に追加して、バケツが空になったときの音を取得することです。 '''' には同様のメソッドがないため、通常、これは不可能です。 Optional getBucketEmptySound() メソッドをクラスに追加するには、まず最初にそれとのインターフェースを作成する必要があります: package net.fabricmc.example; public interface BucketEmptySoundGetter { // 注入されたインターフェースのメソッドは default でなければなりません。 // そうでなければ、それらを参照するコードはコンパイルされません! default Optional getBucketEmptySound() { return Optional.empty(); } } ここで、インターフェースを実装するミックスインを使用して、このインターフェースを '''' に実装する必要があります: @Mixin(class_3609.class) public class MixinFlowableFluid implements BucketEmptySoundGetter { @Override public Optional getBucketEmptySound() { // これは、BucketItem クラスからコピーされたデフォルトのサウンドを取得する方法です。 return Optional.of(((class_3609) (Object) this).method_15791(class_3486.field_15518) ? class_3417.field_15010 : class_3417.field_14834); } } 最後に、インターフェイスを '''' に注入する必要があります。 次のスニペットを fabric.mod.json ファイルに追加して、 '''' クラスに 1 つ以上のインターフェイスを追加できます。 ここでのすべてのクラス名は、ドットの代わりにスラッシュを使用する "internal names" 〔内部名〕を使用する必要があることに注意してください(例: ''path/to/my/Class'')。 { "custom": { "loom:injected_interfaces": { "net/minecraft/class_3609": ["net/fabricmc/example/BucketEmptySoundGetter"] } } } これで、新しいメソッドを使用できます: Optional sound = mytestfluid.getBucketEmptySound(); を拡張するクラスでこのメソッドをオーバーライドして、カスタム動作を実装することもできます。