本帖最后由 youyihj 于 2023-1-9 10:33 编辑 
mojang 判断 UUID 相等居然用 == 的(
 
 
1.12.2 ItemStack 的 getTooltip 方法。
用 ASM 也能接受
mojang 判断 UUID 相等居然用 == 的(
1.12.2 ItemStack 的 getTooltip 方法。
用 ASM 也能接受
 本帖最后由 gooding300 于 2023-1-9 14:03 编辑 
思路就是把if_acmpne改成ifeq再在前面加一个invokestatic java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z。
ASM的话,比较简单的办法是用TreeAPI,具体来说先拿到ItemStack的getTooltip方法的MethodNode,遍历instruments找到if_acmpne,然后判断一下上面2个instruments有没有invokevirtual net.minecraft.entity.ai.attributes.getID ()Ljava/util/UUID;,有的话就把指令替换成ifeq(跳转地址不变),再在前面加一个invokestatic java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z。
因为涉及到上下文关系,用CoreAPI没想到有什么比较干净的办法,等其他大佬的解答。
我的Mixin水平你也知道.jpg
Mixin的话有人写了可以戳我一下。
适用于1.12.2的CoreMod教程,有帮助的话可以点个star:https://github.com/xfl03/CoreModTutor/blob/master/book/4.2.md
思路就是把if_acmpne改成ifeq再在前面加一个invokestatic java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z。
ASM的话,比较简单的办法是用TreeAPI,具体来说先拿到ItemStack的getTooltip方法的MethodNode,遍历instruments找到if_acmpne,然后判断一下上面2个instruments有没有invokevirtual net.minecraft.entity.ai.attributes.getID ()Ljava/util/UUID;,有的话就把指令替换成ifeq(跳转地址不变),再在前面加一个invokestatic java/util/Objects.equals:(Ljava/lang/Object;Ljava/lang/Object;)Z。
因为涉及到上下文关系,用CoreAPI没想到有什么比较干净的办法,等其他大佬的解答。
我的Mixin水平你也知道.jpg
Mixin的话有人写了可以戳我一下。
适用于1.12.2的CoreMod教程,有帮助的话可以点个star:https://github.com/xfl03/CoreModTutor/blob/master/book/4.2.md