-
Notifications
You must be signed in to change notification settings - Fork 1
/
EntityRendererTransformer.java
89 lines (82 loc) · 4.33 KB
/
EntityRendererTransformer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package io.github.yamporg.darkness.asm;
import net.minecraft.launchwrapper.IClassTransformer;
import net.minecraftforge.fml.common.asm.transformers.deobf.FMLDeobfuscatingRemapper;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.Type;
import org.objectweb.asm.commons.GeneratorAdapter;
import org.objectweb.asm.commons.Method;
public final class EntityRendererTransformer implements IClassTransformer {
private static final String ENTITY_RENDERER = "net.minecraft.client.renderer.EntityRenderer";
private static final String UPDATE_LIGHTMAP_OWNER = ENTITY_RENDERER.replace(".", "/");
private static final String UPDATE_LIGHTMAP_DESC = "(F)V";
private static final String UPDATE_LIGHTMAP_NAME =
FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(
UPDATE_LIGHTMAP_OWNER, "func_78472_g", UPDATE_LIGHTMAP_DESC);
private static final String DYNAMIC_TEXTURE =
"net.minecraft.client.renderer.texture.DynamicTexture";
private static final String UPDATE_DYNAMIC_TEXTURE_OWNER = DYNAMIC_TEXTURE.replace(".", "/");
private static final String UPDATE_DYNAMIC_TEXTURE_DESC = "()V";
private static final String UPDATE_DYNAMIC_TEXTURE_NAME =
FMLDeobfuscatingRemapper.INSTANCE.mapMethodName(
UPDATE_DYNAMIC_TEXTURE_OWNER, "func_110564_a", UPDATE_DYNAMIC_TEXTURE_DESC);
private static final String ENTITY_RENDERER_HOOKS =
EntityRendererHooks.class.getName().replace('.', '/');
private static final String ON_UPDATE_LIGHTMAP_DESC =
"(Lnet/minecraft/client/renderer/EntityRenderer;F)V";
private static final String ON_UPDATE_LIGHTMAP_NAME = "onUpdateLightmap";
@Override
public byte[] transform(String name, String transformedName, byte[] basicClass) {
if (!ENTITY_RENDERER.equals(transformedName)) {
return basicClass;
}
ClassReader cr = new ClassReader(basicClass);
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);
cr.accept(
new ClassVisitor(Opcodes.ASM5, cw) {
@Override
public MethodVisitor visitMethod(
int access,
String name,
String desc,
String signature,
String[] exceptions) {
MethodVisitor mv =
super.visitMethod(access, name, desc, signature, exceptions);
if (!UPDATE_LIGHTMAP_NAME.equals(name)
|| !UPDATE_LIGHTMAP_DESC.equals(desc)) {
return mv;
}
return new GeneratorAdapter(api, mv, access, name, desc) {
@Override
public void visitMethodInsn(
int opcode,
String owner,
String name,
String desc,
boolean itf) {
if (!itf
&& Opcodes.INVOKEVIRTUAL != opcode
&& !UPDATE_DYNAMIC_TEXTURE_OWNER.equals(owner)
&& !UPDATE_DYNAMIC_TEXTURE_NAME.equals(name)
&& !UPDATE_DYNAMIC_TEXTURE_DESC.equals(desc)) {
loadThis();
loadArgs();
invokeStatic(
Type.getObjectType(ENTITY_RENDERER_HOOKS),
new Method(
ON_UPDATE_LIGHTMAP_NAME,
ON_UPDATE_LIGHTMAP_DESC));
}
super.visitMethodInsn(opcode, owner, name, desc, itf);
}
};
}
},
ClassReader.SKIP_FRAMES);
return cw.toByteArray();
}
}