diff --git a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java index e306a33a2..51937d2dd 100644 --- a/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java +++ b/src/fmllauncher/java/net/minecraftforge/fml/loading/FMLCommonLaunchHandler.java @@ -87,10 +87,11 @@ public abstract class FMLCommonLaunchHandler } protected void processModClassesEnvironmentVariable(final Map>>> arguments) { - LOGGER.debug(CORE, "Got mod coordinates {} from env", System.getenv("MOD_CLASSES")); + final String modClasses = Optional.ofNullable(System.getenv("MOD_CLASSES")).orElse(""); + LOGGER.debug(CORE, "Got mod coordinates {} from env", modClasses); // "a/b/;c/d/;" -> "modid%%c:\fish\pepper;modid%%c:\fish2\pepper2\;modid2%%c:\fishy\bums;modid2%%c:\hmm" - final Map> modClassPaths = Arrays.stream(System.getenv("MOD_CLASSES").split(File.pathSeparator)). + final Map> modClassPaths = Arrays.stream(modClasses.split(File.pathSeparator)). map(inp -> inp.split("%%", 2)).map(this::buildModPair). collect(Collectors.groupingBy(Pair::getLeft, Collectors.mapping(Pair::getRight, Collectors.toList()))); diff --git a/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java b/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java index 39931e96b..c75736c3c 100644 --- a/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java +++ b/src/main/java/net/minecraftforge/fml/config/ConfigFileTypeHandler.java @@ -25,14 +25,14 @@ public class ConfigFileTypeHandler { writingMode(WritingMode.REPLACE). build(); LOGGER.debug(CONFIG, "Built TOML config for {}", configPath.toString()); + configData.load(); + LOGGER.debug(CONFIG, "Loaded TOML config file {}", configPath.toString()); try { - FileWatcher.defaultInstance().addWatch(configPath, new ConfigWatcher(c, configData)); + FileWatcher.defaultInstance().addWatch(configPath, new ConfigWatcher(c, configData, Thread.currentThread().getContextClassLoader())); LOGGER.debug(CONFIG, "Watching TOML config file {} for changes", configPath.toString()); } catch (IOException e) { throw new RuntimeException("Couldn't watch config file", e); } - configData.load(); - LOGGER.debug(CONFIG, "Loaded TOML config file {}", configPath.toString()); return configData; }; } @@ -40,14 +40,18 @@ public class ConfigFileTypeHandler { private static class ConfigWatcher implements Runnable { private final ModConfig modConfig; private final CommentedFileConfig commentedFileConfig; + private final ClassLoader realClassLoader; - ConfigWatcher(final ModConfig modConfig, final CommentedFileConfig commentedFileConfig) { + ConfigWatcher(final ModConfig modConfig, final CommentedFileConfig commentedFileConfig, final ClassLoader classLoader) { this.modConfig = modConfig; this.commentedFileConfig = commentedFileConfig; + this.realClassLoader = classLoader; } @Override public void run() { + // Force the regular classloader onto the special thread + Thread.currentThread().setContextClassLoader(realClassLoader); LOGGER.debug(CONFIG, "Config file {} changed, sending notifies", this.modConfig.getFileName()); this.modConfig.fireEvent(new ModConfig.ConfigReloading(this.modConfig)); } diff --git a/src/main/java/net/minecraftforge/fml/config/ConfigTracker.java b/src/main/java/net/minecraftforge/fml/config/ConfigTracker.java index 912e22e79..fededc89b 100644 --- a/src/main/java/net/minecraftforge/fml/config/ConfigTracker.java +++ b/src/main/java/net/minecraftforge/fml/config/ConfigTracker.java @@ -7,7 +7,9 @@ import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.MarkerManager; import java.nio.file.Path; +import java.util.Collections; import java.util.EnumMap; +import java.util.LinkedHashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentSkipListSet; @@ -22,9 +24,9 @@ public class ConfigTracker { private ConfigTracker() { this.fileMap = new ConcurrentHashMap<>(); this.configSets = new EnumMap<>(ModConfig.Type.class); - this.configSets.put(ModConfig.Type.CLIENT, new ConcurrentSkipListSet<>()); + this.configSets.put(ModConfig.Type.CLIENT, Collections.synchronizedSet(new LinkedHashSet<>())); // this.configSets.put(ModConfig.Type.PLAYER, new ConcurrentSkipListSet<>()); - this.configSets.put(ModConfig.Type.SERVER, new ConcurrentSkipListSet<>()); + this.configSets.put(ModConfig.Type.SERVER, Collections.synchronizedSet(new LinkedHashSet<>())); } void trackConfig(final ModConfig config) { diff --git a/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java b/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java index b29cbd415..e414bb2f5 100644 --- a/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java +++ b/src/main/java/net/minecraftforge/fml/javafmlmod/FMLModContainer.java @@ -35,6 +35,7 @@ import net.minecraftforge.forgespi.language.ModFileScanData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Optional; import java.util.function.Consumer; import static net.minecraftforge.fml.Logging.LOADING; @@ -61,7 +62,7 @@ public class FMLModContainer extends ModContainer triggerMap.put(ModLoadingStage.PROCESS_IMC, dummy().andThen(this::beforeEvent).andThen(this::fireEvent).andThen(this::afterEvent)); triggerMap.put(ModLoadingStage.COMPLETE, dummy().andThen(this::beforeEvent).andThen(this::completeLoading).andThen(this::fireEvent).andThen(this::afterEvent)); this.eventBus = IEventBus.create(this::onEventFailed); - + this.configHandler = Optional.of(event -> this.eventBus.post(event)); try { modClass = Class.forName(className, true, modClassLoader);