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