diff --git a/src/main/java/catserver/server/remapper/ClassInheritanceProvider.java b/src/main/java/catserver/server/remapper/ClassInheritanceProvider.java index 7a8cf4d5e..8993ce7c5 100644 --- a/src/main/java/catserver/server/remapper/ClassInheritanceProvider.java +++ b/src/main/java/catserver/server/remapper/ClassInheritanceProvider.java @@ -1,7 +1,12 @@ package catserver.server.remapper; import net.md_5.specialsource.provider.InheritanceProvider; +import net.minecraft.launchwrapper.Launch; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.Opcodes; +import java.io.InputStream; import java.util.Collection; import java.util.HashSet; @@ -11,26 +16,59 @@ public class ClassInheritanceProvider implements InheritanceProvider { @Override public Collection getParents(String className) { className = ReflectionTransformer.remapper.map(className); + try (InputStream is = Launch.classLoader.getResourceAsStream((className + ".class"))) { + if (is == null) { + return null; + } + + ClassReader reader = new ClassReader(is); + ParentVisitor visitor = new ParentVisitor(); + + reader.accept(visitor, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); + + Collection parents = new HashSet<>(); - try { - Collection parents = new HashSet(); - Class reference = Class.forName(className.replace('/', '.'), false, this.getClass().getClassLoader()/*RemappedMethods.loader*/); - Class extend = reference.getSuperclass(); - if (extend != null) { - parents.add(reverseMap(extend)); + if (visitor.getSuperName() != null && !visitor.getSuperName().equals("java/lang/Object")) { + parents.add(reverseMap(visitor.getSuperName())); } - for (Class inter : reference.getInterfaces()) { + for (String inter : visitor.getInterfaces()) { if (inter != null) { parents.add(reverseMap(inter)); } } return parents; + } catch (Exception e) { - // Empty catch block + System.err.println("Failed to read class for parents: " + className); } + return null; } + private static class ParentVisitor extends ClassVisitor { + private String superName; + private String[] interfaces; + + public ParentVisitor() { + super(Opcodes.ASM9); + } + + @Override + public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { + this.superName = superName; + this.interfaces = interfaces; + super.visit(version, access, name, signature, superName, interfaces); + } + + public String getSuperName() { + return superName; + } + + public String[] getInterfaces() { + return interfaces == null ? new String[0] : interfaces; + } + } + } \ No newline at end of file