提供: Minecraft Modding Wiki
移動先: 案内検索

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。
最新版 編集中の文章
1行目: 1行目:
このページは、ASMの利用方法をサンプルを通じて察してもらうことを目的としている。<br/>
+
このページは、ASMの利用方法をサンプルを通じて察してもらうことを目的としている。
そのため[[Coremodsの基礎]]に含まれている解説はここでは省略する。
 
 
==メソッドの単純な書き換え==
 
==メソッドの単純な書き換え==
 
ここでは、TileEntityFurnaceの書き換えをサンプルとして、メソッドの書き換えを解説する。<br/>
 
ここでは、TileEntityFurnaceの書き換えをサンプルとして、メソッドの書き換えを解説する。<br/>
 +
ただし[[Coremodsの基礎]]や[[1.7のクラス書き換え]]に含まれている解説はここでは省略する。<br/>
 
今回の例ではかまどで焼きあがるまでの時間を200(棒2つ分)から400(棒4つ分)に変更する。
 
今回の例ではかまどで焼きあがるまでの時間を200(棒2つ分)から400(棒4つ分)に変更する。
 
===ソースコード===
 
===ソースコード===
 
*SampleTransformer.java
 
*SampleTransformer.java
 
<source lang = "java">
 
<source lang = "java">
//略
+
import net.minecraft.launchwrapper.IClassTransformer;
 +
import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
 +
import org.objectweb.asm.ClassReader;
 +
import org.objectweb.asm.ClassVisitor;
 +
import org.objectweb.asm.ClassWriter;
 +
import org.objectweb.asm.Type;
  
 
public class SampleTransformer implements IClassTransformer{
 
public class SampleTransformer implements IClassTransformer{
67行目: 72行目:
 
     下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。
 
     下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。
  
     @param returnType {@link String}型か、{@link Class}型で目的のMethodの返り値の型を指定する。
+
     @param returnType {@link String}型か、{@link Class}型を入れる。
     @param rawDesc {@link String}型か、{@link Class}型でMethodの引数たちの型を指定する。
+
     @param rawDesc {@link String}型か、{@link Class}型を入れる。
 
     @throws IllegalArgumentException 引数に{@link String}型か、{@link Class}型以外が入ったら投げられる。
 
     @throws IllegalArgumentException 引数に{@link String}型か、{@link Class}型以外が入ったら投げられる。
    @return Javaバイトコードで扱われる形の文字列に変換されたDescriptor。
 
 
     */
 
     */
 
     public static String toDesc(Object returnType,Object... rawDesc){
 
     public static String toDesc(Object returnType,Object... rawDesc){
86行目: 90行目:
 
     下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。
 
     下手なクラスをここに入れようとするとまずいので確信がない限りStringで入れるべき。
  
     @param raw {@link String}型か、{@link Class}型でASM用の文字列に変換したいクラスを指定する。
+
     @param raw {@link String}型か、プリミティブの{@link Class}型を入れる。
 
     @throws IllegalArgumentException {@param raw}に{@link String}型か、{@link Class}型以外が入ったら投げられる。
 
     @throws IllegalArgumentException {@param raw}に{@link String}型か、{@link Class}型以外が入ったら投げられる。
    @return Javaバイトコードで扱われる形の文字列に変換されたクラス。
 
 
     */
 
     */
 
     public static String toDesc(Object raw){
 
     public static String toDesc(Object raw){
107行目: 110行目:
 
*SampleAdapter.java
 
*SampleAdapter.java
 
<source lang = "java">
 
<source lang = "java">
//略
+
import org.objectweb.asm.ClassVisitor;
 +
import org.objectweb.asm.MethodVisitor;
 +
import org.objectweb.asm.Opcodes;
 +
import org.objectweb.asm.Type;
 +
 
 +
import static com.mods.kina.asm.SampleTransformer.*;
 +
import static org.objectweb.asm.Opcodes.*;
  
 
public class SampleAdapter{
 
public class SampleAdapter{
161行目: 170行目:
 
}
 
}
 
</source>
 
</source>
 
 
===解説===
 
===解説===
 
====SampleTransformer.java====
 
====SampleTransformer.java====
214行目: 222行目:
 
             //super.visitIntInsn(opcode, 400);
 
             //super.visitIntInsn(opcode, 400);
 
             super.visitVarInsn(ALOAD, 1);
 
             super.visitVarInsn(ALOAD, 1);
             super.visitMethodInsn(INVOKESTATIC, "SampleHooks", "totalCookTime", SampleTransformer.toDesc(int.class, "net.minecraft.item.ItemStack"), false);
+
             super.visitMethodInsn(INVOKESTATIC, "SampleHooks", "totalCookTime", "(Lnet/minecraft/item/ItemStack;)I", false);
 
         }
 
         }
 
     }
 
     }
229行目: 237行目:
 
}
 
}
 
