提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「{{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.1207"}} {{ チュートリアル難易度 | difficulty=1 |clear=none}} 1.7からの、クラス書き換え方法...」)
 
4行目: 4行目:
 
1.7からの、クラス書き換え方法です。
 
1.7からの、クラス書き換え方法です。
 
基本的には[[coremodsの基礎]]と同じです。
 
基本的には[[coremodsの基礎]]と同じです。
 +
 +
''import文は記述していません。''
  
 
==ソースコード==
 
==ソースコード==
9行目: 11行目:
 
<source lang="java">
 
<source lang="java">
  
public class SampleClassTransformCore extends DummyModCore {
+
public class SampleClassTransformCore extends DummyModContainer {
 
     public SampleClassTransformCore() {
 
     public SampleClassTransformCore() {
 +
        super(new ModMetadata());
  
 +
        // @Modのように記述します。
 +
        ModMetadata meta = super.getMetadata();
 +
        meta.modid = "sampleclasstransform";
 +
        meta.name = "SampleClassTransform";
 +
        meta.version = "1.0";
 +
    }
 +
 +
    @Override
 +
    public boolean registerBus(EventBus bus, LoadController lc) {
 +
        bus.register(this);
 +
        return true;
 
     }
 
     }
 
}
 
}
28行目: 42行目:
 
         @Override
 
         @Override
 
         public String[] getASMTransformerClass() {
 
         public String[] getASMTransformerClass() {
                 return new String[] {"sample.SampleClassTransformer"};;
+
                 return new String[] {"tutorial.asm.SampleClassTransformer"};;
 
         }
 
         }
 
         @Override
 
         @Override
 
         public String getModContainerClass() {
 
         public String getModContainerClass() {
                 return null;
+
                 return "tutorial.asm.SampleClassTransformCore";
 
         }
 
         }
 
         @Override
 
         @Override
50行目: 64行目:
  
 
public class SampleCrassTransformer implements IClassTransformer {
 
public class SampleCrassTransformer implements IClassTransformer {
 +
    //この配列に、書き換えるクラス名を完全修飾で記述します。
 +
    public static final String[] transformClasses = new String[] {"net.minecraft.client.renderer.ItemRenderer"};
 +
 
     @Override
 
     @Override
 
     public byte[] transform(byte[] bytes, String name, String transformedName) {
 
     public byte[] transform(byte[] bytes, String name, String transformedName) {
 +
        if (Arrays.asList(transformClasses).contains(name)) {
 +
            return replaceClass(bytes, name, transformedName);
 +
        }
 +
        return bytes;
 +
    }
  
 +
    private byte[] replaceClass(byte[] bytes, String name, String transformedName) {
 +
       
 +
        return bytes;
 
     }
 
     }
 
}
 
}
60行目: 85行目:
 
*SampleAccessTransformer.java
 
*SampleAccessTransformer.java
 
<source lang="java">
 
<source lang="java">
 +
package tutorial.asm;
 +
  
 
public class SampleAccessTransformer extends AccessTransformer {
 
public class SampleAccessTransformer extends AccessTransformer {
69行目: 96行目:
 
*sample_at.cfg
 
*sample_at.cfg
 
<source lang="text">
 
<source lang="text">
public net.minecraft.client.renderer.ItemRenderer  
+
public net.minecraft.client.renderer.ItemRenderer * #クラス丸ごと書き換え
 +
public net.minecraft.client.renderer.ItemRenderer *() #メソッドを全て書き換え
  
</script>
+
</source>
  
 
==解説==
 
==解説==
 +
*SampleClassTransformCore.java
 +
Modのダミーのエントリポイント。
 +
@Modアノテーションを使わず、DummyModContainerをextendsする。
 +
 +
 +
*SampleLoadingPlugin.java
 +
このModの実体であるLoadingPlugin。
 +
ここでクラス書き換えをするクラスのパッケージを返す。
 +
 +
*SampleClassTransformer.java
 +
クラス読み込み処理の割り込みをし、クラスを実際に書き換えるクラス。
 +
IClassTransformerを実装するため、transformメソッドをオーバーライドする必要がある。
 +
 +
*SampleAccessTransformer.java
 +
スーパークラスに書き換えるクラスの詳細情報が入ったcfgファイル名を渡すだけ。
 +
 +
*sample_at.cfg
 +
クラス書き換えに関する情報。

2015年1月12日 (月) 17:08時点における版

この記事は"Minecraft Forge Universal 10.13.0.1207"を前提MODとしています。

Stone pickaxe.png
中級者向けのチュートリアルです。


1.7からの、クラス書き換え方法です。 基本的にはcoremodsの基礎と同じです。

import文は記述していません。

ソースコード

  • SampleClassTransformCore.java
public class SampleClassTransformCore extends DummyModContainer {
    public SampleClassTransformCore() {
        super(new ModMetadata());

        // @Modのように記述します。
        ModMetadata meta = super.getMetadata();
        meta.modid = "sampleclasstransform";
        meta.name = "SampleClassTransform";
        meta.version = "1.0";
    }

    @Override
    public boolean registerBus(EventBus bus, LoadController lc) {
        bus.register(this);
        return true;
    }
}
  • SampleLoadingPlugin.java
public class SampleLoadingPlugin implements IFMLLoadingPlugin {
       @Override
        public String[] getLibraryRequestClass() {
                return null;
        }

        @Override
        public String[] getASMTransformerClass() {
                return new String[] {"tutorial.asm.SampleClassTransformer"};;
        }
        @Override
        public String getModContainerClass() {
                return "tutorial.asm.SampleClassTransformCore";
        }
        @Override
        public String getSetupClass() {
                return null;
        }
        @Override
        public void injectData(Map<String, Object> data) {

        }
}
  • SampleClassTransformer.java
public class SampleCrassTransformer implements IClassTransformer {
    //この配列に、書き換えるクラス名を完全修飾で記述します。
    public static final String[] transformClasses = new String[] {"net.minecraft.client.renderer.ItemRenderer"};

    @Override
    public byte[] transform(byte[] bytes, String name, String transformedName) {
        if (Arrays.asList(transformClasses).contains(name)) {
            return replaceClass(bytes, name, transformedName);
        }
        return bytes;
    }

    private byte[] replaceClass(byte[] bytes, String name, String transformedName) {
        
        return bytes;
    }
}
  • SampleAccessTransformer.java
package tutorial.asm;


public class SampleAccessTransformer extends AccessTransformer {
    public SampleAccessTransformer() { super("sample_at.cfg"); }
}
  • sample_at.cfg
public net.minecraft.client.renderer.ItemRenderer * #クラス丸ごと書き換え
public net.minecraft.client.renderer.ItemRenderer *() #メソッドを全て書き換え

解説

  • SampleClassTransformCore.java

Modのダミーのエントリポイント。 @Modアノテーションを使わず、DummyModContainerをextendsする。


  • SampleLoadingPlugin.java

このModの実体であるLoadingPlugin。 ここでクラス書き換えをするクラスのパッケージを返す。

  • SampleClassTransformer.java

クラス読み込み処理の割り込みをし、クラスを実際に書き換えるクラス。 IClassTransformerを実装するため、transformメソッドをオーバーライドする必要がある。

  • SampleAccessTransformer.java

スーパークラスに書き換えるクラスの詳細情報が入ったcfgファイル名を渡すだけ。

  • sample_at.cfg

クラス書き換えに関する情報。