|
| 1 | +package me.modmuss50.optifabric.patcher.fixes; |
| 2 | + |
| 3 | +import me.modmuss50.optifabric.util.RemappingUtils; |
| 4 | +import org.apache.commons.lang3.Validate; |
| 5 | +import org.objectweb.asm.Opcodes; |
| 6 | +import org.objectweb.asm.tree.ClassNode; |
| 7 | +import org.objectweb.asm.tree.InsnList; |
| 8 | +import org.objectweb.asm.tree.InsnNode; |
| 9 | +import org.objectweb.asm.tree.JumpInsnNode; |
| 10 | +import org.objectweb.asm.tree.LabelNode; |
| 11 | +import org.objectweb.asm.tree.MethodInsnNode; |
| 12 | +import org.objectweb.asm.tree.MethodNode; |
| 13 | +import org.objectweb.asm.tree.VarInsnNode; |
| 14 | + |
| 15 | +//https://github.com/JamiesWhiteShirt/trumpet-skeleton-fabric/blob/45a1a99169593f0ff0f4a6985769fa108f70bceb/src/main/java/com/jamieswhiteshirt/trumpetskeleton/mixin/client/HeldItemRendererMixin.java |
| 16 | +public class HeldItemRendererFix implements ClassFixer { |
| 17 | + |
| 18 | + //renderFirstPersonItem(Lnet/minecraft/client/network/AbstractClientPlayerEntity;FFLnet/minecraft/util/Hand;FLnet/minecraft/item/ItemStack;FLnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;I)V |
| 19 | + private String renderFirstPersonItemName = RemappingUtils.getMethodName("class_759", "method_3228", "(Lnet/minecraft/class_742;FFLnet/minecraft/class_1268;FLnet/minecraft/class_1799;FLnet/minecraft/class_4587;Lnet/minecraft/class_4597;I)V"); |
| 20 | + //net/minecraft/util/Hand |
| 21 | + private String handName = RemappingUtils.fromIntermediary("class_1268"); |
| 22 | + |
| 23 | + //Use the vanilla method here, while adding back some of optifines tweaks to it |
| 24 | + @Override |
| 25 | + public void fix(ClassNode optifine, ClassNode minecraft) { |
| 26 | + Validate.notNull(renderFirstPersonItemName, "Failed to find name for renderFirstPersonItem"); |
| 27 | + Validate.notNull(handName, "Failed to find name for handName"); |
| 28 | + MethodNode oldNode = minecraft.methods.stream().filter(methodNode -> methodNode.name.equals(renderFirstPersonItemName)).findFirst().orElse(null); |
| 29 | + Validate.notNull(oldNode, "Failed to find old " + renderFirstPersonItemName + " method"); |
| 30 | + |
| 31 | + InsnList insnList = new InsnList(); |
| 32 | + insnList.add(getInstList("net/optifine/Config", "isShaders", "()Z")); |
| 33 | + |
| 34 | + insnList.add(new VarInsnNode(Opcodes.ALOAD, 4)); |
| 35 | + insnList.add(getInstList("net/optifine/shaders/Shaders", "isSkipRenderHand", String.format("(L%s;)Z", handName))); |
| 36 | + |
| 37 | + oldNode.instructions.insertBefore(oldNode.instructions.getFirst(), insnList); |
| 38 | + |
| 39 | + //Remove the old method |
| 40 | + optifine.methods.removeIf(methodNode -> methodNode.name.equals(renderFirstPersonItemName)); |
| 41 | + //Add the replacement method back |
| 42 | + optifine.methods.add(oldNode); |
| 43 | + } |
| 44 | + |
| 45 | + private InsnList getInstList(String owner, String name, String descriptor) { |
| 46 | + InsnList insnList = new InsnList(); |
| 47 | + insnList.add(new MethodInsnNode(Opcodes.INVOKESTATIC, owner, name, descriptor, false)); |
| 48 | + LabelNode jumpNode = new LabelNode(); |
| 49 | + insnList.add(new JumpInsnNode(Opcodes.IFEQ, jumpNode)); |
| 50 | + insnList.add(new InsnNode(Opcodes.RETURN)); |
| 51 | + insnList.add(jumpNode); |
| 52 | + return insnList; |
| 53 | + } |
| 54 | +} |
0 commit comments