提供: Minecraft Modding Wiki
移動先: 案内検索
(やっぱり削除で。どうしても必要になったら復活させてね。)
 
(4人の利用者による、間の6版が非表示)
1行目: 1行目:
{{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.1207"}}
+
#REDIRECT [[Access Transformer利用]]
{{ チュートリアル難易度 | difficulty=1 |clear=none}}
 
 
 
1.7からの、クラス書き換え方法です。
 
基本的には[[coremodsの基礎]]と同じです。
 
 
 
''import文は記述していません。''
 
 
 
==ソースコード==
 
*SampleClassTransformCore.java
 
<source lang="java">
 
package tutorial.asm;
 
 
 
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;
 
    }
 
}
 
 
 
</source>
 
 
 
*SampleLoadingPlugin.java
 
<source lang="java">
 
package tutorial.asm;
 
 
 
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) {
 
 
 
        }
 
}
 
 
 
</source>
 
 
 
*SampleClassTransformer.java
 
<source lang="java">
 
package tutorial.asm;
 
 
 
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;
 
    }
 
}
 
 
 
</source>
 
 
 
*SampleAccessTransformer.java
 
<source lang="java">
 
package tutorial.asm;
 
 
 
 
 
public class SampleAccessTransformer extends AccessTransformer {
 
    public SampleAccessTransformer() { super("sample_at.cfg"); }
 
}
 
 
 
</source>
 
 
 
*sample_at.cfg
 
<source lang="text">
 
public net.minecraft.client.renderer.ItemRenderer * #クラス丸ごと書き換え
 
public net.minecraft.client.renderer.ItemRenderer *() #メソッドを全て書き換え
 
 
 
</source>
 
 
 
==解説==
 
*SampleClassTransformCore.java
 
Modのダミーのエントリポイント。
 
@Modアノテーションを使わず、DummyModContainerをextendsする。
 
 
 
 
 
*SampleLoadingPlugin.java
 
このModの実体であるLoadingPlugin。
 
ここでクラス書き換えをするクラスのパッケージを返す。
 
 
 
*SampleClassTransformer.java
 
クラス読み込み処理の割り込みをし、クラスを実際に書き換えるクラス。
 
IClassTransformerを実装するため、transformメソッドをオーバーライドする必要がある。
 
 
 
*SampleAccessTransformer.java
 
スーパークラスに書き換えるクラスの詳細情報が入ったcfgファイル名を渡すだけ。
 
 
 
*sample_at.cfg
 
クラス書き換えに関する情報。
 

2017年2月21日 (火) 22:01時点における最新版