Skip to content

Commit c7e770b

Browse files
GlodBlockAE2-Enthusiast
authored andcommitted
Fix transformers causing NCDF on specific servers (AE2-UEL#374)
1 parent 09fdc11 commit c7e770b

File tree

1 file changed

+42
-2
lines changed

1 file changed

+42
-2
lines changed

src/main/java/appeng/core/transformer/AE2ELTransformer.java

+42-2
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,19 @@
2424
import com.google.common.collect.Sets;
2525
import com.google.common.io.ByteStreams;
2626
import net.minecraft.launchwrapper.IClassTransformer;
27+
import net.minecraft.launchwrapper.Launch;
2728
import net.minecraftforge.fml.common.Loader;
2829
import org.objectweb.asm.ClassReader;
2930
import org.objectweb.asm.ClassVisitor;
3031
import org.objectweb.asm.ClassWriter;
3132
import org.objectweb.asm.Opcodes;
3233
import org.objectweb.asm.commons.ClassRemapper;
3334
import org.objectweb.asm.commons.Remapper;
34-
import org.objectweb.asm.tree.*;
35+
import org.objectweb.asm.tree.AbstractInsnNode;
36+
import org.objectweb.asm.tree.ClassNode;
37+
import org.objectweb.asm.tree.FieldNode;
38+
import org.objectweb.asm.tree.MethodInsnNode;
39+
import org.objectweb.asm.tree.MethodNode;
3540

3641
import java.io.IOException;
3742
import java.io.InputStream;
@@ -48,7 +53,7 @@ public byte[] transform(String name, String transformedName, byte[] basicClass)
4853

4954
if ("net.minecraftforge.common.ForgeHooks".equals(transformedName)) {
5055
ClassReader cr = new ClassReader(basicClass);
51-
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
56+
ClassWriter cw = new SafeClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
5257
ClassVisitor cv = new PickBlockPatch(cw);
5358
cr.accept(cv, ClassReader.EXPAND_FRAMES);
5459
return cw.toByteArray();
@@ -188,4 +193,39 @@ public String map(final String name) {
188193

189194
}
190195

196+
private static class SafeClassWriter extends ClassWriter {
197+
198+
public SafeClassWriter(int flags) {
199+
super(flags);
200+
}
201+
202+
@Override
203+
protected String getCommonSuperClass(final String type1, final String type2) {
204+
Class<?> c, d;
205+
// clueless
206+
ClassLoader classLoader = Launch.classLoader;
207+
try {
208+
c = Class.forName(type1.replace('/', '.'), false, classLoader);
209+
d = Class.forName(type2.replace('/', '.'), false, classLoader);
210+
} catch (Exception e) {
211+
throw new RuntimeException(e.toString());
212+
}
213+
if (c.isAssignableFrom(d)) {
214+
return type1;
215+
}
216+
if (d.isAssignableFrom(c)) {
217+
return type2;
218+
}
219+
if (c.isInterface() || d.isInterface()) {
220+
return "java/lang/Object";
221+
} else {
222+
do {
223+
c = c.getSuperclass();
224+
} while (!c.isAssignableFrom(d));
225+
return c.getName().replace('.', '/');
226+
}
227+
}
228+
229+
}
230+
191231
}

0 commit comments

Comments
 (0)