提供: Minecraft Modding Wiki
この記事は"Minecraft Forge Universal 10.13.0.1207"を前提MODとしています。 |
1.7からの、クラス書き換え方法です。 基本的にはcoremodsの基礎と同じです。
import文は記述していません。
ソースコード
- SampleClassTransformCore.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; } }
- SampleLoadingPlugin.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) { } }
- SampleClassTransformer.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; } }
- 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
クラス書き換えに関する情報。 resourcesの中の、META-INFフォルダに入れる(なければ作成)。