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

返信する

スマイリー
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :| :mrgreen: :geek: :ugeek:

Markdown is OFF

BBCode: ON
[img]: ON
[url]: ON
スマイリー: ON

トピックのレビュー
   

展開ビュー トピックのレビュー: レシピの仕様変更でクラスの書き換えに失敗する

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

by おがさくら » 2021年12月18日(土) 21:12

返信遅れてすみません&ありがとうございます
これ以上は解決できそうにないので諦めることにします...

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

by penM » 2021年11月30日(火) 11:28

予想なのですが、
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 )

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

by おがさくら » 2021年11月24日(水) 11:13

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

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

by penM » 2021年11月21日(日) 22:28

おがさくら さんが書きました: 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 - メソッドの引数の型」を入れるのが問題なのではないでしょうか?

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

by おがさくら » 2021年11月21日(日) 08:57

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

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

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

by penM » 2021年11月20日(土) 16:01

getObjectTypeの返り値がTypeでその際にint参照するんですかね?

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

by おがさくら » 2021年11月19日(金) 20:31

ちなみに似たようなこちらのプログラムはちゃんと作動します

コード: 全て選択

	@Override
	public byte[] transform(final String name,final String transformedName,byte[] bytes){
		if(!"net.minecraft.enchantment.Enchantment".equals(transformedName))
			return bytes;
		ClassReader cr=new ClassReader(bytes);
		ClassWriter cw=new ClassWriter(1);
		ClassVisitor cv=new ClassVisitor(ASM4,cw){
			@Override
			public MethodVisitor visitMethod(int access,String methodName,String desc,String signature,String[] exceptions){
				MethodVisitor mv=super.visitMethod(access,methodName,desc,signature,exceptions);
				String s1=FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(name,methodName,desc);
				if(s1.equals("getTranslatedName")||s1.equals("func_77316_c")||methodName.equals("getTranslatedName")||methodName.equals("func_77316_c")){
					mv=new MethodVisitor(ASM4,mv){
						@Override
						public void visitMethodInsn(int opcode,String owner,String methodName,String desc,boolean itf){
							mv.visitVarInsn(ALOAD,0);
							mv.visitVarInsn(ILOAD,1);

						super.visitMethodInsn(INVOKESTATIC,"com/OgaMod/ASM/Enchantment/TransformerEnchantment","newEnchantname",
								OgaModCorePlugin.toDesc(String.class,"net.minecraft.enchantment.Enchantment",int.class),false);

					}
				};
			}
			return mv;
		}
	};
	cr.accept(cv,ClassReader.EXPAND_FRAMES);
	return cw.toByteArray();
}

public static String newEnchantname(Enchantment enchant,int level){
	String s=StatCollector.translateToLocal(enchant.getName());
	return enchant.getMaxLevel()==1 ? s :level>127?s+" "+level: s+" "+StatCollector.translateToLocal("enchantment.level."+level);

}

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

by おがさくら » 2021年11月19日(金) 20:14

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

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

by おがさくら » 2021年11月16日(火) 19:35

付けてみましたが駄目ですね
同じエラーが出てしまいます

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

by penM » 2021年11月16日(火) 11:48

findMatchingRecipeを見る限り、こいつだけ@Nullableがついているようですが、どうでしょうか?

コード: 全て選択

@Nullable
public ItemStack findMatchingRecipe(InventoryCrafting craftMatrix,
                                               World worldIn)

ページトップ