From 1e6daff28ba10455c085ea4da9b165b69d019695 Mon Sep 17 00:00:00 2001 From: Marc Hermans Date: Sat, 18 Jan 2025 17:40:54 +0100 Subject: [PATCH 1/7] Make mixin entries from the mods.toml optional. --- .../loading/moddiscovery/ModFileParser.java | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java index 2bfb74d1f..fc2360030 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java @@ -16,12 +16,11 @@ import java.lang.reflect.Type; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; + import net.neoforged.fml.loading.LogMarkers; import net.neoforged.fml.loading.moddiscovery.readers.JarModsDotTomlModFileReader; +import net.neoforged.neoforgespi.language.IConfigurable; import net.neoforged.neoforgespi.language.IModFileInfo; import net.neoforged.neoforgespi.locating.IModFile; import net.neoforged.neoforgespi.locating.InvalidModFileException; @@ -85,17 +84,32 @@ protected static List getCoreMods(final ModFile modFile) { .toList(); } + private record PotentialMixin(String name, boolean optional) {} + protected static List getMixinConfigs(IModFileInfo modFileInfo) { try { var config = modFileInfo.getConfig(); var mixinsEntries = config.getConfigList("mixins"); - return mixinsEntries - .stream() - .map(entry -> entry - .getConfigElement("config") - .orElseThrow( - () -> new InvalidModFileException("Missing \"config\" in [[mixins]] entry", modFileInfo))) - .toList(); + + var potentialMixins = new ArrayList(); + for (IConfigurable mixinsEntry : mixinsEntries) { + var name = mixinsEntry.getConfigElement("config") + .orElseThrow(() -> new InvalidModFileException("Missing \"config\" in [[mixins]] entry", modFileInfo)); + var optional = mixinsEntry.getConfigElement("optional").orElse(false); + potentialMixins.add(new PotentialMixin(name, optional)); + } + + var mixinConfigs = new ArrayList(); + for (PotentialMixin potentialMixin : potentialMixins) { + var mixinConfig = modFileInfo.getFile().findResource(potentialMixin.name); + if (Files.exists(mixinConfig)) { + mixinConfigs.add(potentialMixin.name()); + } else if (!potentialMixin.optional) { + throw new InvalidModFileException("Missing mixin config " + potentialMixin.name, modFileInfo); + } + } + + return mixinConfigs; } catch (Exception exception) { LOGGER.error("Failed to load mixin configs from mod file", exception); return List.of(); From f6cab0ed6f53fa11c386c1b20dee96580d75c39d Mon Sep 17 00:00:00 2001 From: Marc Hermans Date: Sat, 18 Jan 2025 17:44:08 +0100 Subject: [PATCH 2/7] Fix wildcard import --- .../neoforged/fml/loading/moddiscovery/ModFileParser.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java index fc2360030..19376a810 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java @@ -16,7 +16,11 @@ import java.lang.reflect.Type; import java.nio.file.Files; import java.nio.file.Path; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; import net.neoforged.fml.loading.LogMarkers; import net.neoforged.fml.loading.moddiscovery.readers.JarModsDotTomlModFileReader; From 8e446f2460f364ed30de02f47b6b37ad4198646d Mon Sep 17 00:00:00 2001 From: Marc Hermans Date: Sat, 18 Jan 2025 18:02:54 +0100 Subject: [PATCH 3/7] Rename and address spotless --- .../fml/loading/moddiscovery/ModFileParser.java | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java index 19376a810..ec50ae833 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java @@ -21,7 +21,6 @@ import java.util.List; import java.util.Map; import java.util.Optional; - import net.neoforged.fml.loading.LogMarkers; import net.neoforged.fml.loading.moddiscovery.readers.JarModsDotTomlModFileReader; import net.neoforged.neoforgespi.language.IConfigurable; @@ -88,28 +87,28 @@ protected static List getCoreMods(final ModFile modFile) { .toList(); } - private record PotentialMixin(String name, boolean optional) {} + private record PotentialMixinConfig(String name, boolean optional) {} protected static List getMixinConfigs(IModFileInfo modFileInfo) { try { var config = modFileInfo.getConfig(); var mixinsEntries = config.getConfigList("mixins"); - var potentialMixins = new ArrayList(); + var potentialMixins = new ArrayList(); for (IConfigurable mixinsEntry : mixinsEntries) { var name = mixinsEntry.getConfigElement("config") .orElseThrow(() -> new InvalidModFileException("Missing \"config\" in [[mixins]] entry", modFileInfo)); var optional = mixinsEntry.getConfigElement("optional").orElse(false); - potentialMixins.add(new PotentialMixin(name, optional)); + potentialMixins.add(new PotentialMixinConfig(name, optional)); } var mixinConfigs = new ArrayList(); - for (PotentialMixin potentialMixin : potentialMixins) { - var mixinConfig = modFileInfo.getFile().findResource(potentialMixin.name); + for (PotentialMixinConfig potentialMixinConfig : potentialMixins) { + var mixinConfig = modFileInfo.getFile().findResource(potentialMixinConfig.name); if (Files.exists(mixinConfig)) { - mixinConfigs.add(potentialMixin.name()); - } else if (!potentialMixin.optional) { - throw new InvalidModFileException("Missing mixin config " + potentialMixin.name, modFileInfo); + mixinConfigs.add(potentialMixinConfig.name()); + } else if (!potentialMixinConfig.optional) { + throw new InvalidModFileException("Missing mixin config " + potentialMixinConfig.name, modFileInfo); } } From 71d8ef76dae7ef24533de6a3e09e17e37b8b2ba1 Mon Sep 17 00:00:00 2001 From: Marc Hermans Date: Sat, 18 Jan 2025 18:22:30 +0100 Subject: [PATCH 4/7] Bump JCC To handle check. --- loader/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loader/build.gradle b/loader/build.gradle index 2a52ef74c..6bef80531 100644 --- a/loader/build.gradle +++ b/loader/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'net.neoforged.jarcompatibilitychecker' version '0.1.3' + id 'net.neoforged.jarcompatibilitychecker' version '0.1.13' } checkJarCompatibility { From ef99b13fb395b27504c6f8bf7ac6744c0aee51c2 Mon Sep 17 00:00:00 2001 From: Marc Hermans Date: Sat, 18 Jan 2025 18:50:54 +0100 Subject: [PATCH 5/7] Implement this in a required mod ids specific way. --- .../neoforged/fml/loading/LoadingModList.java | 8 +++++- .../fml/loading/moddiscovery/ModFile.java | 4 +-- .../loading/moddiscovery/ModFileParser.java | 26 ++++++++----------- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java b/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java index 4df143958..bcbda81c1 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java +++ b/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java @@ -77,7 +77,13 @@ public void addMixinConfigs() { .map(ModFileInfo::getFile) .forEach(file -> { final String modId = file.getModInfos().get(0).getModId(); - file.getMixinConfigs().forEach(cfg -> DeferredMixinConfigRegistration.addMixinConfig(cfg, modId)); + file.getMixinConfigs() + .stream() + .filter(potential -> potential.requiredModIds().isEmpty() || + potential.requiredModIds().stream().allMatch( + id -> this.getModFileById(id) != null + )) + .forEach(cfg -> DeferredMixinConfigRegistration.addMixinConfig(cfg.name(), modId)); }); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java index 388d0834b..3d492d2ec 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java @@ -56,7 +56,7 @@ public class ModFile implements IModFile { private ModFileScanData fileModFileScanData; private volatile CompletableFuture futureScanResult; private List coreMods; - private List mixinConfigs; + private List mixinConfigs; private List accessTransformers; public static final Attributes.Name TYPE = new Attributes.Name("FMLModType"); @@ -135,7 +135,7 @@ public List getCoreMods() { return coreMods; } - public List getMixinConfigs() { + public List getMixinConfigs() { return mixinConfigs; } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java index ec50ae833..d379330df 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java @@ -87,9 +87,15 @@ protected static List getCoreMods(final ModFile modFile) { .toList(); } - private record PotentialMixinConfig(String name, boolean optional) {} + /** + * Represents a potential mixin configuration. + * + * @param name The name of the mixin configuration. + * @param requiredModIds The mod ids that are required for this mixin configuration to be loaded. If empty, will be loaded regardless. + */ + public record PotentialMixinConfig(String name, List requiredModIds) {} - protected static List getMixinConfigs(IModFileInfo modFileInfo) { + protected static List getMixinConfigs(IModFileInfo modFileInfo) { try { var config = modFileInfo.getConfig(); var mixinsEntries = config.getConfigList("mixins"); @@ -98,21 +104,11 @@ protected static List getMixinConfigs(IModFileInfo modFileInfo) { for (IConfigurable mixinsEntry : mixinsEntries) { var name = mixinsEntry.getConfigElement("config") .orElseThrow(() -> new InvalidModFileException("Missing \"config\" in [[mixins]] entry", modFileInfo)); - var optional = mixinsEntry.getConfigElement("optional").orElse(false); - potentialMixins.add(new PotentialMixinConfig(name, optional)); - } - - var mixinConfigs = new ArrayList(); - for (PotentialMixinConfig potentialMixinConfig : potentialMixins) { - var mixinConfig = modFileInfo.getFile().findResource(potentialMixinConfig.name); - if (Files.exists(mixinConfig)) { - mixinConfigs.add(potentialMixinConfig.name()); - } else if (!potentialMixinConfig.optional) { - throw new InvalidModFileException("Missing mixin config " + potentialMixinConfig.name, modFileInfo); - } + var requiredModIds = mixinsEntry.>getConfigElement("requiredMods").orElse(List.of()); + potentialMixins.add(new PotentialMixinConfig(name, requiredModIds)); } - return mixinConfigs; + return potentialMixins; } catch (Exception exception) { LOGGER.error("Failed to load mixin configs from mod file", exception); return List.of(); From ef7517564c07c2f2fff9d6bb9af3f76cf1b44652 Mon Sep 17 00:00:00 2001 From: Marc Hermans Date: Sat, 18 Jan 2025 20:02:33 +0100 Subject: [PATCH 6/7] Address requested changes. --- .../neoforged/fml/loading/LoadingModList.java | 20 ++++++++++++------- .../fml/loading/moddiscovery/ModFile.java | 4 ++-- .../loading/moddiscovery/ModFileParser.java | 12 +++++------ 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java b/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java index bcbda81c1..2e681fa97 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java +++ b/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java @@ -5,6 +5,7 @@ package net.neoforged.fml.loading; +import com.mojang.logging.LogUtils; import cpw.mods.modlauncher.api.LambdaExceptionUtils; import java.net.URL; import java.nio.file.Files; @@ -24,16 +25,19 @@ import net.neoforged.fml.loading.mixin.DeferredMixinConfigRegistration; import net.neoforged.fml.loading.moddiscovery.ModFile; import net.neoforged.fml.loading.moddiscovery.ModFileInfo; +import net.neoforged.fml.loading.moddiscovery.ModFileParser; import net.neoforged.fml.loading.moddiscovery.ModInfo; import net.neoforged.fml.loading.modscan.BackgroundScanHandler; import net.neoforged.neoforgespi.language.IModFileInfo; import net.neoforged.neoforgespi.language.IModInfo; +import org.slf4j.Logger; /** * Master list of all mods in the loading context. This class cannot refer outside the * loading package */ public class LoadingModList { + private static final Logger LOGGER = LogUtils.getLogger(); private static LoadingModList INSTANCE; private final List plugins; private final List modFiles; @@ -77,13 +81,15 @@ public void addMixinConfigs() { .map(ModFileInfo::getFile) .forEach(file -> { final String modId = file.getModInfos().get(0).getModId(); - file.getMixinConfigs() - .stream() - .filter(potential -> potential.requiredModIds().isEmpty() || - potential.requiredModIds().stream().allMatch( - id -> this.getModFileById(id) != null - )) - .forEach(cfg -> DeferredMixinConfigRegistration.addMixinConfig(cfg.name(), modId)); + for (ModFileParser.MixinConfig potential : file.getMixinConfigs()) { + if (potential.requiredMods().stream().allMatch( + id -> this.getModFileById(id) != null + )) { + DeferredMixinConfigRegistration.addMixinConfig(potential.config(), modId); + } else { + LOGGER.debug("Mixin config {} for mod {} not applied as required mods are missing", potential.config(), modId); + } + } }); } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java index 3d492d2ec..114c1a968 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFile.java @@ -56,7 +56,7 @@ public class ModFile implements IModFile { private ModFileScanData fileModFileScanData; private volatile CompletableFuture futureScanResult; private List coreMods; - private List mixinConfigs; + private List mixinConfigs; private List accessTransformers; public static final Attributes.Name TYPE = new Attributes.Name("FMLModType"); @@ -135,7 +135,7 @@ public List getCoreMods() { return coreMods; } - public List getMixinConfigs() { + public List getMixinConfigs() { return mixinConfigs; } diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java index d379330df..d55b97cd0 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java @@ -90,22 +90,22 @@ protected static List getCoreMods(final ModFile modFile) { /** * Represents a potential mixin configuration. * - * @param name The name of the mixin configuration. - * @param requiredModIds The mod ids that are required for this mixin configuration to be loaded. If empty, will be loaded regardless. + * @param config The name of the mixin configuration. + * @param requiredMods The mod ids that are required for this mixin configuration to be loaded. If empty, will be loaded regardless. */ - public record PotentialMixinConfig(String name, List requiredModIds) {} + public record MixinConfig(String config, List requiredMods) {} - protected static List getMixinConfigs(IModFileInfo modFileInfo) { + protected static List getMixinConfigs(IModFileInfo modFileInfo) { try { var config = modFileInfo.getConfig(); var mixinsEntries = config.getConfigList("mixins"); - var potentialMixins = new ArrayList(); + var potentialMixins = new ArrayList(); for (IConfigurable mixinsEntry : mixinsEntries) { var name = mixinsEntry.getConfigElement("config") .orElseThrow(() -> new InvalidModFileException("Missing \"config\" in [[mixins]] entry", modFileInfo)); var requiredModIds = mixinsEntry.>getConfigElement("requiredMods").orElse(List.of()); - potentialMixins.add(new PotentialMixinConfig(name, requiredModIds)); + potentialMixins.add(new MixinConfig(name, requiredModIds)); } return potentialMixins; From 3be393341f68b35436955dfafdcd0db8c056da61 Mon Sep 17 00:00:00 2001 From: Marc Hermans Date: Sat, 18 Jan 2025 20:17:26 +0100 Subject: [PATCH 7/7] Fix spotless? --- .../main/java/net/neoforged/fml/loading/LoadingModList.java | 4 +--- .../net/neoforged/fml/loading/moddiscovery/ModFileParser.java | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java b/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java index 2e681fa97..f5b962253 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java +++ b/loader/src/main/java/net/neoforged/fml/loading/LoadingModList.java @@ -82,9 +82,7 @@ public void addMixinConfigs() { .forEach(file -> { final String modId = file.getModInfos().get(0).getModId(); for (ModFileParser.MixinConfig potential : file.getMixinConfigs()) { - if (potential.requiredMods().stream().allMatch( - id -> this.getModFileById(id) != null - )) { + if (potential.requiredMods().stream().allMatch(id -> this.getModFileById(id) != null)) { DeferredMixinConfigRegistration.addMixinConfig(potential.config(), modId); } else { LOGGER.debug("Mixin config {} for mod {} not applied as required mods are missing", potential.config(), modId); diff --git a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java index d55b97cd0..96e41f4b5 100644 --- a/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java +++ b/loader/src/main/java/net/neoforged/fml/loading/moddiscovery/ModFileParser.java @@ -90,7 +90,7 @@ protected static List getCoreMods(final ModFile modFile) { /** * Represents a potential mixin configuration. * - * @param config The name of the mixin configuration. + * @param config The name of the mixin configuration. * @param requiredMods The mod ids that are required for this mixin configuration to be loaded. If empty, will be loaded regardless. */ public record MixinConfig(String config, List requiredMods) {}