レシピの仕様変更でクラスの書き換えに失敗する

MOD・プラグイン・ツールなどの開発に関する質問はこちら
アバター
おがさくら
初心者
記事: 9
登録日時: 2020年11月15日(日) 20:49
お住まい: 愛知県
ウェブサイト: https://drive.google.com/drive/folders/ ... sp=sharing

Re: レシピの仕様変更でクラスの書き換えに失敗する

投稿記事 by おがさくら »

visitMethodInsnのdesc引数を"Lnet/minecraft/inventory/InventoryCrafting;Lnet/minecraft/world/World;)Lnet/minecraft/item/ItemStack;"に変えても駄目だったので関係ないかと...

https://www.tntmodders.com/tutorial/asm-1710/
こちらのサイトの内容を参考にしているのですがgetObjectTypeを使って問題なくできるらしいのでエラーの原因ではないと思われます。

1.2.5&1.7.10Modder
鉄ヲタ、東方好き
使用の際にはこちらをお読みください↓
https://docs.google.com/document/d/18oV ... sp=sharing

penM
サーバー管理者
記事: 137
登録日時: 2019年7月23日(火) 02:14

Re: レシピの仕様変更でクラスの書き換えに失敗する

投稿記事 by penM »

おがさくら さんが書きました: 2021年11月19日(金) 20:14

スーパークラスのvisitMethodInsnに引数をそのまま入れて実行するのはできます
Type.getObjectType("net/minecraft/item/ItemStack")をType.VOID_TYPEにして呼び出すメソッドもvoid型にするのもできました。
しかし、getMethodDescriptorの第一引数にType.getObjectType("net/minecraft/item/ItemStack")を入れると起動できなくなってしまいます。

getMethodDescriptorの第一引数はreturnType - メソッドの戻りの型なのに「argumentTypes - メソッドの引数の型」を入れるのが問題なのではないでしょうか?

アバター
おがさくら
初心者
記事: 9
登録日時: 2020年11月15日(日) 20:49
お住まい: 愛知県
ウェブサイト: https://drive.google.com/drive/folders/ ... sp=sharing

Re: レシピの仕様変更でクラスの書き換えに失敗する

投稿記事 by おがさくら »

Type.getObjectType("net/minecraft/item/ItemStack")は戻り値の型だと思うのですが...

1.2.5&1.7.10Modder
鉄ヲタ、東方好き
使用の際にはこちらをお読みください↓
https://docs.google.com/document/d/18oV ... sp=sharing

penM
サーバー管理者
記事: 137
登録日時: 2019年7月23日(火) 02:14

Re: レシピの仕様変更でクラスの書き換えに失敗する

投稿記事 by penM »

予想なのですが、
public static StringSE getMethodDescriptor(Type returnType,Type... argumentTypes)
におけるType returnTypeとは、

  • Type.VOID_TYPE

  • Type.SHORT_TYPE

  • Type.LONG_TYPE

  • Type.INT_TYPE

  • Type.FLOAT_TYPE

  • Type.DOUBLE_TYPE

  • Type.CHAR_TYPE

  • Type.BYTE_TYPE

  • Type.BOOLEAN_TYPE

を指しているのではないでしょうか?

この根拠としては、参考サイトに
Type.getMethodDescriptor(Type.VOID_TYPE, Type.getObjectType("net/minecraft/tileentity/TileEntity"))
の記述があるためです。

そしてType.~_TYPEは、java内部での基本タイプ(int,void,char)への単なる参照な気がします。
書き方があっているかわかりませんが、下記のように表記しても動きそうな気がします。
Type.getMethodDescriptor(void, Type.getObjectType("net/minecraft/tileentity/TileEntity"))

ここで、
Type.getObjectType
に関してですが、

getObjectType
public static Type getObjectType(StringSE internalName)
指定された内部名に対応する Type を返します。

とあります。
この関数が返すTypeとは、Type.VOID_TYPEType.の部分を返しているのではないでしょうか?

そうすると
getMethodDescriptor(Type.getObjectType("net/minecraft/item/ItemStack") , ~)
のような表記は、getMethodDescriptorにintなのか、voidなのかを渡していないことになると思います。

(java書いたこと無いので間違っていたら笑ってください :D )

返信する