[BUG] Fix Config watcher using too many threads and not detecting changes on Linux systems
This commit is contained in:
@@ -8,6 +8,7 @@ import org.jetbrains.annotations.ApiStatus;
|
|||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author HypherionSA
|
* @author HypherionSA
|
||||||
@@ -19,7 +20,9 @@ public final class ConfigController implements Serializable {
|
|||||||
* Cache of registered configs
|
* Cache of registered configs
|
||||||
*/
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
private static final HashMap<String, Pair<AbstractConfig, FileWatcher>> watchedConfigs = new HashMap<>();
|
private static final HashMap<String, AbstractConfig> watchedConfigs = new HashMap<>();
|
||||||
|
|
||||||
|
private static FileWatcher watcher = new FileWatcher(e -> CraterConstants.LOG.error("Config Watcher Error", e));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* INTERNAL METHOD - Register and watch the config
|
* INTERNAL METHOD - Register and watch the config
|
||||||
@@ -42,9 +45,8 @@ public final class ConfigController implements Serializable {
|
|||||||
if (watchedConfigs.containsKey(config.getConfigPath().toString())) {
|
if (watchedConfigs.containsKey(config.getConfigPath().toString())) {
|
||||||
CraterConstants.LOG.error("Failed to register {}. Config already registered", config.getConfigPath().getName());
|
CraterConstants.LOG.error("Failed to register {}. Config already registered", config.getConfigPath().getName());
|
||||||
} else {
|
} else {
|
||||||
FileWatcher configWatcher = new FileWatcher();
|
|
||||||
try {
|
try {
|
||||||
configWatcher.setWatch(config.getConfigPath(), () -> {
|
watcher.addWatch(config.getConfigPath(), () -> {
|
||||||
if (!config.isWasSaveCalled()) {
|
if (!config.isWasSaveCalled()) {
|
||||||
CraterConstants.LOG.info("Sending Reload Event for: {}", config.getConfigPath().getName());
|
CraterConstants.LOG.info("Sending Reload Event for: {}", config.getConfigPath().getName());
|
||||||
config.configReloaded();
|
config.configReloaded();
|
||||||
@@ -53,7 +55,7 @@ public final class ConfigController implements Serializable {
|
|||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
CraterConstants.LOG.error("Failed to register {} for auto reloading. {}", config.getConfigPath().getName(), e.getMessage());
|
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());
|
CraterConstants.LOG.info("Registered {} successfully!", config.getConfigPath().getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +1,6 @@
|
|||||||
package com.hypherionmc.craterlib;
|
package com.hypherionmc.craterlib;
|
||||||
|
|
||||||
import com.hypherionmc.craterlib.client.gui.config.ClothConfigScreenBuilder;
|
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.ConfigController;
|
||||||
import com.hypherionmc.craterlib.core.config.annotations.ClothScreen;
|
import com.hypherionmc.craterlib.core.config.annotations.ClothScreen;
|
||||||
import com.hypherionmc.craterlib.core.config.annotations.NoConfigScreen;
|
import com.hypherionmc.craterlib.core.config.annotations.NoConfigScreen;
|
||||||
@@ -27,12 +25,11 @@ public class CraterLibModMenuIntegration implements ModMenuApi {
|
|||||||
public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
|
public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
|
||||||
Map<String, ConfigScreenFactory<?>> configScreens = new HashMap<>();
|
Map<String, ConfigScreenFactory<?>> configScreens = new HashMap<>();
|
||||||
|
|
||||||
ConfigController.getWatchedConfigs().forEach((conf, watcher) -> {
|
ConfigController.getWatchedConfigs().forEach((conf, config) -> {
|
||||||
AbstractConfig config = watcher.getLeft();
|
|
||||||
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
|
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
|
||||||
return;
|
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));
|
configScreens.put(config.getModId(), screen -> ClothConfigScreenBuilder.buildConfigScreen(config, screen));
|
||||||
} else {
|
} else {
|
||||||
configScreens.put(config.getModId(), screen -> BridgedMinecraft.getInstance().buildWarningScreen(
|
configScreens.put(config.getModId(), screen -> BridgedMinecraft.getInstance().buildWarningScreen(
|
||||||
|
@@ -28,12 +28,11 @@ public class ConfigScreenHandlerMixin {
|
|||||||
*/
|
*/
|
||||||
@Inject(at = @At("RETURN"), method = "getScreenFactoryFor", cancellable = true, remap = false)
|
@Inject(at = @At("RETURN"), method = "getScreenFactoryFor", cancellable = true, remap = false)
|
||||||
private static void injectConfigScreen(IModInfo selectedMod, CallbackInfoReturnable<Optional<BiFunction<Minecraft, Screen, Screen>>> cir) {
|
private static void injectConfigScreen(IModInfo selectedMod, CallbackInfoReturnable<Optional<BiFunction<Minecraft, Screen, Screen>>> cir) {
|
||||||
ConfigController.getMonitoredConfigs().forEach((conf, watcher) -> {
|
ConfigController.getMonitoredConfigs().forEach((conf, config) -> {
|
||||||
AbstractConfig config = watcher.getLeft();
|
|
||||||
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
|
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
|
||||||
return;
|
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))));
|
ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> ClothConfigScreenBuilder.buildConfigScreen(config, screen))));
|
||||||
} else {
|
} else {
|
||||||
//ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> new CraterConfigScreen(config, screen))));
|
//ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> new CraterConfigScreen(config, screen))));
|
||||||
|
@@ -54,12 +54,11 @@ public class NeoForgeClientHelper implements ClientPlatform {
|
|||||||
LateInitEvent event = new LateInitEvent(new BridgedMinecraft(), BridgedOptions.of(Minecraft.getInstance().options));
|
LateInitEvent event = new LateInitEvent(new BridgedMinecraft(), BridgedOptions.of(Minecraft.getInstance().options));
|
||||||
CraterEventBus.INSTANCE.postEvent(event);
|
CraterEventBus.INSTANCE.postEvent(event);
|
||||||
|
|
||||||
ConfigController.getWatchedConfigs().forEach((conf, watcher) -> {
|
ConfigController.getWatchedConfigs().forEach((conf, config) -> {
|
||||||
AbstractConfig config = watcher.getLeft();
|
|
||||||
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
|
if (config.getClass().isAnnotationPresent(NoConfigScreen.class))
|
||||||
return;
|
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))));
|
ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> ClothConfigScreenBuilder.buildConfigScreen(config, screen))));
|
||||||
} else {
|
} else {
|
||||||
//ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> new CraterConfigScreen(config, screen))));
|
//ModList.get().getModContainerById(config.getModId()).ifPresent(c -> c.registerExtensionPoint(IConfigScreenFactory.class, ((minecraft, screen) -> new CraterConfigScreen(config, screen))));
|
||||||
|
@@ -1,7 +1,12 @@
|
|||||||
**Bug Fixes**:
|
**Bug Fixes**:
|
||||||
|
|
||||||
- Fixed LuckPerms breaking commands on Paper
|
- Fixed LuckPerms breaking commands on Paper
|
||||||
|
- Fix Config watcher using too many threads and not detecting changes on Linux systems
|
||||||
|
|
||||||
**New Features**:
|
**New Features**:
|
||||||
|
|
||||||
- Added Nojang API to allow mods to access GameRules (SDLink)
|
- Added Nojang API to allow mods to access GameRules (SDLink)
|
||||||
|
|
||||||
|
**Dev Changes**:
|
||||||
|
|
||||||
|
- Bumped MoonConfig - `1.0.10` -> `1.0.11`
|
@@ -2,7 +2,7 @@
|
|||||||
version_major=2
|
version_major=2
|
||||||
version_minor=1
|
version_minor=1
|
||||||
version_patch=4
|
version_patch=4
|
||||||
version_build=0
|
version_build=1
|
||||||
|
|
||||||
#Mod
|
#Mod
|
||||||
mod_author=HypherionSA
|
mod_author=HypherionSA
|
||||||
@@ -24,7 +24,7 @@ forge_version=50.0.6
|
|||||||
neoforge_version=16-beta
|
neoforge_version=16-beta
|
||||||
|
|
||||||
# Dependencies
|
# Dependencies
|
||||||
moon_config=1.0.10
|
moon_config=1.0.11
|
||||||
lombok=1.18.32
|
lombok=1.18.32
|
||||||
adventure=4.17.0
|
adventure=4.17.0
|
||||||
rpc_sdk=1.0
|
rpc_sdk=1.0
|
||||||
|
Reference in New Issue
Block a user