From 936909c6f46061fd6a818e0f63db11114e4ef78e Mon Sep 17 00:00:00 2001 From: EggleEgg <125359838+EggleEgg@users.noreply.github.com> Date: Thu, 22 Jan 2026 21:17:33 +0100 Subject: [PATCH 1/2] Enable pausing gamerule --- core/assets/bundles/bundle.properties | 1 + core/src/mindustry/core/Control.java | 14 +++++++------- core/src/mindustry/game/CampaignRules.java | 2 ++ core/src/mindustry/game/Rules.java | 2 ++ .../mindustry/ui/dialogs/CampaignRulesDialog.java | 1 + .../mindustry/ui/dialogs/CustomRulesDialog.java | 1 + core/src/mindustry/ui/fragments/HudFragment.java | 6 +++--- 7 files changed, 17 insertions(+), 10 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 549dceed33..fd2b82b4e2 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1518,6 +1518,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI +rules.pauseEnabled = Enable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index c27f371b02..cea8da8117 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -155,7 +155,7 @@ public class Control implements ApplicationListener, Loadable{ //autohost for pvp maps Events.on(WorldLoadEvent.class, event -> app.post(() -> { - if(state.rules.pvp && !net.active()){ + if(state.rules.pvp && !net.active() && state.rules.pauseEnabled){ try{ net.host(port); player.admin = true; @@ -258,7 +258,7 @@ public class Control implements ApplicationListener, Loadable{ if(ccore != null){ anyBuilds = true; - if(!net.active()){ + if(!net.active() && state.rules.pauseEnabled){ build.pickedUp(); build.tile.remove(); @@ -607,7 +607,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void pause(){ - if(settings.getBool("backgroundpause", true) && !net.active()){ + if(settings.getBool("backgroundpause", true) && !net.active() && state.rules.pauseEnabled){ backgroundPaused = true; wasPaused = state.is(State.paused); if(state.is(State.playing)) state.set(State.paused); @@ -616,7 +616,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void resume(){ - if(state.is(State.paused) && !wasPaused && settings.getBool("backgroundpause", true) && !net.active()){ + if(state.is(State.paused) && !wasPaused && settings.getBool("backgroundpause", true) && !net.active() && state.rules.pauseEnabled){ state.set(State.playing); } backgroundPaused = false; @@ -711,7 +711,7 @@ public class Control implements ApplicationListener, Loadable{ core.items.each((i, a) -> i.unlock()); } - if(backgroundPaused && settings.getBool("backgroundpause") && !net.active()){ + if(backgroundPaused && settings.getBool("backgroundpause") && !net.active() && state.rules.pauseEnabled){ state.set(State.paused); } @@ -720,7 +720,7 @@ public class Control implements ApplicationListener, Loadable{ state.set(State.playing); } - if(!net.client() && Core.input.keyTap(Binding.pause) && !(state.isCampaign() && state.afterGameOver) && !renderer.isCutscene() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ + if(!net.client() && state.rules.pauseEnabled && Core.input.keyTap(Binding.pause) && !(state.isCampaign() && state.afterGameOver) && !renderer.isCutscene() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ state.set(state.isPaused() ? State.playing : State.paused); } @@ -733,7 +733,7 @@ public class Control implements ApplicationListener, Loadable{ ui.chatfrag.hide(); }else if(!ui.paused.isShown() && !scene.hasDialog()){ ui.paused.show(); - if(!net.active()){ + if(!net.active() && state.rules.pauseEnabled){ state.set(State.paused); } } diff --git a/core/src/mindustry/game/CampaignRules.java b/core/src/mindustry/game/CampaignRules.java index fa1d71ee16..0e04828795 100644 --- a/core/src/mindustry/game/CampaignRules.java +++ b/core/src/mindustry/game/CampaignRules.java @@ -13,11 +13,13 @@ public class CampaignRules{ public boolean legacyLaunchPads; public boolean rtsAI; public boolean clearSectorOnLose; + public boolean pauseEnabled; public void apply(Planet planet, Rules rules){ rules.staticFog = rules.fog = fog; rules.showSpawns = showSpawns; rules.randomWaveAI = randomWaveAI; + rules.pauseEnabled = pauseEnabled; rules.objectiveTimerMultiplier = difficulty.waveTimeMultiplier; if(planet.showRtsAIRule){ boolean enabled = rtsAI && rules.attackMode; //if attackMode becomes false (waves enabled), turn off RTS AI diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index e633265a4e..eaec9e4c55 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -40,6 +40,8 @@ public class Rules{ public boolean pvp; /** Whether is waiting for players enabled in PvP. */ public boolean pvpAutoPause = true; + /** Whether pause is enabled or not in singleplayer */ + public boolean pauseEnabled = true; /** Whether to pause the wave timer until all enemies are destroyed. */ public boolean waitEnemies = false; /** Determines if gamemode is attack mode. */ diff --git a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java index 8a978635ec..f9742a7d80 100644 --- a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java @@ -69,6 +69,7 @@ public class CampaignRulesDialog extends BaseDialog{ check("@rules.fog", b -> rules.fog = b, () -> rules.fog); check("@rules.showspawns", b -> rules.showSpawns = b, () -> rules.showSpawns); check("@rules.randomwaveai", b -> rules.randomWaveAI = b, () -> rules.randomWaveAI); + check("@rules.pauseEnabled", b -> rules.pauseEnabled = b, () -> rules.pauseEnabled); if(planet.showRtsAIRule){ check("@rules.rtsai.campaign", b -> rules.rtsAI = b, () -> rules.rtsAI); diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index 599352dccc..ad16584d24 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -216,6 +216,7 @@ public class CustomRulesDialog extends BaseDialog{ category("environment"); + check("@rules.pauseEnabled", b -> rules.pauseEnabled = b, () -> rules.pauseEnabled); check("@rules.explosions", b -> rules.damageExplosions = b, () -> rules.damageExplosions); check("@rules.fire", b -> rules.fire = b, () -> rules.fire); check("@rules.fog", b -> rules.fog = b, () -> rules.fog); diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 9881c6f648..72c4d52f99 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -359,13 +359,13 @@ public class HudFragment{ .name("schematics"); select.button(Icon.pause, style, () -> { - if(net.active()){ + if(net.active() || !state.rules.pauseEnabled){ ui.listfrag.toggle(); }else{ state.set(state.isPaused() ? State.playing : State.paused); } }).name("pause").update(i -> { - if(net.active()){ + if(net.active() || !state.rules.pauseEnabled){ i.getStyle().imageUp = Icon.players; }else{ i.setDisabled(false); @@ -1137,7 +1137,7 @@ public class HudFragment{ } private boolean canSkipWave(){ - return state.rules.waves && state.rules.waveSending && ((net.server() || player.admin) || !net.active()) && state.enemies == 0 && !spawner.isSpawning(); + return state.rules.waves && state.rules.waveSending && ((net.server() || player.admin) || !net.active()) && state.rules.pauseEnabled && state.enemies == 0 && !spawner.isSpawning(); } } From a601be72e3f57d9bf212726c0ef0659d47c6eacf Mon Sep 17 00:00:00 2001 From: EggleEgg <125359838+EggleEgg@users.noreply.github.com> Date: Thu, 22 Jan 2026 21:49:03 +0100 Subject: [PATCH 2/2] disable pausing --- core/assets/bundles/bundle.properties | 2 +- core/src/mindustry/core/Control.java | 14 +++++++------- core/src/mindustry/game/CampaignRules.java | 4 ++-- core/src/mindustry/game/Rules.java | 2 +- .../mindustry/ui/dialogs/CampaignRulesDialog.java | 2 +- .../mindustry/ui/dialogs/CustomRulesDialog.java | 2 +- core/src/mindustry/ui/fragments/HudFragment.java | 6 +++--- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index fd2b82b4e2..f4bb67a1d5 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1518,7 +1518,7 @@ rules.legacylaunchpads.info = Allows using launch pads without landing pads, as landingpad.legacy.disabled = [scarlet]\ue815 Disabled[lightgray] (Legacy Launch Pads enabled) rules.showspawns = Show Enemy Spawns rules.randomwaveai = Unpredictable Wave AI -rules.pauseEnabled = Enable Pausing +rules.pauseDisabled = Disable Pausing rules.fire = Fire rules.anyenv = rules.explosions = Block/Unit Explosion Damage diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index cea8da8117..0a500cac37 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -155,7 +155,7 @@ public class Control implements ApplicationListener, Loadable{ //autohost for pvp maps Events.on(WorldLoadEvent.class, event -> app.post(() -> { - if(state.rules.pvp && !net.active() && state.rules.pauseEnabled){ + if(state.rules.pvp && !net.active() && !state.rules.pauseDisabled){ try{ net.host(port); player.admin = true; @@ -258,7 +258,7 @@ public class Control implements ApplicationListener, Loadable{ if(ccore != null){ anyBuilds = true; - if(!net.active() && state.rules.pauseEnabled){ + if(!net.active() && !state.rules.pauseDisabled){ build.pickedUp(); build.tile.remove(); @@ -607,7 +607,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void pause(){ - if(settings.getBool("backgroundpause", true) && !net.active() && state.rules.pauseEnabled){ + if(settings.getBool("backgroundpause", true) && !net.active() && !state.rules.pauseDisabled){ backgroundPaused = true; wasPaused = state.is(State.paused); if(state.is(State.playing)) state.set(State.paused); @@ -616,7 +616,7 @@ public class Control implements ApplicationListener, Loadable{ @Override public void resume(){ - if(state.is(State.paused) && !wasPaused && settings.getBool("backgroundpause", true) && !net.active() && state.rules.pauseEnabled){ + if(state.is(State.paused) && !wasPaused && settings.getBool("backgroundpause", true) && !net.active() && !state.rules.pauseDisabled){ state.set(State.playing); } backgroundPaused = false; @@ -711,7 +711,7 @@ public class Control implements ApplicationListener, Loadable{ core.items.each((i, a) -> i.unlock()); } - if(backgroundPaused && settings.getBool("backgroundpause") && !net.active() && state.rules.pauseEnabled){ + if(backgroundPaused && settings.getBool("backgroundpause") && !net.active() && !state.rules.pauseDisabled){ state.set(State.paused); } @@ -720,7 +720,7 @@ public class Control implements ApplicationListener, Loadable{ state.set(State.playing); } - if(!net.client() && state.rules.pauseEnabled && Core.input.keyTap(Binding.pause) && !(state.isCampaign() && state.afterGameOver) && !renderer.isCutscene() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ + if(!net.client() && !state.rules.pauseDisabled && Core.input.keyTap(Binding.pause) && !(state.isCampaign() && state.afterGameOver) && !renderer.isCutscene() && !scene.hasDialog() && !scene.hasKeyboard() && !ui.restart.isShown() && (state.is(State.paused) || state.is(State.playing))){ state.set(state.isPaused() ? State.playing : State.paused); } @@ -733,7 +733,7 @@ public class Control implements ApplicationListener, Loadable{ ui.chatfrag.hide(); }else if(!ui.paused.isShown() && !scene.hasDialog()){ ui.paused.show(); - if(!net.active() && state.rules.pauseEnabled){ + if(!net.active() && !state.rules.pauseDisabled){ state.set(State.paused); } } diff --git a/core/src/mindustry/game/CampaignRules.java b/core/src/mindustry/game/CampaignRules.java index 0e04828795..e6f1b98465 100644 --- a/core/src/mindustry/game/CampaignRules.java +++ b/core/src/mindustry/game/CampaignRules.java @@ -13,13 +13,13 @@ public class CampaignRules{ public boolean legacyLaunchPads; public boolean rtsAI; public boolean clearSectorOnLose; - public boolean pauseEnabled; + public boolean pauseDisabled; public void apply(Planet planet, Rules rules){ rules.staticFog = rules.fog = fog; rules.showSpawns = showSpawns; rules.randomWaveAI = randomWaveAI; - rules.pauseEnabled = pauseEnabled; + rules.pauseDisabled = pauseDisabled; rules.objectiveTimerMultiplier = difficulty.waveTimeMultiplier; if(planet.showRtsAIRule){ boolean enabled = rtsAI && rules.attackMode; //if attackMode becomes false (waves enabled), turn off RTS AI diff --git a/core/src/mindustry/game/Rules.java b/core/src/mindustry/game/Rules.java index eaec9e4c55..a7400b7eff 100644 --- a/core/src/mindustry/game/Rules.java +++ b/core/src/mindustry/game/Rules.java @@ -41,7 +41,7 @@ public class Rules{ /** Whether is waiting for players enabled in PvP. */ public boolean pvpAutoPause = true; /** Whether pause is enabled or not in singleplayer */ - public boolean pauseEnabled = true; + public boolean pauseDisabled = false; /** Whether to pause the wave timer until all enemies are destroyed. */ public boolean waitEnemies = false; /** Determines if gamemode is attack mode. */ diff --git a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java index f9742a7d80..026f8b4017 100644 --- a/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CampaignRulesDialog.java @@ -69,7 +69,7 @@ public class CampaignRulesDialog extends BaseDialog{ check("@rules.fog", b -> rules.fog = b, () -> rules.fog); check("@rules.showspawns", b -> rules.showSpawns = b, () -> rules.showSpawns); check("@rules.randomwaveai", b -> rules.randomWaveAI = b, () -> rules.randomWaveAI); - check("@rules.pauseEnabled", b -> rules.pauseEnabled = b, () -> rules.pauseEnabled); + check("@rules.pauseDisabled", b -> rules.pauseDisabled = b, () -> rules.pauseDisabled); if(planet.showRtsAIRule){ check("@rules.rtsai.campaign", b -> rules.rtsAI = b, () -> rules.rtsAI); diff --git a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java index ad16584d24..0d9ed7cad9 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -216,7 +216,7 @@ public class CustomRulesDialog extends BaseDialog{ category("environment"); - check("@rules.pauseEnabled", b -> rules.pauseEnabled = b, () -> rules.pauseEnabled); + check("@rules.pauseDisabled", b -> rules.pauseDisabled = b, () -> rules.pauseDisabled); check("@rules.explosions", b -> rules.damageExplosions = b, () -> rules.damageExplosions); check("@rules.fire", b -> rules.fire = b, () -> rules.fire); check("@rules.fog", b -> rules.fog = b, () -> rules.fog); diff --git a/core/src/mindustry/ui/fragments/HudFragment.java b/core/src/mindustry/ui/fragments/HudFragment.java index 72c4d52f99..3cf3c7603a 100644 --- a/core/src/mindustry/ui/fragments/HudFragment.java +++ b/core/src/mindustry/ui/fragments/HudFragment.java @@ -359,13 +359,13 @@ public class HudFragment{ .name("schematics"); select.button(Icon.pause, style, () -> { - if(net.active() || !state.rules.pauseEnabled){ + if(net.active() || state.rules.pauseDisabled){ ui.listfrag.toggle(); }else{ state.set(state.isPaused() ? State.playing : State.paused); } }).name("pause").update(i -> { - if(net.active() || !state.rules.pauseEnabled){ + if(net.active() || state.rules.pauseDisabled){ i.getStyle().imageUp = Icon.players; }else{ i.setDisabled(false); @@ -1137,7 +1137,7 @@ public class HudFragment{ } private boolean canSkipWave(){ - return state.rules.waves && state.rules.waveSending && ((net.server() || player.admin) || !net.active()) && state.rules.pauseEnabled && state.enemies == 0 && !spawner.isSpawning(); + return state.rules.waves && state.rules.waveSending && ((net.server() || player.admin) || !net.active()) && !state.rules.pauseDisabled && state.enemies == 0 && !spawner.isSpawning(); } }