提供: Minecraft Modding Wiki
2016年2月20日 (土) 12:05時点における新人もっだー (トーク | 投稿記録)による版
移動先: 案内検索

この記事は"Minecraft Forge Universal 10.13.0.1207"を前提MODとしています。

Iron pickaxe.png
上級者向けのチュートリアルです。



1.7からの、クラス書き換え方法です。 基本的にはcoremodsの基礎と同じです。

import文は記述していません。

ソースコード

  • SampleClassTransformCore.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;
    }
}
  • 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 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);
                }
        }
}
  • sample_at.cfg
public net.minecraft.client.renderer.ItemRenderer * #メンバを全て書き換え
public net.minecraft.client.renderer.ItemRenderer *() #メソッドを全て書き換え
  • MANIFEST.MF
Manifest-Version: 1.0
FMLCorePlugin: tutorial.asm.SampleLoadingPlugin

解説

  • 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フォルダに入れる(無ければ作成)。