From 7f37b9786153fb6e85670b5f27337dc20ec4d99b Mon Sep 17 00:00:00 2001 From: Anuken Date: Tue, 1 Nov 2022 08:47:00 -0400 Subject: [PATCH] Removed serverPaused --- core/src/mindustry/core/Control.java | 3 +++ core/src/mindustry/core/GameState.java | 12 +++--------- core/src/mindustry/core/NetClient.java | 4 +++- core/src/mindustry/core/NetServer.java | 17 ++++++++++++++--- core/src/mindustry/logic/LogicDialog.java | 4 ++-- core/src/mindustry/ui/dialogs/BaseDialog.java | 6 ++---- server/src/mindustry/server/ServerControl.java | 16 ++++++++++------ 7 files changed, 37 insertions(+), 25 deletions(-) diff --git a/core/src/mindustry/core/Control.java b/core/src/mindustry/core/Control.java index d5134d99a1..7361c0f298 100644 --- a/core/src/mindustry/core/Control.java +++ b/core/src/mindustry/core/Control.java @@ -269,6 +269,9 @@ public class Control implements ApplicationListener, Loadable{ Events.on(SaveWriteEvent.class, e -> forcePlaceAll()); Events.on(HostEvent.class, e -> forcePlaceAll()); + Events.on(HostEvent.class, e -> { + state.set(State.playing); + }); } private void forcePlaceAll(){ diff --git a/core/src/mindustry/core/GameState.java b/core/src/mindustry/core/GameState.java index 7726052765..0e7e06436e 100644 --- a/core/src/mindustry/core/GameState.java +++ b/core/src/mindustry/core/GameState.java @@ -24,8 +24,6 @@ public class GameState{ public boolean gameOver = false; /** Whether the player's team won the match. */ public boolean won = false; - /** If true, the server has been put into the paused state on multiplayer. This is synced. */ - public boolean serverPaused = false; /** Server ticks/second. Only valid in multiplayer. */ public int serverTps = -1; /** Map that is currently being played on. */ @@ -51,12 +49,8 @@ public class GameState{ } public void set(State astate){ - //horrible horrible horrible - if(astate == State.paused && net.server() && !headless) serverPaused = true; - if(astate != State.paused && net.server() && !headless) serverPaused = false; - - //cannot pause when in multiplayer - if(astate == State.paused && net.active()) return; + //nothing to change. + if(state == astate) return; Events.fire(new StateChangeEvent(state, astate)); state = astate; @@ -88,7 +82,7 @@ public class GameState{ } public boolean isPaused(){ - return (is(State.paused) && !net.active()) || (serverPaused && !isMenu()); + return is(State.paused); } public boolean isPlaying(){ diff --git a/core/src/mindustry/core/NetClient.java b/core/src/mindustry/core/NetClient.java index f3151b8458..8e76c14482 100644 --- a/core/src/mindustry/core/NetClient.java +++ b/core/src/mindustry/core/NetClient.java @@ -488,7 +488,9 @@ public class NetClient implements ApplicationListener{ state.wavetime = waveTime; state.wave = wave; state.enemies = enemies; - state.serverPaused = paused; + if(!state.isMenu()){ + state.set(paused ? State.paused : State.playing); + } state.serverTps = tps & 0xff; //note that this is far from a guarantee that random state is synced - tiny changes in delta and ping can throw everything off again. diff --git a/core/src/mindustry/core/NetServer.java b/core/src/mindustry/core/NetServer.java index 58420f84cb..f949cece22 100644 --- a/core/src/mindustry/core/NetServer.java +++ b/core/src/mindustry/core/NetServer.java @@ -96,7 +96,7 @@ public class NetServer implements ApplicationListener{ } }; - private boolean closing = false; + private boolean closing = false, pvpAutoPaused = true; private Interval timer = new Interval(10); private IntSet buildHealthChanged = new IntSet(); @@ -862,7 +862,18 @@ public class NetServer implements ApplicationListener{ if(state.isGame() && net.server()){ if(state.rules.pvp){ - state.serverPaused = isWaitingForPlayers(); + boolean waiting = isWaitingForPlayers(), paused = state.isPaused(); + if(waiting != paused){ + if(waiting){ + //is now waiting, enable pausing, flag it correctly + pvpAutoPaused = true; + state.set(State.paused); + }else if(pvpAutoPaused){ + //no longer waiting, stop pausing + state.set(State.playing); + pvpAutoPaused = false; + } + } } sync(); @@ -941,7 +952,7 @@ public class NetServer implements ApplicationListener{ dataStream.close(); //write basic state data. - Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.serverPaused, state.gameOver, + Call.stateSnapshot(player.con, state.wavetime, state.wave, state.enemies, state.isPaused(), state.gameOver, universe.seconds(), tps, GlobalVars.rand.seed0, GlobalVars.rand.seed1, syncStream.toByteArray()); syncStream.reset(); diff --git a/core/src/mindustry/logic/LogicDialog.java b/core/src/mindustry/logic/LogicDialog.java index d6c755a9ca..ac2fd249a8 100644 --- a/core/src/mindustry/logic/LogicDialog.java +++ b/core/src/mindustry/logic/LogicDialog.java @@ -116,13 +116,13 @@ public class LogicDialog extends BaseDialog{ buttons.button("@variables", Icon.menu, () -> { BaseDialog dialog = new BaseDialog("@variables"); dialog.hidden(() -> { - if(!wasPaused){ + if(!wasPaused && !net.active()){ state.set(State.paused); } }); dialog.shown(() -> { - if(!wasPaused){ + if(!wasPaused && !net.active()){ state.set(State.playing); } }); diff --git a/core/src/mindustry/ui/dialogs/BaseDialog.java b/core/src/mindustry/ui/dialogs/BaseDialog.java index 99c761eeb4..bfbe690539 100644 --- a/core/src/mindustry/ui/dialogs/BaseDialog.java +++ b/core/src/mindustry/ui/dialogs/BaseDialog.java @@ -24,10 +24,8 @@ public class BaseDialog extends Dialog{ .growX().height(3f).pad(4f); hidden(() -> { - if(shouldPause && state.isGame() && !net.active()){ - if(!wasPaused || net.active()){ - state.set(State.playing); - } + if(shouldPause && state.isGame() && !net.active() && !wasPaused){ + state.set(State.playing); } Sounds.back.play(); }); diff --git a/server/src/mindustry/server/ServerControl.java b/server/src/mindustry/server/ServerControl.java index 5440f775e1..1ea5eb6d32 100644 --- a/server/src/mindustry/server/ServerControl.java +++ b/server/src/mindustry/server/ServerControl.java @@ -272,8 +272,8 @@ public class ServerControl implements ApplicationListener{ }); Events.on(PlayerJoin.class, e -> { - if(state.serverPaused && autoPaused && Config.autoPause.bool()){ - state.serverPaused = false; + if(state.isPaused() && autoPaused && Config.autoPause.bool()){ + state.set(State.playing); autoPaused = false; } }); @@ -281,8 +281,8 @@ public class ServerControl implements ApplicationListener{ Events.on(PlayerLeave.class, e -> { // The player list length is compared with 1 and not 0 here, // because when PlayerLeave gets fired, the player hasn't been removed from the player list yet - if(!state.serverPaused && Config.autoPause.bool() && Groups.player.size() == 1){ - state.serverPaused = true; + if(!state.isPaused() && Config.autoPause.bool() && Groups.player.size() == 1){ + state.set(State.paused); autoPaused = true; } }); @@ -372,7 +372,7 @@ public class ServerControl implements ApplicationListener{ netServer.openServer(); if(Config.autoPause.bool()){ - state.serverPaused = true; + state.set(State.paused); autoPaused = true; } }catch(MapException e){ @@ -489,9 +489,13 @@ public class ServerControl implements ApplicationListener{ }); handler.register("pause", "", "Pause or unpause the game.", arg -> { + if(!state.isMenu()){ + err("Cannot pause without a game running."); + return; + } boolean pause = arg[0].equals("on"); autoPaused = false; - state.serverPaused = pause; + state.set(state.isPaused() ? State.playing : State.paused); info(pause ? "Game paused." : "Game unpaused."); });