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 }