|
|
(4人の利用者による、間の6版が非表示) |
1行目: |
1行目: |
− | {{前提MOD|reqmod="Minecraft Forge Universal 10.13.0.1207"}}
| + | #REDIRECT [[Access Transformer利用]] |
− | {{ チュートリアル難易度 | 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
| |
− | クラス書き換えに関する情報。
| |