001 package cpw.mods.fml.common.asm; 002 003 import java.util.Map; 004 005 import javax.swing.JOptionPane; 006 007 import org.objectweb.asm.ClassReader; 008 import org.objectweb.asm.ClassVisitor; 009 import org.objectweb.asm.FieldVisitor; 010 import org.objectweb.asm.Opcodes; 011 012 import cpw.mods.fml.relauncher.IFMLCallHook; 013 import cpw.mods.fml.relauncher.RelaunchClassLoader; 014 015 public class FMLSanityChecker implements IFMLCallHook 016 { 017 static class MLDetectorClassVisitor extends ClassVisitor 018 { 019 private boolean foundMarker = false; 020 private MLDetectorClassVisitor() 021 { 022 super(Opcodes.ASM4); 023 } 024 025 @Override 026 public FieldVisitor visitField(int arg0, String arg1, String arg2, String arg3, Object arg4) 027 { 028 if ("fmlMarker".equals(arg1)) 029 { 030 foundMarker = true; 031 } 032 return null; 033 } 034 } 035 036 private RelaunchClassLoader cl; 037 038 @Override 039 public Void call() throws Exception 040 { 041 byte[] mlClass = cl.getClassBytes("ModLoader"); 042 // Only care in obfuscated env 043 if (mlClass == null) 044 { 045 return null; 046 } 047 MLDetectorClassVisitor mlTester = new MLDetectorClassVisitor(); 048 ClassReader cr = new ClassReader(mlClass); 049 cr.accept(mlTester, ClassReader.SKIP_CODE); 050 if (!mlTester.foundMarker) 051 { 052 JOptionPane.showMessageDialog(null, "<html>CRITICAL ERROR<br/>" + 053 "ModLoader was detected in this environment<br/>" + 054 "ForgeModLoader cannot be installed alongside ModLoader<br/>" + 055 "All mods should work without ModLoader being installed<br/>" + 056 "Because ForgeModLoader is 100% compatible with ModLoader<br/>" + 057 "Re-install Minecraft Forge or Forge ModLoader into a clean<br/>" + 058 "jar and try again.", 059 "ForgeModLoader critical error", 060 JOptionPane.ERROR_MESSAGE); 061 throw new RuntimeException("Invalid ModLoader class detected"); 062 } 063 return null; 064 } 065 066 @Override 067 public void injectData(Map<String, Object> data) 068 { 069 cl = (RelaunchClassLoader) data.get("classLoader"); 070 } 071 072 }