From 6d580981a5aef6ba500d7e9f088e544560be422b Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Sun, 16 Feb 2025 11:13:17 +0900 Subject: [PATCH 1/5] feat: child folder mod locator - will not load child folder named `optional` or `disabled` --- .../relauncher/libraries/LibraryManager.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java index 4a710b158..25381d770 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java @@ -469,12 +469,15 @@ else if (!list.contains(file)) for (String dir : new String[]{"mods", "mods" + File.separatorChar + ForgeVersion.mcVersion}) { + List location = new ArrayList<>(); File base = new File(mcDir, dir); if (!base.isDirectory() || !base.exists()) continue; + scanningChildFolder(base, location); + FMLLog.log.info("Searching {} for mods", base.getAbsolutePath()); - for (File f : base.listFiles(MOD_FILENAME_FILTER)) + for (File f : location) { if (!list.contains(f)) { @@ -492,6 +495,18 @@ else if (!list.contains(file)) return list; } + private static void scanningChildFolder(File directory, List list) { + if (directory.isDirectory() && !(directory.getName().contains("optional") || directory.getName().contains("disabled"))) { + for (File file : directory.listFiles()) { + if (file.isDirectory()) { + scanningChildFolder(file, list); + } else if (MOD_FILENAME_FILTER.accept(file, file.getName())) { + list.add(file); + } + } + } + } + public static Repository getDefaultRepo() { return libraries_dir; From f2830bdc1a2a1b65e0c6945b21488b0c87255581 Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Sun, 16 Feb 2025 11:17:06 +0900 Subject: [PATCH 2/5] fix: case ignored --- .../minecraftforge/fml/relauncher/libraries/LibraryManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java index 25381d770..cf5755a94 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java @@ -496,7 +496,7 @@ else if (!list.contains(file)) } private static void scanningChildFolder(File directory, List list) { - if (directory.isDirectory() && !(directory.getName().contains("optional") || directory.getName().contains("disabled"))) { + if (directory.isDirectory() && !(directory.getName().toLowerCase().contains("optional") || directory.getName().toLowerCase().contains("disabled"))) { for (File file : directory.listFiles()) { if (file.isDirectory()) { scanningChildFolder(file, list); From 084eae7658b24da5a3910405cf413adb3bde0fa7 Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Sun, 16 Feb 2025 17:43:25 +0900 Subject: [PATCH 3/5] feat: new logic - removed sub-sub folder compatible - add white/black list for special folder --- .../common/ForgeEarlyConfig.java | 5 ++++ .../relauncher/libraries/LibraryManager.java | 29 ++++++++++++------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java b/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java index 5b76308e2..d23c91b49 100644 --- a/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java +++ b/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java @@ -18,4 +18,9 @@ public class ForgeEarlyConfig { public static String X11_CLASS_NAME = "minecraft"; public static String COCOA_FRAME_NAME = "minecraft"; public static String CONFIG_ANY_TIME_VERSION = "3.0"; + + public static String[] SPECIAL_MOD_FOLDER = new String[]{ + "disabled", "optional" + }; + public static boolean IS_WHITELIST = false; } diff --git a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java index cf5755a94..c90856781 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java @@ -27,6 +27,7 @@ import java.io.IOException; import java.io.InputStream; import java.net.URISyntaxException; +import java.nio.file.Path; import java.security.CodeSource; import java.util.ArrayList; import java.util.Arrays; @@ -42,9 +43,12 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.jar.Manifest; +import java.util.stream.Collectors; +import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import net.minecraftforge.common.ForgeEarlyConfig; import org.apache.commons.lang3.tuple.Pair; import org.apache.maven.artifact.versioning.ArtifactVersion; @@ -469,12 +473,11 @@ else if (!list.contains(file)) for (String dir : new String[]{"mods", "mods" + File.separatorChar + ForgeVersion.mcVersion}) { - List location = new ArrayList<>(); File base = new File(mcDir, dir); if (!base.isDirectory() || !base.exists()) continue; - scanningChildFolder(base, location); + List location = scanningModFiles(base.toPath()); FMLLog.log.info("Searching {} for mods", base.getAbsolutePath()); for (File f : location) @@ -495,15 +498,19 @@ else if (!list.contains(file)) return list; } - private static void scanningChildFolder(File directory, List list) { - if (directory.isDirectory() && !(directory.getName().toLowerCase().contains("optional") || directory.getName().toLowerCase().contains("disabled"))) { - for (File file : directory.listFiles()) { - if (file.isDirectory()) { - scanningChildFolder(file, list); - } else if (MOD_FILENAME_FILTER.accept(file, file.getName())) { - list.add(file); - } - } + public static List scanningModFiles(Path rootDir) { + try (Stream stream = java.nio.file.Files.walk(rootDir)) { + return stream + .filter(path -> { + Path parent = path.getParent(); + return parent == null || (Arrays.stream(ForgeEarlyConfig.SPECIAL_MOD_FOLDER).toList().contains(parent.getFileName().toString()) && ForgeEarlyConfig.IS_WHITELIST); + }) + .filter(java.nio.file.Files::isRegularFile) + .map(Path::toFile) + .filter(File::isFile) + .collect(Collectors.toList()); + } catch (IOException e) { + throw new RuntimeException("Unable to scan mod folder", e); } } From 4651a02a64380aa2e542b6f285590d20f6069124 Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Mon, 17 Feb 2025 16:44:10 +0900 Subject: [PATCH 4/5] feat: new logic - removed whitelist - inline var --- .../java/net/minecraftforge/common/ForgeEarlyConfig.java | 3 +-- .../fml/relauncher/libraries/LibraryManager.java | 6 ++---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java b/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java index d23c91b49..f56ce60c2 100644 --- a/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java +++ b/src/main/java/net/minecraftforge/common/ForgeEarlyConfig.java @@ -19,8 +19,7 @@ public class ForgeEarlyConfig { public static String COCOA_FRAME_NAME = "minecraft"; public static String CONFIG_ANY_TIME_VERSION = "3.0"; - public static String[] SPECIAL_MOD_FOLDER = new String[]{ + public static String[] DISABLED_MOD_FOLDER = new String[]{ "disabled", "optional" }; - public static boolean IS_WHITELIST = false; } diff --git a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java index c90856781..9970f9510 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java @@ -477,10 +477,8 @@ else if (!list.contains(file)) if (!base.isDirectory() || !base.exists()) continue; - List location = scanningModFiles(base.toPath()); - FMLLog.log.info("Searching {} for mods", base.getAbsolutePath()); - for (File f : location) + for (File f : scanningModFiles(base.toPath())) { if (!list.contains(f)) { @@ -503,7 +501,7 @@ public static List scanningModFiles(Path rootDir) { return stream .filter(path -> { Path parent = path.getParent(); - return parent == null || (Arrays.stream(ForgeEarlyConfig.SPECIAL_MOD_FOLDER).toList().contains(parent.getFileName().toString()) && ForgeEarlyConfig.IS_WHITELIST); + return parent == null && !Arrays.stream(ForgeEarlyConfig.DISABLED_MOD_FOLDER).toList().contains(parent.getFileName().toString()); }) .filter(java.nio.file.Files::isRegularFile) .map(Path::toFile) From e741f5e0ebe8a3e9e2cfc49be32926d2b7430dfe Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Wed, 26 Feb 2025 20:13:50 +0900 Subject: [PATCH 5/5] fix: nonnull logic --- .../minecraftforge/fml/relauncher/libraries/LibraryManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java index 9970f9510..c3e2d3edb 100644 --- a/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java +++ b/src/main/java/net/minecraftforge/fml/relauncher/libraries/LibraryManager.java @@ -501,7 +501,7 @@ public static List scanningModFiles(Path rootDir) { return stream .filter(path -> { Path parent = path.getParent(); - return parent == null && !Arrays.stream(ForgeEarlyConfig.DISABLED_MOD_FOLDER).toList().contains(parent.getFileName().toString()); + return parent != null && !Arrays.stream(ForgeEarlyConfig.DISABLED_MOD_FOLDER).toList().contains(parent.getFileName().toString()); }) .filter(java.nio.file.Files::isRegularFile) .map(Path::toFile)