提供: Minecraft Modding Wiki
細 |
細 |
||
10行目: | 10行目: | ||
*SampleClassTransformCore.java | *SampleClassTransformCore.java | ||
<source lang="java"> | <source lang="java"> | ||
+ | package tutorial.asm; | ||
public class SampleClassTransformCore extends DummyModContainer { | public class SampleClassTransformCore extends DummyModContainer { | ||
33行目: | 34行目: | ||
*SampleLoadingPlugin.java | *SampleLoadingPlugin.java | ||
<source lang="java"> | <source lang="java"> | ||
+ | package tutorial.asm; | ||
public class SampleLoadingPlugin implements IFMLLoadingPlugin { | public class SampleLoadingPlugin implements IFMLLoadingPlugin { | ||
62行目: | 64行目: | ||
*SampleClassTransformer.java | *SampleClassTransformer.java | ||
<source lang="java"> | <source lang="java"> | ||
+ | package tutorial.asm; | ||
public class SampleCrassTransformer implements IClassTransformer { | public class SampleCrassTransformer implements IClassTransformer { |
2015年1月12日 (月) 19:51時点における版
この記事は"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
クラス書き換えに関する情報。