提供: Minecraft Modding Wiki
この編集を取り消せます。
下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 | 編集中の文章 | ||
1行目: | 1行目: | ||
#REDIRECT [[Access Transformer利用]] | #REDIRECT [[Access Transformer利用]] | ||
+ | <!---{{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.1207"}} | ||
+ | {{ チュートリアル難易度 | difficulty=2 |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のように記述します(mcmod.infoは使えない)。 | ||
+ | ModMetadata meta = super.getMetadata(); | ||
+ | meta.modid = "sampleclasstransform"; | ||
+ | meta.name = "SampleClassTransform"; | ||
+ | meta.version = "1.0"; | ||
+ | // 以下は省略可 | ||
+ | meta.authorList = Arrays.asList(new String[] { "Example" }); | ||
+ | meta.description = "A tutorial access transformer mod."; | ||
+ | meta.url = "http://..."; | ||
+ | } | ||
+ | |||
+ | @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 SampleClassTransformer extends AccessTransformer { | ||
+ | private static TutorialAccessTransformer instance; | ||
+ | private static List mapFiles = new LinkedList(); | ||
+ | public TutorialAccessTransformer() throws IOException { | ||
+ | super(); | ||
+ | instance = this; | ||
+ | // ここで自分の書き換えるクラス情報を登録する。 | ||
+ | mapFiles.add("tutorial_at.cfg"); | ||
+ | for (String file : mapFiles) { | ||
+ | readMapFile(file); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | public static void addTransformerMap(String mapFileName) { | ||
+ | if (instance == null) { | ||
+ | mapFiles.add(mapFileName); | ||
+ | } | ||
+ | else { | ||
+ | instance.readMapFile(mapFileName); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | private void readMapFile(String name) { | ||
+ | System.out.println("Adding transformer map: " + name); | ||
+ | try { | ||
+ | // AccessTramsformer(スーパークラス)からreadMapFileのメソッドを読み込み、privateメソッドを実行します。 | ||
+ | Method e = AccessTransformer.class.getDeclaredMethod("readMapFile", new Class[]{String.class}); | ||
+ | e.setAccessible(true); | ||
+ | e.invoke(this, new Object[]{name}); | ||
+ | } | ||
+ | catch (Exception ex) { | ||
+ | throw new RuntimeException(ex); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | </source> | ||
+ | |||
+ | *sample_at.cfg | ||
+ | <source lang="text"> | ||
+ | public net.minecraft.client.renderer.ItemRenderer * #メンバを全て書き換え | ||
+ | public net.minecraft.client.renderer.ItemRenderer *() #メソッドを全て書き換え | ||
+ | |||
+ | </source> | ||
+ | |||
+ | *MANIFEST.MF | ||
+ | <source lang="text"> | ||
+ | Manifest-Version: 1.0 | ||
+ | FMLCorePlugin: tutorial.asm.SampleLoadingPlugin | ||
+ | </source> | ||
+ | |||
+ | ==解説== | ||
+ | *SampleClassTransformCore.java | ||
+ | Modのダミーのエントリポイント。 | ||
+ | @Modアノテーションを使わず、DummyModContainerをextendsする。 | ||
+ | |||
+ | |||
+ | *SampleLoadingPlugin.java | ||
+ | このModの実体であるLoadingPlugin。 | ||
+ | ここでクラス書き換えをするクラスのパッケージを返す。 | ||
+ | |||
+ | *SampleClassTransformer.java | ||
+ | クラス読み込み処理の割り込みをし、クラスを実際に書き換えるクラス。 | ||
+ | IClassTransformerを実装するため、transformメソッドをオーバーライドする必要がある。 | ||
+ | |||
+ | *SampleAccessTransformer.java | ||
+ | スーパークラスに書き換えるクラスの詳細情報が入ったcfgファイル名を渡すだけ。 | ||
+ | |||
+ | *sample_at.cfg | ||
+ | クラス書き換えに関する情報。 | ||
+ | resourcesフォルダに入れる。 | ||
+ | |||
+ | *MANIFEST.MF | ||
+ | CoreModの読み込みやデバッグに必須なファイル。 | ||
+ | resources/META-INFフォルダに入れる(無ければ作成)。 | ||
+ | ---> |