diff --git a/src/main/java/net/minecraftforge/fml/ModLoader.java b/src/main/java/net/minecraftforge/fml/ModLoader.java index 43cb565c6..228f0a4e6 100644 --- a/src/main/java/net/minecraftforge/fml/ModLoader.java +++ b/src/main/java/net/minecraftforge/fml/ModLoader.java @@ -32,6 +32,7 @@ import net.minecraftforge.fml.loading.FMLLoader; import net.minecraftforge.fml.loading.LoadingModList; import net.minecraftforge.fml.loading.moddiscovery.ModFile; import net.minecraftforge.fml.loading.moddiscovery.ModFileInfo; +import net.minecraftforge.forgespi.language.IModLanguageProvider; import net.minecraftforge.registries.GameData; import net.minecraftforge.registries.ObjectHolderRegistry; @@ -41,6 +42,7 @@ import org.apache.logging.log4j.Logger; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -157,19 +159,22 @@ public class ModLoader LOGGER.debug(LOADING, "ModContainer is {}", ModContainer.class.getClassLoader()); return modFile.getScanResult().getTargets().entrySet().stream(). - map(e-> { - try { - IModInfo info = modInfoMap.get(e.getKey()); - if (info == null) { - loadingExceptions.add(new ModLoadingException(null, ModLoadingStage.CONSTRUCT, "fml.modloading.missingmetadata", null, e.getKey())); - return null; - } - return e.getValue().loadMod(modInfoMap.get(e.getKey()), modClassLoader, modFile.getScanResult()); - } catch (ModLoadingException mle) { - loadingExceptions.add(mle); - return null; - } - }).collect(Collectors.toList()); + map(e-> buildModContainerFromTOML(modFile, modClassLoader, modInfoMap, e)).collect(Collectors.toList()); + } + + private ModContainer buildModContainerFromTOML(final ModFile modFile, final TransformingClassLoader modClassLoader, final Map modInfoMap, final Map.Entry idToProviderEntry) { + try { + final String modId = idToProviderEntry.getKey(); + final IModLanguageProvider.IModLanguageLoader languageLoader = idToProviderEntry.getValue(); + IModInfo info = Optional.ofNullable(modInfoMap.get(modId)). + // throw a missing metadata error if there is no matching modid in the modInfoMap from the mods.toml file + orElseThrow(()->new ModLoadingException(null, ModLoadingStage.CONSTRUCT, "fml.modloading.missingmetadata", null, modId)); + return languageLoader.loadMod(info, modClassLoader, modFile.getScanResult()); + } catch (ModLoadingException mle) { + // exceptions are caught and added to the error list for later handling. Null is returned here. + loadingExceptions.add(mle); + return null; + } }