diff --git a/fml/common/cpw/mods/fml/common/LoadController.java b/fml/common/cpw/mods/fml/common/LoadController.java index ab976bfe5c..a0b137a9b7 100644 --- a/fml/common/cpw/mods/fml/common/LoadController.java +++ b/fml/common/cpw/mods/fml/common/LoadController.java @@ -13,15 +13,18 @@ package cpw.mods.fml.common; import java.lang.reflect.InvocationTargetException; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.logging.Level; import java.util.logging.Logger; +import com.google.common.base.Functions; import com.google.common.base.Joiner; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.BiMap; +import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap.Builder; @@ -36,6 +39,8 @@ import cpw.mods.fml.common.event.FMLEvent; import cpw.mods.fml.common.event.FMLLoadEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLStateEvent; +import cpw.mods.fml.common.functions.ArtifactVersionNameFunction; +import cpw.mods.fml.common.versioning.ArtifactVersion; public class LoadController { @@ -158,23 +163,38 @@ public class LoadController } for (ModContainer mc : activeModList) { - activeContainer = mc; - String modId = mc.getModId(); - stateEvent.applyModContainer(activeContainer()); - FMLLog.log(modId, Level.FINEST, "Sending event %s to mod %s", stateEvent.getEventType(), modId); - eventChannels.get(modId).post(stateEvent); - FMLLog.log(modId, Level.FINEST, "Sent event %s to mod %s", stateEvent.getEventType(), modId); - activeContainer = null; - if (stateEvent instanceof FMLStateEvent) + sendEventToModContainer(stateEvent, mc); + } + } + + private void sendEventToModContainer(FMLEvent stateEvent, ModContainer mc) + { + String modId = mc.getModId(); + Collection requirements = Collections2.transform(mc.getRequirements(),new ArtifactVersionNameFunction()); + for (ArtifactVersion av : mc.getDependencies()) + { + if (av.getLabel()!= null && requirements.contains(av.getLabel()) && modStates.containsEntry(av.getLabel(),ModState.ERRORED)) { - if (!errors.containsKey(modId)) - { - modStates.put(modId, ((FMLStateEvent)stateEvent).getModState()); - } - else - { - modStates.put(modId, ModState.ERRORED); - } + FMLLog.log(modId, Level.SEVERE, "Skipping event %s and marking errored mod %s since required dependency %s has errored", stateEvent.getEventType(), modId, av.getLabel()); + modStates.put(modId, ModState.ERRORED); + return; + } + } + activeContainer = mc; + stateEvent.applyModContainer(activeContainer()); + FMLLog.log(modId, Level.FINEST, "Sending event %s to mod %s", stateEvent.getEventType(), modId); + eventChannels.get(modId).post(stateEvent); + FMLLog.log(modId, Level.FINEST, "Sent event %s to mod %s", stateEvent.getEventType(), modId); + activeContainer = null; + if (stateEvent instanceof FMLStateEvent) + { + if (!errors.containsKey(modId)) + { + modStates.put(modId, ((FMLStateEvent)stateEvent).getModState()); + } + else + { + modStates.put(modId, ModState.ERRORED); } } } diff --git a/fml/common/cpw/mods/fml/common/Loader.java b/fml/common/cpw/mods/fml/common/Loader.java index f3ca020c6e..b512712e5f 100644 --- a/fml/common/cpw/mods/fml/common/Loader.java +++ b/fml/common/cpw/mods/fml/common/Loader.java @@ -61,6 +61,7 @@ import cpw.mods.fml.common.LoaderState.ModState; import cpw.mods.fml.common.discovery.ModDiscoverer; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLLoadEvent; +import cpw.mods.fml.common.functions.ArtifactVersionNameFunction; import cpw.mods.fml.common.functions.ModIdFunction; import cpw.mods.fml.common.modloader.BaseModProxy; import cpw.mods.fml.common.registry.GameData; @@ -214,13 +215,7 @@ public class Loader FMLLog.severe("The mod %s does not wish to run in Minecraft version %s. You will have to remove it to play.", mod.getModId(), getMCVersionString()); throw new WrongMinecraftVersionException(mod); } - Map names = Maps.uniqueIndex(mod.getRequirements(), new Function() - { - public String apply(ArtifactVersion v) - { - return v.getLabel(); - } - }); + Map names = Maps.uniqueIndex(mod.getRequirements(), new ArtifactVersionNameFunction()); Set versionMissingMods = Sets.newHashSet(); Set missingMods = Sets.difference(names.keySet(), modVersions.keySet()); if (!missingMods.isEmpty()) diff --git a/fml/common/cpw/mods/fml/common/functions/ArtifactVersionNameFunction.java b/fml/common/cpw/mods/fml/common/functions/ArtifactVersionNameFunction.java new file mode 100644 index 0000000000..9056e42bb4 --- /dev/null +++ b/fml/common/cpw/mods/fml/common/functions/ArtifactVersionNameFunction.java @@ -0,0 +1,12 @@ +package cpw.mods.fml.common.functions; + +import com.google.common.base.Function; + +import cpw.mods.fml.common.versioning.ArtifactVersion; + +public class ArtifactVersionNameFunction implements Function { + public String apply(ArtifactVersion v) + { + return v.getLabel(); + } +} \ No newline at end of file