Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport 1.20's 'pause-when-empty-seconds' server property #470

Merged
merged 12 commits into from
Jan 13, 2025
2 changes: 1 addition & 1 deletion dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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", "Default value: 0 (off)" })
@Config.DefaultBoolean(true)
serenibyss marked this conversation as resolved.
Show resolved Hide resolved
public static boolean pauseWhenEmpty;

@Config.Comment("Reduces water opacity from 3 to 1, to match modern")
@Config.DefaultBoolean(false)
public static boolean useLighterWater;
Expand Down Expand Up @@ -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;

}
7 changes: 7 additions & 0 deletions src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,13 @@ 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)
.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)
.setSide(Side.BOTH).addTargetedMod(TargetedMod.VANILLA).addMixinClasses("minecraft.MixinBlock_LighterWater")
.setApplyIf(() -> TweaksConfig.useLighterWater)),
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Boolean> cir) {
hodgepodge$pauseWhenEmptySeconds = settings.getIntProperty("pause-when-empty-seconds", 0);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.mitchej123.hodgepodge.mixins.early.minecraft.server;

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;
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.CallbackInfo;

import com.mitchej123.hodgepodge.Common;
import com.mitchej123.hodgepodge.mixins.interfaces.IPauseWhenEmpty;

@Mixin(MinecraftServer.class)
public abstract class MixinMinecraftServer_PauseWhenEmpty {

@Shadow
public abstract int getCurrentPlayerCount();

@Shadow
private ServerConfigurationManager serverConfigManager;

@Shadow
protected abstract void saveAllWorlds(boolean dontLog);

@Shadow
public abstract NetworkSystem func_147137_ag();

@Unique
private int hodgepodge$emptyTicks = 0;

@Inject(method = "tick", at = @At("HEAD"), cancellable = true, order = 9000)
public void hodgepodge$tick(CallbackInfo ci) {
if ((Object) this instanceof DedicatedServer ds && ds instanceof IPauseWhenEmpty p) {
int pauseTicks = p.getPauseWhenEmptySeconds() * 20;
if (pauseTicks > 0) {
if (this.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", p.getPauseWhenEmptySeconds());
this.serverConfigManager.saveAllPlayerData();
this.saveAllWorlds(true);
}

net.minecraftforge.common.chunkio.ChunkIOExecutor.tick();
// to process new connections
this.func_147137_ag().networkTick();
ds.executePendingCommands();
ci.cancel();
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.mitchej123.hodgepodge.mixins.interfaces;

public interface IPauseWhenEmpty {

int getPauseWhenEmptySeconds();
}