diff --git a/src/main/java/com/github/glodblock/extendedae/mixins/config/MixinConfiguration.java b/src/main/java/com/github/glodblock/extendedae/mixins/config/MixinConfiguration.java new file mode 100644 index 00000000..47480d37 --- /dev/null +++ b/src/main/java/com/github/glodblock/extendedae/mixins/config/MixinConfiguration.java @@ -0,0 +1,29 @@ +package com.github.glodblock.extendedae.mixins.config; + +import com.github.glodblock.extendedae.util.mixinutil.IConfigStop; +import dev.toma.configuration.Configuration; +import dev.toma.configuration.config.io.ConfigIO; +import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; +import net.minecraft.server.dedicated.DedicatedServer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Configuration.class) +public abstract class MixinConfiguration { + + @Inject( + method = "", + at = @At("TAIL"), + remap = false + ) + private void stopServer(CallbackInfo ci) { + ServerLifecycleEvents.SERVER_STOPPING.register(server -> { + if (server instanceof DedicatedServer) { + ((IConfigStop) (Object) ConfigIO.FILE_WATCH_MANAGER).extendedae_$stop(); + } + }); + } + +} diff --git a/src/main/java/com/github/glodblock/extendedae/mixins/config/MixinFileWatchManager.java b/src/main/java/com/github/glodblock/extendedae/mixins/config/MixinFileWatchManager.java new file mode 100644 index 00000000..46022070 --- /dev/null +++ b/src/main/java/com/github/glodblock/extendedae/mixins/config/MixinFileWatchManager.java @@ -0,0 +1,36 @@ +package com.github.glodblock.extendedae.mixins.config; + +import com.github.glodblock.extendedae.util.mixinutil.IConfigStop; +import dev.toma.configuration.config.io.FileWatchManager; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import java.io.IOException; +import java.nio.file.WatchService; +import java.util.concurrent.ScheduledExecutorService; + +@Mixin(FileWatchManager.class) +public abstract class MixinFileWatchManager implements IConfigStop { + + @Final + @Shadow(remap = false) + private WatchService service; + + @Final + @Shadow(remap = false) + private ScheduledExecutorService executorService; + + @Unique + @Override + public void extendedae_$stop() { + try { + executorService.shutdown(); + service.close(); + } catch (IOException e) { + throw new IllegalStateException("Error while stopping FileWatch service", e); + } + } + +} diff --git a/src/main/java/com/github/glodblock/extendedae/util/mixinutil/IConfigStop.java b/src/main/java/com/github/glodblock/extendedae/util/mixinutil/IConfigStop.java new file mode 100644 index 00000000..de0364d4 --- /dev/null +++ b/src/main/java/com/github/glodblock/extendedae/util/mixinutil/IConfigStop.java @@ -0,0 +1,7 @@ +package com.github.glodblock.extendedae.util.mixinutil; + +public interface IConfigStop { + + void extendedae_$stop(); + +} diff --git a/src/main/resources/extendedae.mixins.json b/src/main/resources/extendedae.mixins.json index db8e3579..53346715 100644 --- a/src/main/resources/extendedae.mixins.json +++ b/src/main/resources/extendedae.mixins.json @@ -4,7 +4,9 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "MixinInitUpgrades", - "MixinPatternAccessTermMenu" + "MixinPatternAccessTermMenu", + "config.MixinConfiguration", + "config.MixinFileWatchManager" ], "injectors": { "defaultRequire": 1