提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
− | + | {{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.1207"}} | |
+ | {{ チュートリアル難易度 | 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 | ||
+ | クラス書き換えに関する情報。 |