提供: 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 | + | 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[] {" | + | return new String[] {"tutorial.asm.SampleClassTransformer"};; |
} | } | ||
@Override | @Override | ||
public String getModContainerClass() { | public String getModContainerClass() { | ||
− | return | + | 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 *() #メソッドを全て書き換え | ||
− | </ | + | </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としています。 |
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
クラス書き換えに関する情報。