From b800a4ea78e2eae9b5d66af9d8c33f186b09eb26 Mon Sep 17 00:00:00 2001 From: hypherionmc Date: Thu, 13 Mar 2025 14:58:15 +0200 Subject: [PATCH] [BUG] Fix Config watcher using too many threads and not detecting changes on Linux systems --- .../craterlib/core/config/ConfigController.java | 10 ++++++---- .../craterlib/CraterLibModMenuIntegration.java | 7 ++----- .../craterlib/mixin/ConfigScreenHandlerMixin.java | 5 ++--- .../craterlib/client/NeoForgeClientHelper.java | 5 ++--- changelog.md | 7 ++++++- gradle.properties | 4 ++-- 6 files changed, 20 insertions(+), 18 deletions(-) diff --git a/Common/src/main/java/com/hypherionmc/craterlib/core/config/ConfigController.java b/Common/src/main/java/com/hypherionmc/craterlib/core/config/ConfigController.java index 760ca93..13c0fb7 100644 --- a/Common/src/main/java/com/hypherionmc/craterlib/core/config/ConfigController.java +++ b/Common/src/main/java/com/hypherionmc/craterlib/core/config/ConfigController.java @@ -8,6 +8,7 @@ import org.jetbrains.annotations.ApiStatus; import java.io.Serializable; import java.util.HashMap; +import java.util.HashSet; /** * @author HypherionSA @@ -19,7 +20,9 @@ public final class ConfigController implements Serializable { * Cache of registered configs */ @Getter - private static final HashMap> watchedConfigs = new HashMap<>(); + private static final HashMap watchedConfigs = new HashMap<>(); + + private static FileWatcher watcher = new FileWatcher(e -> CraterConstants.LOG.error("Config Watcher Error", e)); /** * INTERNAL METHOD - Register and watch the config @@ -42,9 +45,8 @@ public final class ConfigController implements Serializable { if (watchedConfigs.containsKey(config.getConfigPath().toString())) { CraterConstants.LOG.error("Failed to register {}. Config already registered", config.getConfigPath().getName()); } else { - FileWatcher configWatcher = new FileWatcher(); try { - configWatcher.setWatch(config.getConfigPath(), () -> { + watcher.addWatch(config.getConfigPath(), () -> { if (!config.isWasSaveCalled()) { CraterConstants.LOG.info("Sending Reload Event for: {}", config.getConfigPath().getName()); config.configReloaded(); @@ -53,7 +55,7 @@ public final class ConfigController implements Serializable { } catch (Exception e) { CraterConstants.LOG.error("Failed to register {} for auto reloading. {}", config.getConfigPath().getName(), e.getMessage()); } - watchedConfigs.put(config.getConfigPath().toString(), Pair.of(config, configWatcher)); + watchedConfigs.put(config.getConfigPath().toString(), config); CraterConstants.LOG.info("Registered {} successfully!", config.getConfigPath().getName()); } } diff --git a/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibModMenuIntegration.java b/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibModMenuIntegration.java index b93256c..7cbd7e2 100644 --- a/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibModMenuIntegration.java +++ b/Fabric/src/main/java/com/hypherionmc/craterlib/CraterLibModMenuIntegration.java @@ -1,8 +1,6 @@ package com.hypherionmc.craterlib; import com.hypherionmc.craterlib.client.gui.config.ClothConfigScreenBuilder; -import com.hypherionmc.craterlib.client.gui.config.CraterConfigScreen; -import com.hypherionmc.craterlib.core.config.AbstractConfig; import com.hypherionmc.craterlib.core.config.ConfigController; import com.hypherionmc.craterlib.core.config.annotations.ClothScreen; import com.hypherionmc.craterlib.core.config.annotations.NoConfigScreen; @@ -27,12 +25,11 @@ public class CraterLibModMenuIntegration implements ModMenuApi { public Map> getProvidedConfigScreenFactories() { Map> configScreens = new HashMap<>(); - ConfigController.getWatchedConfigs().forEach((conf, watcher) -> { - AbstractConfig config = watcher.getLeft(); + ConfigController.getWatchedConfigs().forEach((conf, config) -> { if (config.getClass().isAnnotationPresent(NoConfigScreen.class)) return; - if (watcher.getLeft().getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) { + if (config.getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) { configScreens.put(config.getModId(), screen -> ClothConfigScreenBuilder.buildConfigScreen(config, screen)); } else { configScreens.put(config.getModId(), screen -> BridgedMinecraft.getInstance().buildWarningScreen( diff --git a/Forge/src/main/java/com/hypherionmc/craterlib/mixin/ConfigScreenHandlerMixin.java b/Forge/src/main/java/com/hypherionmc/craterlib/mixin/ConfigScreenHandlerMixin.java index 1603d91..4d3b438 100644 --- a/Forge/src/main/java/com/hypherionmc/craterlib/mixin/ConfigScreenHandlerMixin.java +++ b/Forge/src/main/java/com/hypherionmc/craterlib/mixin/ConfigScreenHandlerMixin.java @@ -28,12 +28,11 @@ public class ConfigScreenHandlerMixin { */ @Inject(at = @At("RETURN"), method = "getScreenFactoryFor", cancellable = true, remap = false) private static void injectConfigScreen(IModInfo selectedMod, CallbackInfoReturnable>> cir) { - ConfigController.getMonitoredConfigs().forEach((conf, watcher) -> { - AbstractConfig config = watcher.getLeft(); + ConfigController.getMonitoredConfigs().forEach((conf, config) -> { if (config.getClass().isAnnotationPresent(NoConfigScreen.class)) return; - if (watcher.getLeft().getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) { + if (config.getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) { ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> ClothConfigScreenBuilder.buildConfigScreen(config, screen)))); } else { //ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> new CraterConfigScreen(config, screen)))); diff --git a/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientHelper.java b/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientHelper.java index eacd3a3..56d2e45 100644 --- a/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientHelper.java +++ b/NeoForge/src/main/java/com/hypherionmc/craterlib/client/NeoForgeClientHelper.java @@ -54,12 +54,11 @@ public class NeoForgeClientHelper implements ClientPlatform { LateInitEvent event = new LateInitEvent(new BridgedMinecraft(), BridgedOptions.of(Minecraft.getInstance().options)); CraterEventBus.INSTANCE.postEvent(event); - ConfigController.getWatchedConfigs().forEach((conf, watcher) -> { - AbstractConfig config = watcher.getLeft(); + ConfigController.getWatchedConfigs().forEach((conf, config) -> { if (config.getClass().isAnnotationPresent(NoConfigScreen.class)) return; - if (watcher.getLeft().getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) { + if (config.getClass().isAnnotationPresent(ClothScreen.class) && (ModloaderEnvironment.INSTANCE.isModLoaded("cloth_config") || ModloaderEnvironment.INSTANCE.isModLoaded("cloth-config") || ModloaderEnvironment.INSTANCE.isModLoaded("clothconfig"))) { ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> ClothConfigScreenBuilder.buildConfigScreen(config, screen)))); } else { //ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> new CraterConfigScreen(config, screen)))); diff --git a/changelog.md b/changelog.md index d38a3f6..a5ac78a 100644 --- a/changelog.md +++ b/changelog.md @@ -1,7 +1,12 @@ **Bug Fixes**: - Fixed LuckPerms breaking commands on Paper +- Fix Config watcher using too many threads and not detecting changes on Linux systems **New Features**: -- Added Nojang API to allow mods to access GameRules (SDLink) \ No newline at end of file +- Added Nojang API to allow mods to access GameRules (SDLink) + +**Dev Changes**: + +- Bumped MoonConfig - `1.0.10` -> `1.0.11` \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index dacf8fd..c583c9b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ version_major=2 version_minor=1 version_patch=4 -version_build=0 +version_build=1 #Mod mod_author=HypherionSA @@ -24,7 +24,7 @@ forge_version=50.0.6 neoforge_version=16-beta # Dependencies -moon_config=1.0.10 +moon_config=1.0.11 lombok=1.18.32 adventure=4.17.0 rpc_sdk=1.0