diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index e4e2e03e57..8d52c8c315 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -1532,6 +1532,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.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 4956525837..983dca67d9 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -146,7 +146,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.pauseDisabled){ try{ net.host(port); player.admin = true; @@ -249,7 +249,7 @@ public class Control implements ApplicationListener, Loadable{ if(ccore != null){ anyBuilds = true; - if(!net.active()){ + if(!net.active() && !state.rules.pauseDisabled){ build.pickedUp(); build.tile.remove(); @@ -606,7 +606,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.pauseDisabled){ backgroundPaused = true; wasPaused = state.is(State.paused); if(state.is(State.playing)) state.set(State.paused); @@ -615,7 +615,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.pauseDisabled){ state.set(State.playing); } backgroundPaused = false; @@ -710,7 +710,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.pauseDisabled){ state.set(State.paused); } @@ -719,7 +719,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.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); } @@ -732,7 +732,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.pauseDisabled){ state.set(State.paused); } } diff --git a/core/src/mindustry/game/CampaignRules.java b/core/src/mindustry/game/CampaignRules.java index fa1d71ee16..e6f1b98465 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 pauseDisabled; public void apply(Planet planet, Rules rules){ rules.staticFog = rules.fog = fog; rules.showSpawns = showSpawns; rules.randomWaveAI = randomWaveAI; + 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 e9c918d138..45490f3ade 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 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 8a978635ec..026f8b4017 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.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 98c85e5372..e299a81d0e 100644 --- a/core/src/mindustry/ui/dialogs/CustomRulesDialog.java +++ b/core/src/mindustry/ui/dialogs/CustomRulesDialog.java @@ -217,6 +217,7 @@ public class CustomRulesDialog extends BaseDialog{ category("environment"); + 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 9881c6f648..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()){ + 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()){ + 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.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(); } }