みんながゆっくりしていけるようなマインクラフト非公式フォーラムです。
コンテンツへ
by おがさくら » 2021年12月18日(土) 21:12
返信遅れてすみません&ありがとうございます これ以上は解決できそうにないので諦めることにします...
by penM » 2021年11月30日(火) 11:28
予想なのですが、 public static StringSE getMethodDescriptor(Type returnType,Type... argumentTypes) におけるType returnTypeとは、
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.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.~_TYPE
Type.getMethodDescriptor(void, Type.getObjectType("net/minecraft/tileentity/TileEntity"))
ここで、 Type.getObjectType に関してですが、
Type.getObjectType
getObjectType public static Type getObjectType(StringSE internalName) 指定された内部名に対応する Type を返します。
getObjectType
public static Type getObjectType(StringSE internalName)
Type
とあります。 この関数が返すTypeとは、Type.VOID_TYPEのType.の部分を返しているのではないでしょうか?
Type.
そうすると getMethodDescriptor(Type.getObjectType("net/minecraft/item/ItemStack") , ~) のような表記は、getMethodDescriptorにintなのか、voidなのかを渡していないことになると思います。
getMethodDescriptor(Type.getObjectType("net/minecraft/item/ItemStack") , ~)
getMethodDescriptor
(java書いたこと無いので間違っていたら笑ってください )
by おがさくら » 2021年11月24日(水) 11:13
Type.getObjectType("net/minecraft/item/ItemStack")は戻り値の型だと思うのですが...
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")を入れると起動できなくなってしまいます。
スーパークラスのvisitMethodInsnに引数をそのまま入れて実行するのはできます Type.getObjectType("net/minecraft/item/ItemStack")をType.VOID_TYPEにして呼び出すメソッドもvoid型にするのもできました。 しかし、getMethodDescriptorの第一引数にType.getObjectType("net/minecraft/item/ItemStack")を入れると起動できなくなってしまいます。
getMethodDescriptorの第一引数はreturnType - メソッドの戻りの型なのに「argumentTypes - メソッドの引数の型」を入れるのが問題なのではないでしょうか?
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を使って問題なくできるらしいのでエラーの原因ではないと思われます。
by penM » 2021年11月20日(土) 16:01
getObjectTypeの返り値がTypeでその際にint参照するんですかね?
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); }
by おがさくら » 2021年11月19日(金) 20:14
by おがさくら » 2021年11月16日(火) 19:35
付けてみましたが駄目ですね 同じエラーが出てしまいます
by penM » 2021年11月16日(火) 11:48
findMatchingRecipeを見る限り、こいつだけ@Nullableがついているようですが、どうでしょうか?
@Nullable
@Nullable public ItemStack findMatchingRecipe(InventoryCrafting craftMatrix, World worldIn)
ページトップ
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean
プライバシーについて | 利用規約
Time: 0.016s | Peak Memory Usage: 1.13 MiB | GZIP: On