diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/LoadingModList.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/LoadingModList.java index d470078fe..160c4bf61 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/LoadingModList.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/LoadingModList.java @@ -47,6 +47,7 @@ public class LoadingModList private final Map fileById; private BackgroundScanHandler scanner; private final List preLoadErrors; + private List brokenFiles; private LoadingModList(final List modFiles, final List sortedList) { @@ -131,4 +132,8 @@ public class LoadingModList public List getErrors() { return preLoadErrors; } + + public void setBrokenFiles(final List brokenFiles) { + this.brokenFiles = brokenFiles; + } } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/AbstractJarFileLocator.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/AbstractJarFileLocator.java index b88032d79..cd4bb297e 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/AbstractJarFileLocator.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/AbstractJarFileLocator.java @@ -39,7 +39,7 @@ import java.util.zip.ZipError; import static net.minecraftforge.fml.loading.LogMarkers.SCAN; -public class AbstractJarFileLocator { +public abstract class AbstractJarFileLocator implements IModLocator { private static final Logger LOGGER = LogManager.getLogger(); protected final Map modJars; @@ -51,7 +51,7 @@ public class AbstractJarFileLocator { try { return FileSystems.newFileSystem(modFile.getFilePath(), modFile.getClass().getClassLoader()); } catch (ZipError | IOException e) { - LOGGER.debug(SCAN,"Ignoring invalid JAR file {}", modFile.getFilePath()); + LOGGER.debug(SCAN,"Invalid JAR file {} - no filesystem created", modFile.getFilePath()); return null; } } @@ -87,4 +87,9 @@ public class AbstractJarFileLocator { return Optional.empty(); } } + + @Override + public boolean isValid(final ModFile modFile) { + return modJars.get(modFile) != null; + } } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ExplodedDirectoryLocator.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ExplodedDirectoryLocator.java index a56ece1d2..c363e8d8c 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ExplodedDirectoryLocator.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ExplodedDirectoryLocator.java @@ -117,4 +117,9 @@ public class ExplodedDirectoryLocator implements IModLocator { rootDirs.addAll(explodedTargets); } } + + @Override + public boolean isValid(final ModFile modFile) { + return mods.get(modFile) != null; + } } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/IModLocator.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/IModLocator.java index e4086e4fb..caaaff683 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/IModLocator.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/IModLocator.java @@ -42,4 +42,6 @@ public interface IModLocator { Optional findManifest(Path file); void initArguments(Map arguments); + + boolean isValid(ModFile modFile); } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/MavenDirectoryLocator.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/MavenDirectoryLocator.java index 20fe3b145..f405f5a1e 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/MavenDirectoryLocator.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/MavenDirectoryLocator.java @@ -28,7 +28,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -public class MavenDirectoryLocator extends AbstractJarFileLocator implements IModLocator { +public class MavenDirectoryLocator extends AbstractJarFileLocator { private List modCoords; @Override diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModDiscoverer.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModDiscoverer.java index 43098c0b9..d624df401 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModDiscoverer.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModDiscoverer.java @@ -27,6 +27,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; @@ -67,12 +68,14 @@ public class ModDiscoverer { FMLLoader.getLanguageLoadingProvider().addAdditionalLanguages(modFiles.get(ModFile.Type.LANGPROVIDER)); BackgroundScanHandler backgroundScanHandler = new BackgroundScanHandler(); final List mods = modFiles.getOrDefault(ModFile.Type.MOD, Collections.emptyList()); + final List brokenFiles = new ArrayList<>(); for (Iterator iterator = mods.iterator(); iterator.hasNext(); ) { ModFile mod = iterator.next(); - if (!mod.identifyMods()) { - LOGGER.debug(SCAN, "Removing file {} from further analysis - it is invalid", mod); + if (!mod.getLocator().isValid(mod) || !mod.identifyMods()) { + LOGGER.warn(SCAN, "File {} has been ignored - it is invalid", mod.getFilePath()); iterator.remove(); + brokenFiles.add(mod); } } LOGGER.debug(SCAN,"Found {} mod files with {} mods", mods::size, ()->mods.stream().mapToInt(mf -> mf.getModInfos().size()).sum()); @@ -80,6 +83,7 @@ public class ModDiscoverer { loadingModList.addCoreMods(); loadingModList.addAccessTransformers(); loadingModList.addForScanning(backgroundScanHandler); + loadingModList.setBrokenFiles(brokenFiles); return backgroundScanHandler; } diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModsFolderLocator.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModsFolderLocator.java index 1d2f79efa..827a759c2 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModsFolderLocator.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/moddiscovery/ModsFolderLocator.java @@ -37,7 +37,7 @@ import static net.minecraftforge.fml.loading.LogMarkers.SCAN; /** * Support loading mods located in JAR files in the mods folder */ -public class ModsFolderLocator extends AbstractJarFileLocator implements IModLocator { +public class ModsFolderLocator extends AbstractJarFileLocator { private static final String SUFFIX = ".jar"; private static final Logger LOGGER = LogManager.getLogger(); private final Path modFolder;