</source>
 
</source>
 
 
===解説===
 
===解説===
 
====MethodAdapter====
 
====MethodAdapter====
235行目: 242行目:
 
public void visitIntInsn(int opcode, int operand){
 
public void visitIntInsn(int opcode, int operand){
 
     super.visitVarInsn(ALOAD, 1);
 
     super.visitVarInsn(ALOAD, 1);
     super.visitMethodInsn(INVOKESTATIC, "SampleHooks", "totalCookTime", SampleTransformer.toDesc(int.class, "net.minecraft.item.ItemStack"), false);
+
     super.visitMethodInsn(INVOKESTATIC, "SampleHooks", "totalCookTime", "(Lnet/minecraft/item/ItemStack;)I", false);
 
}
 
}
 
</source>
 
</source>
 
; super.visitVarInsn(ALOAD, 1);
 
; super.visitVarInsn(ALOAD, 1);
: スタックに引数1を積む。(静的でないメソッドの場合、ALOAD 0はthisである。)
+
: スタックに引数1をスタックに積む。(ALOAD 0はthisが入っている。)
 
; super.visitMethodInsn(INVOKESTATIC, "SampleHooks", "totalCookTime", SampleTransformer.toDesc(int.class, "net.minecraft.item.ItemStack"), false);
 
; super.visitMethodInsn(INVOKESTATIC, "SampleHooks", "totalCookTime", SampleTransformer.toDesc(int.class, "net.minecraft.item.ItemStack"), false);
 
: 用意したメソッドを呼ぶ。
 
: 用意したメソッドを呼ぶ。
 
肝心の呼び出したメソッドがハードコーディングだが、このメソッドにEvent発火を仕込むなどすれば利用のしやすさが大きく変わるだろう。
 
肝心の呼び出したメソッドがハードコーディングだが、このメソッドにEvent発火を仕込むなどすれば利用のしやすさが大きく変わるだろう。
 
 
==メソッドを増やす==
 
==メソッドを増やす==
 
(書いている途中ですが、上で説明したのを応用すればなんとかなると思います。)
 
(書いている途中ですが、上で説明したのを応用すればなんとかなると思います。)
251行目: 257行目:
 
(書いている途中ですが、上で説明したのを応用すればなんとかなると思います。)
 
(書いている途中ですが、上で説明したのを応用すればなんとかなると思います。)
 
==その他==
 
==その他==
ASM Bytecode Outlineというプラグインを使うと、バイトコードを見れる
 
 
メソッドやフィールドのMCPは以下のディレクトリ
 
C:\Users\ユーザー名\.gradle\caches\minecraft\de\oceanlabs\mcp\mcp_snapshot
 
 
 
==参考==
 
==参考==
[http://asm.ow2.org/ ASM公式]
+
[[http://asm.ow2.org/ ASM公式]]
[https://ja.wikipedia.org/wiki/Java%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89 Javaバイトコード]
+
[[https://ja.wikipedia.org/wiki/Java%E3%83%90%E3%82%A4%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89 Javaバイトコード]]

Minecraft Modding Wikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMinecraft Modding Wiki:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)