Skip to content
This repository was archived by the owner on May 30, 2022. It is now read-only.

Commit c425d55

Browse files
committed
Fix crash with TrumpetSkeleton Closes #127
1 parent e82861a commit c425d55

File tree

2 files changed

+60
-0
lines changed

2 files changed

+60
-0
lines changed
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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+
}

src/main/java/me/modmuss50/optifabric/patcher/fixes/OptifineFixer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,14 @@ private OptifineFixer() {
2424
//net/minecraft/client/Keyboard
2525
registerFix("class_309", new KeyboardFix());
2626

27+
//net/minecraft/client/render/item/HeldItemRenderer
28+
registerFix("class_759", new HeldItemRendererFix());
29+
2730
//net/minecraft/client/particle/ParticleManager
2831
skipClass("class_702");
32+
33+
//net/minecraft/client/render/item/HeldItemRenderer$1
34+
skipClass("class_759$1");
2935
}
3036

3137
private void registerFix(String className, ClassFixer classFixer) {

0 commit comments

Comments
 (0)