From ee48a3673d9d07ba126200368b94a7033d20a82c Mon Sep 17 00:00:00 2001 From: Christian Date: Thu, 23 Aug 2012 00:04:34 -0400 Subject: [PATCH] Fix up loading mods that are grandchildren of BaseMod --- .../cpw/mods/fml/common/ModContainerFactory.java | 7 ++++++- .../mods/fml/common/discovery/ModCandidate.java | 11 +++++++++++ .../fml/common/discovery/asm/ASMModParser.java | 8 +++++--- .../common/discovery/asm/ModClassVisitor.java | 16 +++++++++------- 4 files changed, 31 insertions(+), 11 deletions(-) diff --git a/common/cpw/mods/fml/common/ModContainerFactory.java b/common/cpw/mods/fml/common/ModContainerFactory.java index 6aba285cf6..73250dd498 100644 --- a/common/cpw/mods/fml/common/ModContainerFactory.java +++ b/common/cpw/mods/fml/common/ModContainerFactory.java @@ -20,11 +20,16 @@ public class ModContainerFactory public ModContainer build(ASMModParser modParser, File modSource, ModCandidate container) { String className = modParser.getASMType().getClassName(); - if (modParser.isBaseMod() && modClass.matcher(className).find()) + if (modParser.isBaseMod(container.getRememberedBaseMods()) && modClass.matcher(className).find()) { FMLLog.fine("Identified a BaseMod type mod %s", className); return new ModLoaderModContainer(className, modSource, modParser.getBaseModProperties()); } + else if (modParser.isBaseMod(container.getRememberedBaseMods())) + { + FMLLog.fine("Found a basemod %s of non-standard naming format", className); + container.rememberBaseModType(className); + } // We warn if it's not a basemod instance -- compatibility requires it to be in net.minecraft.src *sigh* if (className.startsWith("net.minecraft.src.") && container.isClasspath()) diff --git a/common/cpw/mods/fml/common/discovery/ModCandidate.java b/common/cpw/mods/fml/common/discovery/ModCandidate.java index e35c44b09f..e883294f5e 100644 --- a/common/cpw/mods/fml/common/discovery/ModCandidate.java +++ b/common/cpw/mods/fml/common/discovery/ModCandidate.java @@ -3,6 +3,8 @@ package cpw.mods.fml.common.discovery; import java.io.File; import java.util.List; +import com.google.common.collect.Lists; + import cpw.mods.fml.common.ModContainer; @@ -12,6 +14,7 @@ public class ModCandidate private File modContainer; private ContainerType sourceType; private boolean classpath; + private List baseModTypes = Lists.newArrayList(); public ModCandidate(File classPathRoot, File modContainer, ContainerType sourceType) { @@ -48,4 +51,12 @@ public class ModCandidate { return classpath; } + public void rememberBaseModType(String className) + { + baseModTypes.add(className); + } + public List getRememberedBaseMods() + { + return baseModTypes; + } } \ No newline at end of file diff --git a/common/cpw/mods/fml/common/discovery/asm/ASMModParser.java b/common/cpw/mods/fml/common/discovery/asm/ASMModParser.java index 03254c3f36..21c1aa8112 100644 --- a/common/cpw/mods/fml/common/discovery/asm/ASMModParser.java +++ b/common/cpw/mods/fml/common/discovery/asm/ASMModParser.java @@ -2,7 +2,9 @@ package cpw.mods.fml.common.discovery.asm; import java.io.IOException; import java.io.InputStream; +import java.util.Collections; import java.util.LinkedList; +import java.util.List; import java.util.logging.Level; import net.minecraft.src.BaseMod; @@ -78,7 +80,7 @@ public class ASMModParser .add("classVersion", classVersion) .add("superName", asmSuperType.getClassName()) .add("annotations", annotations) - .add("isBaseMod", isBaseMod()) + .add("isBaseMod", isBaseMod(Collections.emptyList())) .add("baseModProperties", baseModProperties) .toString(); } @@ -112,9 +114,9 @@ public class ASMModParser // } } - public boolean isBaseMod() + public boolean isBaseMod(List rememberedTypes) { - return getASMSuperType().equals(Type.getType(BaseMod.class)); + return getASMSuperType().equals(Type.getType(BaseMod.class)) || rememberedTypes.contains(getASMSuperType().getClassName()); } public void setBaseModProperties(String foundProperties) diff --git a/common/cpw/mods/fml/common/discovery/asm/ModClassVisitor.java b/common/cpw/mods/fml/common/discovery/asm/ModClassVisitor.java index 0f5a0c67ef..1786d2b5f8 100644 --- a/common/cpw/mods/fml/common/discovery/asm/ModClassVisitor.java +++ b/common/cpw/mods/fml/common/discovery/asm/ModClassVisitor.java @@ -1,5 +1,7 @@ package cpw.mods.fml.common.discovery.asm; +import java.util.Collections; + import org.objectweb.asm.AnnotationVisitor; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; @@ -16,32 +18,32 @@ public class ModClassVisitor extends ClassVisitor super(Opcodes.ASM4); this.discoverer = discoverer; } - - + + @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { discoverer.beginNewTypeName(name, version, superName); } - + @Override public AnnotationVisitor visitAnnotation(String annotationName, boolean runtimeVisible) { discoverer.startClassAnnotation(annotationName); return new ModAnnotationVisitor(discoverer); } - - + + @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { return new ModFieldVisitor(name, discoverer); } - + @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - if (discoverer.isBaseMod() && name.equals("getPriorities") && desc.equals(Type.getMethodDescriptor(Type.getType(String.class)))) + if (discoverer.isBaseMod(Collections.emptyList()) && name.equals("getPriorities") && desc.equals(Type.getMethodDescriptor(Type.getType(String.class)))) { return new ModMethodVisitor(name, discoverer); }