diff --git a/fml/src/main/java/cpw/mods/fml/common/Loader.java b/fml/src/main/java/cpw/mods/fml/common/Loader.java index 2855f5273..b54e30d84 100644 --- a/fml/src/main/java/cpw/mods/fml/common/Loader.java +++ b/fml/src/main/java/cpw/mods/fml/common/Loader.java @@ -38,6 +38,7 @@ import com.google.common.collect.HashBiMap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultiset; +import com.google.common.collect.Iterables; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; @@ -199,7 +200,7 @@ public class Loader try { BiMap modVersions = HashBiMap.create(); - for (ModContainer mod : getActiveModList()) + for (ModContainer mod : Iterables.concat(getActiveModList(), ModAPIManager.INSTANCE.getAPIList())) { modVersions.put(mod.getModId(), mod.getProcessedVersion()); } diff --git a/fml/src/main/java/cpw/mods/fml/common/ModAPIManager.java b/fml/src/main/java/cpw/mods/fml/common/ModAPIManager.java index 9e581063d..8bde83dd0 100644 --- a/fml/src/main/java/cpw/mods/fml/common/ModAPIManager.java +++ b/fml/src/main/java/cpw/mods/fml/common/ModAPIManager.java @@ -36,6 +36,7 @@ public class ModAPIManager { private String version; private Set currentReferents; private Set packages; + private boolean selfReferenced; public APIContainer(String providedAPI, String apiVersion, File source, ArtifactVersion ownerMod) { @@ -67,7 +68,7 @@ public class ModAPIManager { @Override public String getModId() { - return "API:"+providedAPI; + return providedAPI; } @Override public List getDependants() @@ -78,7 +79,7 @@ public class ModAPIManager { @Override public List getDependencies() { - return ImmutableList.of(ownerMod); + return selfReferenced ? ImmutableList.of() : ImmutableList.of(ownerMod); } @Override @@ -118,6 +119,11 @@ public class ModAPIManager { addAPIReference(modId); } } + + void markSelfReferenced() + { + selfReferenced = true; + } } public void registerDataTableAndParseAPI(ASMDataTable dataTable) { @@ -181,6 +187,12 @@ public class ModAPIManager { do { APIContainer parent = apiContainers.get(owner.getLabel()); + if (parent == container) + { + FMLLog.finer("APIContainer %s is it's own parent. skipping", owner); + container.markSelfReferenced(); + break; + } FMLLog.finer("Removing upstream parent %s from %s", parent.ownerMod.getLabel(), container); container.currentReferents.remove(parent.ownerMod.getLabel()); container.referredMods.remove(parent.ownerMod); @@ -213,4 +225,9 @@ public class ModAPIManager { { return apiContainers.containsKey(modId); } + + public Iterable getAPIList() + { + return apiContainers.values(); + } }