From bddbe2d49140af2e5f8d8b63528bddb280cfe748 Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 15:22:33 -0600 Subject: [PATCH 01/11] Backport 1.20's 'pause-when-empty-seconds' server property --- dependencies.gradle | 2 +- .../hodgepodge/config/TweaksConfig.java | 5 +- .../mitchej123/hodgepodge/mixins/Mixins.java | 5 ++ .../MixinMinecraftServer_PauseWhenEmpty.java | 64 +++++++++++++++++++ src/main/resources/META-INF/hodgepodge_at.cfg | 2 + 5 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java diff --git a/dependencies.gradle b/dependencies.gradle index 6ae98c64..559c984e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -61,7 +61,7 @@ dependencies { transformedModCompileOnly(deobf("https://forum.industrial-craft.net/core/attachment/4316-advancedsolarpanel-1-7-10-3-5-1-jar/")) transformedModCompileOnly(rfg.deobf("curse.maven:candycraft-251118:2330488")) - devOnlyNonPublishable(deobf("https://github.com/makamys/CoreTweaks/releases/download/0.3.3.2/CoreTweaks-1.7.10-0.3.3.2+nomixin.jar")) + transformedModCompileOnly(deobf("https://github.com/makamys/CoreTweaks/releases/download/0.3.3.2/CoreTweaks-1.7.10-0.3.3.2+nomixin.jar")) } // Replace when RFG support deobfuscation from notch mappings diff --git a/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java b/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java index 34b43b64..e28f67e0 100644 --- a/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java +++ b/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java @@ -128,6 +128,10 @@ public class TweaksConfig { @Config.DefaultInt(900) public static int autoSaveInterval; + @Config.Comment("Backports 1.20's 'pause-when-empty-seconds' server property") + @Config.DefaultBoolean(true) + public static boolean pauseWhenEmpty; + @Config.Comment("Reduces water opacity from 3 to 1, to match modern") @Config.DefaultBoolean(false) public static boolean useLighterWater; @@ -306,5 +310,4 @@ public class TweaksConfig { @Config.Comment("Avoids droping items on container close, and instead places them in the player inventory. (Inspired from EFR)") @Config.DefaultBoolean(true) public static boolean avoidDroppingItemsWhenClosing; - } diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java index f4189fd6..fcd70243 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java @@ -418,6 +418,11 @@ public enum Mixins { .addMixinClasses("minecraft.server.MixinMinecraftServer_AutoSaveInterval") .setApplyIf(() -> TweaksConfig.autoSaveInterval != 900)), + PAUSE_WHEN_EMPTY(new Builder("Pauses the server when noone is online after X seconds; Servers Only").setPhase(Phase.EARLY).setSide(Side.SERVER) + .addTargetedMod(TargetedMod.VANILLA) + .addMixinClasses("minecraft.server.MixinMinecraftServer_PauseWhenEmpty") + .setApplyIf(() -> TweaksConfig.pauseWhenEmpty)), + LIGHTER_WATER(new Builder("Decreases water opacity from 3 to 1, like in modern").setPhase(Phase.EARLY) .setSide(Side.BOTH).addTargetedMod(TargetedMod.VANILLA).addMixinClasses("minecraft.MixinBlock_LighterWater") .setApplyIf(() -> TweaksConfig.useLighterWater)), diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java new file mode 100644 index 00000000..8cf27a4a --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java @@ -0,0 +1,64 @@ +package com.mitchej123.hodgepodge.mixins.early.minecraft.server; + +import com.mitchej123.hodgepodge.Common; +import com.mitchej123.hodgepodge.Hodgepodge; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.server.dedicated.PropertyManager; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.logging.ILogger; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.io.File; +import java.net.Proxy; + +@Mixin(DedicatedServer.class) +public abstract class MixinMinecraftServer_PauseWhenEmpty extends MinecraftServer { + @Shadow private PropertyManager settings; + + @Unique + private int hodgepodge$pauseWhenEmptySeconds = 0; + @Unique + private int hodgepodge$emptyTicks = 0; + + public MixinMinecraftServer_PauseWhenEmpty(File workDir, Proxy proxy) { + super(workDir, proxy); + } + + @Inject(method = "startServer", at = @At(value = "INVOKE", target = "Lcpw/mods/fml/common/FMLCommonHandler;onServerStarted()V", shift = At.Shift.AFTER)) + public void hodgepodge$setupServer(CallbackInfoReturnable cir){ + hodgepodge$pauseWhenEmptySeconds = settings.getIntProperty("pause-when-empty-seconds", 0); + } + + @Override + public void tick(){ + int pauseTicks = hodgepodge$pauseWhenEmptySeconds * 20; + if (pauseTicks > 0){ + if (getCurrentPlayerCount() == 0){ + this.hodgepodge$emptyTicks++; + } else { + this.hodgepodge$emptyTicks = 0; + } + + if (hodgepodge$emptyTicks >= pauseTicks){ + if (hodgepodge$emptyTicks == pauseTicks){ + Common.log.info("Server empty for {} seconds, saving and pausing", hodgepodge$pauseWhenEmptySeconds); + this.serverConfigManager.saveAllPlayerData(); + this.saveAllWorlds(true); + } + + // to process new connections + this.func_147137_ag().networkTick(); + return; + } + } + + super.tick(); + } +} diff --git a/src/main/resources/META-INF/hodgepodge_at.cfg b/src/main/resources/META-INF/hodgepodge_at.cfg index efbb68a7..feeadcad 100644 --- a/src/main/resources/META-INF/hodgepodge_at.cfg +++ b/src/main/resources/META-INF/hodgepodge_at.cfg @@ -23,4 +23,6 @@ public net.minecraft.client.resources.SimpleReloadableResourceManager field_1105 public net.minecraft.entity.EntityList field_75624_e # classToIDMapping public net.minecraft.world.WorldServer func_73053_d()V # wakeAllPlayers() +protected net.minecraft.server.MinecraftServer field_71318_t # serverConfigManager + public net.minecraft.server.management.PlayerManager$PlayerInstance From bbd849061a02ef46db160c1da79f4f437017f440 Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 15:25:12 -0600 Subject: [PATCH 02/11] spotless --- .../mitchej123/hodgepodge/mixins/Mixins.java | 4 +- .../MixinMinecraftServer_PauseWhenEmpty.java | 38 +++++++++++-------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java index fcd70243..d2c5f51b 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java @@ -418,8 +418,8 @@ public enum Mixins { .addMixinClasses("minecraft.server.MixinMinecraftServer_AutoSaveInterval") .setApplyIf(() -> TweaksConfig.autoSaveInterval != 900)), - PAUSE_WHEN_EMPTY(new Builder("Pauses the server when noone is online after X seconds; Servers Only").setPhase(Phase.EARLY).setSide(Side.SERVER) - .addTargetedMod(TargetedMod.VANILLA) + PAUSE_WHEN_EMPTY(new Builder("Pauses the server when noone is online after X seconds; Servers Only") + .setPhase(Phase.EARLY).setSide(Side.SERVER).addTargetedMod(TargetedMod.VANILLA) .addMixinClasses("minecraft.server.MixinMinecraftServer_PauseWhenEmpty") .setApplyIf(() -> TweaksConfig.pauseWhenEmpty)), diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java index 8cf27a4a..97bc9339 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java @@ -1,13 +1,12 @@ package com.mitchej123.hodgepodge.mixins.early.minecraft.server; -import com.mitchej123.hodgepodge.Common; -import com.mitchej123.hodgepodge.Hodgepodge; +import java.io.File; +import java.net.Proxy; + import net.minecraft.server.MinecraftServer; import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.dedicated.PropertyManager; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.logging.ILogger; + import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -15,12 +14,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import java.io.File; -import java.net.Proxy; +import com.mitchej123.hodgepodge.Common; @Mixin(DedicatedServer.class) public abstract class MixinMinecraftServer_PauseWhenEmpty extends MinecraftServer { - @Shadow private PropertyManager settings; + + @Shadow + private PropertyManager settings; @Unique private int hodgepodge$pauseWhenEmptySeconds = 0; @@ -31,24 +31,30 @@ public MixinMinecraftServer_PauseWhenEmpty(File workDir, Proxy proxy) { super(workDir, proxy); } - @Inject(method = "startServer", at = @At(value = "INVOKE", target = "Lcpw/mods/fml/common/FMLCommonHandler;onServerStarted()V", shift = At.Shift.AFTER)) - public void hodgepodge$setupServer(CallbackInfoReturnable cir){ + @Inject( + method = "startServer", + at = @At( + value = "INVOKE", + target = "Lcpw/mods/fml/common/FMLCommonHandler;onServerStarted()V", + shift = At.Shift.AFTER)) + public void hodgepodge$setupServer(CallbackInfoReturnable cir) { hodgepodge$pauseWhenEmptySeconds = settings.getIntProperty("pause-when-empty-seconds", 0); } @Override - public void tick(){ + public void tick() { int pauseTicks = hodgepodge$pauseWhenEmptySeconds * 20; - if (pauseTicks > 0){ - if (getCurrentPlayerCount() == 0){ + if (pauseTicks > 0) { + if (getCurrentPlayerCount() == 0) { this.hodgepodge$emptyTicks++; } else { this.hodgepodge$emptyTicks = 0; } - if (hodgepodge$emptyTicks >= pauseTicks){ - if (hodgepodge$emptyTicks == pauseTicks){ - Common.log.info("Server empty for {} seconds, saving and pausing", hodgepodge$pauseWhenEmptySeconds); + if (hodgepodge$emptyTicks >= pauseTicks) { + if (hodgepodge$emptyTicks == pauseTicks) { + Common.log + .info("Server empty for {} seconds, saving and pausing", hodgepodge$pauseWhenEmptySeconds); this.serverConfigManager.saveAllPlayerData(); this.saveAllWorlds(true); } From 9175a9848ee688b82312aa89ee57d7c9a533fffe Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 15:34:11 -0600 Subject: [PATCH 03/11] dont need to remap this target --- .../minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java index 97bc9339..e4058fd5 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java @@ -36,6 +36,7 @@ public MixinMinecraftServer_PauseWhenEmpty(File workDir, Proxy proxy) { at = @At( value = "INVOKE", target = "Lcpw/mods/fml/common/FMLCommonHandler;onServerStarted()V", + remap = false, shift = At.Shift.AFTER)) public void hodgepodge$setupServer(CallbackInfoReturnable cir) { hodgepodge$pauseWhenEmptySeconds = settings.getIntProperty("pause-when-empty-seconds", 0); From 8a0d1fd61923a12ec5b477b4d557dc68b54f5794 Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 16:23:45 -0600 Subject: [PATCH 04/11] Move main logic to MinecraftServer mixin --- .../mitchej123/hodgepodge/mixins/Mixins.java | 4 +- .../MixinDedicatedServer_PauseWhenEmpty.java | 39 +++++++++ .../MixinMinecraftServer_PauseWhenEmpty.java | 82 ++++++++----------- .../mixins/interfaces/IPauseWhenEmpty.java | 6 ++ src/main/resources/META-INF/hodgepodge_at.cfg | 2 - 5 files changed, 84 insertions(+), 49 deletions(-) create mode 100644 src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinDedicatedServer_PauseWhenEmpty.java create mode 100644 src/main/java/com/mitchej123/hodgepodge/mixins/interfaces/IPauseWhenEmpty.java diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java index efc8bab4..18d7e53c 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java @@ -423,7 +423,9 @@ public enum Mixins { PAUSE_WHEN_EMPTY(new Builder("Pauses the server when noone is online after X seconds; Servers Only") .setPhase(Phase.EARLY).setSide(Side.SERVER).addTargetedMod(TargetedMod.VANILLA) - .addMixinClasses("minecraft.server.MixinMinecraftServer_PauseWhenEmpty") + .addMixinClasses( + "minecraft.server.MixinMinecraftServer_PauseWhenEmpty", + "minecraft.server.MixinDedicatedServer_PauseWhenEmpty") .setApplyIf(() -> TweaksConfig.pauseWhenEmpty)), LIGHTER_WATER(new Builder("Decreases water opacity from 3 to 1, like in modern").setPhase(Phase.EARLY) diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinDedicatedServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinDedicatedServer_PauseWhenEmpty.java new file mode 100644 index 00000000..0804e3be --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinDedicatedServer_PauseWhenEmpty.java @@ -0,0 +1,39 @@ +package com.mitchej123.hodgepodge.mixins.early.minecraft.server; + +import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.server.dedicated.PropertyManager; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.mitchej123.hodgepodge.mixins.interfaces.IPauseWhenEmpty; + +@Mixin(DedicatedServer.class) +public class MixinDedicatedServer_PauseWhenEmpty implements IPauseWhenEmpty { + + @Shadow + private PropertyManager settings; + + @Unique + private int hodgepodge$pauseWhenEmptySeconds = 0; + + @Override + public int getPauseWhenEmptySeconds() { + return hodgepodge$pauseWhenEmptySeconds; + } + + @Inject( + method = "startServer", + at = @At( + value = "INVOKE", + target = "Lcpw/mods/fml/common/FMLCommonHandler;onServerStarted()V", + remap = false, + shift = At.Shift.AFTER)) + public void hodgepodge$setupServer(CallbackInfoReturnable cir) { + hodgepodge$pauseWhenEmptySeconds = settings.getIntProperty("pause-when-empty-seconds", 0); + } +} diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java index e4058fd5..3d0ab06a 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java @@ -1,71 +1,61 @@ package com.mitchej123.hodgepodge.mixins.early.minecraft.server; -import java.io.File; -import java.net.Proxy; - +import net.minecraft.network.NetworkSystem; import net.minecraft.server.MinecraftServer; -import net.minecraft.server.dedicated.DedicatedServer; -import net.minecraft.server.dedicated.PropertyManager; +import net.minecraft.server.management.ServerConfigurationManager; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mitchej123.hodgepodge.Common; +import com.mitchej123.hodgepodge.mixins.interfaces.IPauseWhenEmpty; -@Mixin(DedicatedServer.class) -public abstract class MixinMinecraftServer_PauseWhenEmpty extends MinecraftServer { +@Mixin(MinecraftServer.class) +public abstract class MixinMinecraftServer_PauseWhenEmpty { @Shadow - private PropertyManager settings; + public abstract int getCurrentPlayerCount(); - @Unique - private int hodgepodge$pauseWhenEmptySeconds = 0; - @Unique - private int hodgepodge$emptyTicks = 0; + @Shadow + private ServerConfigurationManager serverConfigManager; - public MixinMinecraftServer_PauseWhenEmpty(File workDir, Proxy proxy) { - super(workDir, proxy); - } + @Shadow + protected abstract void saveAllWorlds(boolean dontLog); - @Inject( - method = "startServer", - at = @At( - value = "INVOKE", - target = "Lcpw/mods/fml/common/FMLCommonHandler;onServerStarted()V", - remap = false, - shift = At.Shift.AFTER)) - public void hodgepodge$setupServer(CallbackInfoReturnable cir) { - hodgepodge$pauseWhenEmptySeconds = settings.getIntProperty("pause-when-empty-seconds", 0); - } + @Shadow + public abstract NetworkSystem func_147137_ag(); - @Override - public void tick() { - int pauseTicks = hodgepodge$pauseWhenEmptySeconds * 20; - if (pauseTicks > 0) { - if (getCurrentPlayerCount() == 0) { - this.hodgepodge$emptyTicks++; - } else { - this.hodgepodge$emptyTicks = 0; - } + @Unique + private int hodgepodge$emptyTicks = 0; - if (hodgepodge$emptyTicks >= pauseTicks) { - if (hodgepodge$emptyTicks == pauseTicks) { - Common.log - .info("Server empty for {} seconds, saving and pausing", hodgepodge$pauseWhenEmptySeconds); - this.serverConfigManager.saveAllPlayerData(); - this.saveAllWorlds(true); + @Inject(method = "tick", at = @At("HEAD"), cancellable = true, order = 9000) + public void tick(CallbackInfo ci) { + if ((Object) this instanceof IPauseWhenEmpty p) { + int pauseTicks = p.getPauseWhenEmptySeconds() * 20; + if (pauseTicks > 0) { + if (this.getCurrentPlayerCount() == 0) { + this.hodgepodge$emptyTicks++; + } else { + this.hodgepodge$emptyTicks = 0; } - // to process new connections - this.func_147137_ag().networkTick(); - return; + if (hodgepodge$emptyTicks >= pauseTicks) { + if (hodgepodge$emptyTicks == pauseTicks) { + Common.log + .info("Server empty for {} seconds, saving and pausing", p.getPauseWhenEmptySeconds()); + this.serverConfigManager.saveAllPlayerData(); + this.saveAllWorlds(true); + } + + // to process new connections + this.func_147137_ag().networkTick(); + ci.cancel(); + } } } - - super.tick(); } } diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/interfaces/IPauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/interfaces/IPauseWhenEmpty.java new file mode 100644 index 00000000..19375a3e --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/interfaces/IPauseWhenEmpty.java @@ -0,0 +1,6 @@ +package com.mitchej123.hodgepodge.mixins.interfaces; + +public interface IPauseWhenEmpty { + + int getPauseWhenEmptySeconds(); +} diff --git a/src/main/resources/META-INF/hodgepodge_at.cfg b/src/main/resources/META-INF/hodgepodge_at.cfg index feeadcad..efbb68a7 100644 --- a/src/main/resources/META-INF/hodgepodge_at.cfg +++ b/src/main/resources/META-INF/hodgepodge_at.cfg @@ -23,6 +23,4 @@ public net.minecraft.client.resources.SimpleReloadableResourceManager field_1105 public net.minecraft.entity.EntityList field_75624_e # classToIDMapping public net.minecraft.world.WorldServer func_73053_d()V # wakeAllPlayers() -protected net.minecraft.server.MinecraftServer field_71318_t # serverConfigManager - public net.minecraft.server.management.PlayerManager$PlayerInstance From 74097b781bfed739a4aaa77af96660adc4205554 Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 16:25:03 -0600 Subject: [PATCH 05/11] rename injected method --- .../minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java index 3d0ab06a..28748429 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java @@ -33,7 +33,7 @@ public abstract class MixinMinecraftServer_PauseWhenEmpty { private int hodgepodge$emptyTicks = 0; @Inject(method = "tick", at = @At("HEAD"), cancellable = true, order = 9000) - public void tick(CallbackInfo ci) { + public void hodgepodge$tick(CallbackInfo ci) { if ((Object) this instanceof IPauseWhenEmpty p) { int pauseTicks = p.getPauseWhenEmptySeconds() * 20; if (pauseTicks > 0) { From d6f4eb30ae8faacf4560ce4bff9a5188f8e8da72 Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 16:32:36 -0600 Subject: [PATCH 06/11] Add default value of server property to config description --- .../java/com/mitchej123/hodgepodge/config/TweaksConfig.java | 2 +- src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java b/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java index e28f67e0..e2cb5232 100644 --- a/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java +++ b/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java @@ -128,7 +128,7 @@ public class TweaksConfig { @Config.DefaultInt(900) public static int autoSaveInterval; - @Config.Comment("Backports 1.20's 'pause-when-empty-seconds' server property") + @Config.Comment({"Backports 1.20's 'pause-when-empty-seconds' server property", "Default value: 0 (off)"}) @Config.DefaultBoolean(true) public static boolean pauseWhenEmpty; diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java index 18d7e53c..43152766 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java @@ -421,7 +421,7 @@ public enum Mixins { .addMixinClasses("minecraft.server.MixinMinecraftServer_AutoSaveInterval") .setApplyIf(() -> TweaksConfig.autoSaveInterval != 900)), - PAUSE_WHEN_EMPTY(new Builder("Pauses the server when noone is online after X seconds; Servers Only") + PAUSE_WHEN_EMPTY(new Builder("Pauses the server when empty after X seconds; Servers Only") .setPhase(Phase.EARLY).setSide(Side.SERVER).addTargetedMod(TargetedMod.VANILLA) .addMixinClasses( "minecraft.server.MixinMinecraftServer_PauseWhenEmpty", From 8d30aa1e6852e8a2e66f38ad7387234a9149fd8a Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 16:36:32 -0600 Subject: [PATCH 07/11] spotless --- .../java/com/mitchej123/hodgepodge/config/TweaksConfig.java | 2 +- src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java b/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java index e2cb5232..cac8464c 100644 --- a/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java +++ b/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java @@ -128,7 +128,7 @@ public class TweaksConfig { @Config.DefaultInt(900) public static int autoSaveInterval; - @Config.Comment({"Backports 1.20's 'pause-when-empty-seconds' server property", "Default value: 0 (off)"}) + @Config.Comment({ "Backports 1.20's 'pause-when-empty-seconds' server property", "Default value: 0 (off)" }) @Config.DefaultBoolean(true) public static boolean pauseWhenEmpty; diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java index 43152766..5f5952ac 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java @@ -421,8 +421,8 @@ public enum Mixins { .addMixinClasses("minecraft.server.MixinMinecraftServer_AutoSaveInterval") .setApplyIf(() -> TweaksConfig.autoSaveInterval != 900)), - PAUSE_WHEN_EMPTY(new Builder("Pauses the server when empty after X seconds; Servers Only") - .setPhase(Phase.EARLY).setSide(Side.SERVER).addTargetedMod(TargetedMod.VANILLA) + PAUSE_WHEN_EMPTY(new Builder("Pauses the server when empty after X seconds; Servers Only").setPhase(Phase.EARLY) + .setSide(Side.SERVER).addTargetedMod(TargetedMod.VANILLA) .addMixinClasses( "minecraft.server.MixinMinecraftServer_PauseWhenEmpty", "minecraft.server.MixinDedicatedServer_PauseWhenEmpty") From afe30f9972439060a1054a3742d1d0a2a6c2ef84 Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 18:45:36 -0600 Subject: [PATCH 08/11] Allow console commands and chunk io in case chunks were in the middle of populating --- .../server/MixinMinecraftServer_PauseWhenEmpty.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java index 28748429..05eb01b0 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java @@ -2,6 +2,7 @@ import net.minecraft.network.NetworkSystem; import net.minecraft.server.MinecraftServer; +import net.minecraft.server.dedicated.DedicatedServer; import net.minecraft.server.management.ServerConfigurationManager; import org.spongepowered.asm.mixin.Mixin; @@ -34,7 +35,7 @@ public abstract class MixinMinecraftServer_PauseWhenEmpty { @Inject(method = "tick", at = @At("HEAD"), cancellable = true, order = 9000) public void hodgepodge$tick(CallbackInfo ci) { - if ((Object) this instanceof IPauseWhenEmpty p) { + if ((Object) this instanceof DedicatedServer ds && ds instanceof IPauseWhenEmpty p) { int pauseTicks = p.getPauseWhenEmptySeconds() * 20; if (pauseTicks > 0) { if (this.getCurrentPlayerCount() == 0) { @@ -51,8 +52,10 @@ public abstract class MixinMinecraftServer_PauseWhenEmpty { this.saveAllWorlds(true); } + net.minecraftforge.common.chunkio.ChunkIOExecutor.tick(); // to process new connections this.func_147137_ag().networkTick(); + ds.executePendingCommands(); ci.cancel(); } } From 3144f4457fd55131e77535ac7562f4dadba9ac84 Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 20:34:18 -0600 Subject: [PATCH 09/11] Add command to change server property --- .../hodgepodge/commands/DebugCommand.java | 49 ++++++++++++++++--- .../MixinDedicatedServer_PauseWhenEmpty.java | 9 ++++ .../MixinMinecraftServer_PauseWhenEmpty.java | 14 +++++- .../mixins/interfaces/IPauseWhenEmpty.java | 2 + 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java b/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java index c7dc3165..6969a6bb 100644 --- a/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java +++ b/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java @@ -15,6 +15,8 @@ import org.apache.commons.lang3.RandomUtils; import org.apache.commons.lang3.math.NumberUtils; +import com.mitchej123.hodgepodge.config.TweaksConfig; +import com.mitchej123.hodgepodge.mixins.interfaces.IPauseWhenEmpty; import com.mitchej123.hodgepodge.util.AnchorAlarm; public class DebugCommand extends CommandBase { @@ -26,11 +28,11 @@ public String getCommandName() { @Override public String getCommandUsage(ICommandSender sender) { - return "Usage: hp . Valid subcommands are: toggle, anchor, randomNbt."; + return "Usage: hp . Valid subcommands are: toggle, anchor, randomNbt, pauseWhenEmpty."; } private void printHelp(ICommandSender sender) { - sender.addChatMessage(new ChatComponentText("Usage: hp ")); + sender.addChatMessage(new ChatComponentText("Usage: hp ")); sender.addChatMessage(new ChatComponentText("\"toggle anchordebug\" - toggles RC anchor debugging")); sender.addChatMessage( new ChatComponentText( @@ -38,16 +40,19 @@ private void printHelp(ICommandSender sender) { sender.addChatMessage( new ChatComponentText( "\"randomNbt [bytes]\" - adds a random byte array of the given size to the held item")); + sender.addChatMessage( + new ChatComponentText( + "\"pauseWhenEmpty [seconds]\" - sets the time the server will wait before pausing when no players are online; 0 to disable")); } @Override public List addTabCompletionOptions(ICommandSender sender, String[] ss) { List l = new ArrayList<>(); String test = ss.length == 0 ? "" : ss[0].trim(); - if (ss.length == 0 || ss.length == 1 - && (test.isEmpty() || Stream.of("toggle", "anchor", "randomNbt").anyMatch(s -> s.startsWith(test)))) { - Stream.of("toggle", "anchor", "randomNbt").filter(s -> test.isEmpty() || s.startsWith(test)) - .forEach(l::add); + if (ss.length == 0 || ss.length == 1 && (test.isEmpty() + || Stream.of("toggle", "anchor", "randomNbt", "pauseWhenEmpty").anyMatch(s -> s.startsWith(test)))) { + Stream.of("toggle", "anchor", "randomNbt", "pause_when_empty") + .filter(s -> test.isEmpty() || s.startsWith(test)).forEach(l::add); } else if (test.equals("toggle")) { String test1 = ss[1].trim(); if (test1.isEmpty() || "anchordebug".startsWith(test1)) l.add("anchordebug"); @@ -112,6 +117,38 @@ public void processCommand(ICommandSender sender, String[] strings) { stack.stackTagCompound.setByteArray("DebugJunk", randomData); player.inventory.inventoryChanged = true; player.inventoryContainer.detectAndSendChanges(); + break; + case "pauseWhenEmpty": + if (!TweaksConfig.pauseWhenEmpty) { + sender.addChatMessage(new ChatComponentText("'pauseWhenEmpty' config option is disabled")); + return; + } + if (strings.length < 2) { + printHelp(sender); + return; + } + final int pauseTimeout = NumberUtils.toInt(strings[1], -1); + if (pauseTimeout < 0) { + printHelp(sender); + return; + } + + MinecraftServer server = MinecraftServer.getServer(); + if (!server.isDedicatedServer()) { + sender.addChatMessage( + new ChatComponentText("'hp pauseWhenEmpty' only applies to dedicated servers")); + return; + } + + if (server instanceof IPauseWhenEmpty p) { + p.setPauseWhenEmptySeconds(pauseTimeout); + sender.addChatMessage( + new ChatComponentText( + String.format( + "Server property 'pause-when-empty-seconds' set to %d", + pauseTimeout))); + } + break; } } diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinDedicatedServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinDedicatedServer_PauseWhenEmpty.java index 0804e3be..6682bf62 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinDedicatedServer_PauseWhenEmpty.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinDedicatedServer_PauseWhenEmpty.java @@ -26,6 +26,15 @@ public int getPauseWhenEmptySeconds() { return hodgepodge$pauseWhenEmptySeconds; } + @Override + public void setPauseWhenEmptySeconds(int value) { + value = Math.max(value, 0); + hodgepodge$pauseWhenEmptySeconds = value; + + settings.setProperty("pause-when-empty-seconds", hodgepodge$pauseWhenEmptySeconds); + settings.saveProperties(); + } + @Inject( method = "startServer", at = @At( diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java index 05eb01b0..1550834b 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/server/MixinMinecraftServer_PauseWhenEmpty.java @@ -32,6 +32,8 @@ public abstract class MixinMinecraftServer_PauseWhenEmpty { @Unique private int hodgepodge$emptyTicks = 0; + @Unique + private boolean hodgepodge$wasPaused = false; @Inject(method = "tick", at = @At("HEAD"), cancellable = true, order = 9000) public void hodgepodge$tick(CallbackInfo ci) { @@ -45,19 +47,27 @@ public abstract class MixinMinecraftServer_PauseWhenEmpty { } if (hodgepodge$emptyTicks >= pauseTicks) { - if (hodgepodge$emptyTicks == pauseTicks) { + if (!hodgepodge$wasPaused) { Common.log .info("Server empty for {} seconds, saving and pausing", p.getPauseWhenEmptySeconds()); this.serverConfigManager.saveAllPlayerData(); this.saveAllWorlds(true); + hodgepodge$wasPaused = true; } - + // to finish saving chunks net.minecraftforge.common.chunkio.ChunkIOExecutor.tick(); // to process new connections this.func_147137_ag().networkTick(); + // to process console commands ds.executePendingCommands(); ci.cancel(); + } else if (hodgepodge$wasPaused) { + Common.log.info("Resuming server"); + hodgepodge$wasPaused = false; } + } else if (hodgepodge$wasPaused) { + Common.log.info("Resuming server"); + hodgepodge$wasPaused = false; } } } diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/interfaces/IPauseWhenEmpty.java b/src/main/java/com/mitchej123/hodgepodge/mixins/interfaces/IPauseWhenEmpty.java index 19375a3e..42e2fb96 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/interfaces/IPauseWhenEmpty.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/interfaces/IPauseWhenEmpty.java @@ -3,4 +3,6 @@ public interface IPauseWhenEmpty { int getPauseWhenEmptySeconds(); + + void setPauseWhenEmptySeconds(int value); } From e5545ce1301c15ad1e8d0b3e728cb9fa3316f26d Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 21:19:13 -0600 Subject: [PATCH 10/11] missed renames --- .../java/com/mitchej123/hodgepodge/commands/DebugCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java b/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java index 6969a6bb..b2e18f10 100644 --- a/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java +++ b/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java @@ -32,7 +32,7 @@ public String getCommandUsage(ICommandSender sender) { } private void printHelp(ICommandSender sender) { - sender.addChatMessage(new ChatComponentText("Usage: hp ")); + sender.addChatMessage(new ChatComponentText("Usage: hp ")); sender.addChatMessage(new ChatComponentText("\"toggle anchordebug\" - toggles RC anchor debugging")); sender.addChatMessage( new ChatComponentText( @@ -51,7 +51,7 @@ public List addTabCompletionOptions(ICommandSender sender, String[] ss) String test = ss.length == 0 ? "" : ss[0].trim(); if (ss.length == 0 || ss.length == 1 && (test.isEmpty() || Stream.of("toggle", "anchor", "randomNbt", "pauseWhenEmpty").anyMatch(s -> s.startsWith(test)))) { - Stream.of("toggle", "anchor", "randomNbt", "pause_when_empty") + Stream.of("toggle", "anchor", "randomNbt", "pauseWhenEmpty") .filter(s -> test.isEmpty() || s.startsWith(test)).forEach(l::add); } else if (test.equals("toggle")) { String test1 = ss[1].trim(); From 2f51da1ef1bb8e2dc44ba70c9aaa4aecbd8d37e7 Mon Sep 17 00:00:00 2001 From: Caedis Date: Thu, 9 Jan 2025 23:07:41 -0600 Subject: [PATCH 11/11] update deps --- dependencies.gradle | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 559c984e..f180087e 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -12,21 +12,21 @@ configurations { } dependencies { - api("com.github.GTNewHorizons:GTNHLib:0.6.0:dev") + api("com.github.GTNewHorizons:GTNHLib:0.6.1:dev") compileOnly("com.gtnewhorizons.retrofuturabootstrap:RetroFuturaBootstrap:1.0.2") { transitive = false } - transformedMod("com.github.GTNewHorizons:NotEnoughItems:2.7.11-GTNH:dev") // force a more up-to-date NEI version - transformedModCompileOnly("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-516-GTNH") + transformedMod("com.github.GTNewHorizons:NotEnoughItems:2.7.15-GTNH:dev") // force a more up-to-date NEI version + transformedModCompileOnly("com.github.GTNewHorizons:Applied-Energistics-2-Unofficial:rv3-beta-518-GTNH") transformedModCompileOnly("com.github.GTNewHorizons:Baubles:1.0.4:dev") // Transitive updates to make runClient17 work transformedModCompileOnly("com.github.GTNewHorizons:ForgeMultipart:1.6.0:dev") - transformedModCompileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.51.48:dev") + transformedModCompileOnly("com.github.GTNewHorizons:GT5-Unofficial:5.09.51.61:dev") transformedModCompileOnly("com.github.GTNewHorizons:harvestcraft:1.2.3-GTNH:dev") transformedModCompileOnly("com.github.GTNewHorizons:HungerOverhaul:1.1.0-GTNH:dev") - transformedModCompileOnly("com.github.GTNewHorizons:MrTJPCore:1.2.1:dev") // Do not update, fixed afterwards - transformedModCompileOnly("com.github.GTNewHorizons:Railcraft:9.16.1:dev") { exclude group: "thaumcraft", module: "Thaumcraft" } - transformedModCompileOnly("com.github.GTNewHorizons:TinkersConstruct:1.13.2-GTNH:dev") + transformedModCompileOnly("com.github.GTNewHorizons:MrTJPCore:1.3.0:dev") // Do not update, fixed afterwards + transformedModCompileOnly("com.github.GTNewHorizons:Railcraft:9.16.2:dev") { exclude group: "thaumcraft", module: "Thaumcraft" } + transformedModCompileOnly("com.github.GTNewHorizons:TinkersConstruct:1.13.3-GTNH:dev") transformedModCompileOnly(rfg.deobf("curse.maven:bibliocraft-228027:2423369")) transformedModCompileOnly(rfg.deobf("curse.maven:biomes-o-plenty-220318:2499612")) transformedModCompileOnly("curse.maven:cofh-core-69162:2388751") @@ -45,7 +45,7 @@ dependencies { transformedModCompileOnly(rfg.deobf("curse.maven:glibys-voice-chat-225110:2301492")) transformedModCompileOnly(rfg.deobf("curse.maven:automagy-222153:2285272")) - transformedModCompileOnly("com.github.GTNewHorizons:Galacticraft:3.3.0-GTNH:dev") + transformedModCompileOnly("com.github.GTNewHorizons:Galacticraft:3.3.1-GTNH:dev") transformedModCompileOnly("curse.maven:minechem-368422:2905830") transformedModCompileOnly("curse.maven:thermal-dynamics-227443:2388756") transformedModCompileOnly("curse.maven:thermal-expansion-69163:2388759")