Skip to content

Commit

Permalink
Add the ability to make mixin configs in neoforge.mods.toml only load…
Browse files Browse the repository at this point in the history
… when certain mods are present. (#237)

(cherry picked from commit 17de0d5)
  • Loading branch information
marchermans committed Jan 19, 2025
1 parent 45105b7 commit d0030d8
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 12 deletions.
2 changes: 1 addition & 1 deletion loader/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
plugins {
id 'net.neoforged.jarcompatibilitychecker' version '0.1.3'
id 'net.neoforged.jarcompatibilitychecker' version '0.1.13'
}

checkJarCompatibility {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 <em>in the loading context. This class cannot refer outside the
* loading package</em>
*/
public class LoadingModList {
private static final Logger LOGGER = LogUtils.getLogger();
private static LoadingModList INSTANCE;
private final List<IModFileInfo> plugins;
private final List<ModFileInfo> modFiles;
Expand Down Expand Up @@ -77,7 +81,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));
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);
}
}
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public class ModFile implements IModFile {
private ModFileScanData fileModFileScanData;
private volatile CompletableFuture<ModFileScanData> futureScanResult;
private List<CoreModFile> coreMods;
private List<String> mixinConfigs;
private List<ModFileParser.MixinConfig> mixinConfigs;
private List<Path> accessTransformers;

public static final Attributes.Name TYPE = new Attributes.Name("FMLModType");
Expand Down Expand Up @@ -135,7 +135,7 @@ public List<CoreModFile> getCoreMods() {
return coreMods;
}

public List<String> getMixinConfigs() {
public List<ModFileParser.MixinConfig> getMixinConfigs() {
return mixinConfigs;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@
import java.lang.reflect.Type;
import java.nio.file.Files;
import java.nio.file.Path;
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;
import net.neoforged.neoforgespi.language.IConfigurable;
import net.neoforged.neoforgespi.language.IModFileInfo;
import net.neoforged.neoforgespi.locating.IModFile;
import net.neoforged.neoforgespi.locating.InvalidModFileException;
Expand Down Expand Up @@ -85,17 +87,28 @@ protected static List<CoreModFile> getCoreMods(final ModFile modFile) {
.toList();
}

protected static List<String> getMixinConfigs(IModFileInfo modFileInfo) {
/**
* Represents a potential 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<String> requiredMods) {}

protected static List<MixinConfig> getMixinConfigs(IModFileInfo modFileInfo) {
try {
var config = modFileInfo.getConfig();
var mixinsEntries = config.getConfigList("mixins");
return mixinsEntries
.stream()
.map(entry -> entry
.<String>getConfigElement("config")
.orElseThrow(
() -> new InvalidModFileException("Missing \"config\" in [[mixins]] entry", modFileInfo)))
.toList();

var potentialMixins = new ArrayList<MixinConfig>();
for (IConfigurable mixinsEntry : mixinsEntries) {
var name = mixinsEntry.<String>getConfigElement("config")
.orElseThrow(() -> new InvalidModFileException("Missing \"config\" in [[mixins]] entry", modFileInfo));
var requiredModIds = mixinsEntry.<List<String>>getConfigElement("requiredMods").orElse(List.of());
potentialMixins.add(new MixinConfig(name, requiredModIds));
}

return potentialMixins;
} catch (Exception exception) {
LOGGER.error("Failed to load mixin configs from mod file", exception);
return List.of();
Expand Down

0 comments on commit d0030d8

Please sign in to comment.