1515import org .objectweb .asm .ClassReader ;
1616import org .objectweb .asm .ClassWriter ;
1717import org .objectweb .asm .Opcodes ;
18+ import org .objectweb .asm .commons .ClassRemapper ;
19+ import org .objectweb .asm .commons .Remapper ;
1820import org .objectweb .asm .commons .RemappingClassAdapter ;
1921import org .objectweb .asm .tree .AbstractInsnNode ;
2022import org .objectweb .asm .tree .ClassNode ;
2123import org .objectweb .asm .tree .FieldNode ;
24+ import org .objectweb .asm .tree .InsnList ;
25+ import org .objectweb .asm .tree .LdcInsnNode ;
2226import org .objectweb .asm .tree .MethodInsnNode ;
2327import org .objectweb .asm .tree .MethodNode ;
2428
@@ -129,6 +133,10 @@ public class OptifineDevTransformerWrapper implements IClassTransformer {
129133 if (name .equals ("Reflector" )) {
130134 addReflectorFix (ofTransformedDeobfNode );
131135 }
136+ // 1.7.10 has srg named strings there
137+ if (name .equals ("EntityUtils" )) {
138+ remapEntityUtils (ofTransformedDeobfNode );
139+ }
132140 ClassWriter classWriter = new ClassWriter (0 );
133141 ofTransformedDeobfNode .accept (classWriter );
134142 byte [] output = classWriter .toByteArray ();
@@ -142,6 +150,21 @@ public class OptifineDevTransformerWrapper implements IClassTransformer {
142150 }
143151 }
144152
153+ private void remapEntityUtils (ClassNode ofTransformedDeobfNode ) {
154+ MethodNode clinit = ofTransformedDeobfNode .methods .stream ().filter (m ->m .name .equals ("<clinit>" )).findFirst ()
155+ .orElseThrow (()->new RuntimeException ("No <clinit>" ));
156+ InsnList instructions = clinit .instructions ;
157+ instructions .iterator ().forEachRemaining (node -> {
158+ if (node instanceof LdcInsnNode ) {
159+ Object cst = ((LdcInsnNode ) node ).cst ;
160+ if (cst instanceof String ) {
161+ cst = SrgMappings .getNameFromSrg ((String ) cst );
162+ }
163+ ((LdcInsnNode ) node ).cst = cst ;
164+ }
165+ });
166+ }
167+
145168 private void addReflectorFix (ClassNode ofTransformedDeobfNode ) {
146169 MethodNode clinit = ofTransformedDeobfNode .methods .stream ().filter (m ->m .name .equals ("<clinit>" )).findFirst ()
147170 .orElseThrow (()->new RuntimeException ("No <clinit>" ));
@@ -153,7 +176,7 @@ private void addReflectorFix(ClassNode ofTransformedDeobfNode) {
153176 }
154177 }
155178 clinit .instructions .insertBefore (_return , new MethodInsnNode (
156- Opcodes .INVOKESTATIC , "ofdev/Utils " , "fixReflector" , "()V" , false ));
179+ Opcodes .INVOKESTATIC , "ofdev/launchwrapper/UtilsLW " , "fixReflector" , "()V" , false ));
157180 }
158181
159182 private void applyAccessChanges (Set <AccessChange > accessChanges , ClassNode node ) {
@@ -270,7 +293,21 @@ private ClassNode toDeobfClassNode(byte[] code) {
270293 ClassReader classReader = new ClassReader (code );
271294 ClassNode transformedNode = new ClassNode (Opcodes .ASM5 );
272295 RemappingClassAdapter remapAdapter = new OptifineDevAdapter (transformedNode );
273- classReader .accept (remapAdapter , ClassReader .EXPAND_FRAMES );
296+
297+ // 1.7.10 has a name conflict with superclass and the field shadows parent class field
298+ // but optifine user the parent class field to set it's own
299+ Remapper videoSettingsFixer = new Remapper () {
300+ @ Override
301+ public String mapFieldName (String owner , String name , String desc ) {
302+ if ((owner .startsWith ("optifine" ) || owner .startsWith ("shadersmod" ) || owner .equals ("net/minecraft/client/gui/GuiVideoSettings" ) || owner .equals ("bef" )) && name .equals ("fontRendererObj" )) {
303+ return "fontRendererObj_OF" ;
304+ }
305+ return super .mapFieldName (owner , name , desc );
306+ }
307+ };
308+ ClassRemapper finalRemapper = new ClassRemapper (remapAdapter , videoSettingsFixer );
309+
310+ classReader .accept (finalRemapper , ClassReader .EXPAND_FRAMES );
274311 return transformedNode ;
275312 }
276313
0 commit comments