From 20a16ad5f879464e010699abdb41113cda31c79a Mon Sep 17 00:00:00 2001 From: Gustas <37534529+PunkPun@users.noreply.github.com> Date: Fri, 17 Feb 2023 11:06:41 +0200 Subject: [PATCH] Move force pausing to EndGame method --- OpenRA.Game/Network/UnitOrders.cs | 2 +- OpenRA.Game/Scripting/ScriptContext.cs | 7 +------ OpenRA.Game/World.cs | 9 +++++---- OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs | 8 ++------ 4 files changed, 9 insertions(+), 17 deletions(-) diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 518b0e9097..186b1d1491 100644 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -182,7 +182,7 @@ namespace OpenRA.Network var pause = order.TargetString == "Pause"; // Prevent injected unpause orders from restarting a finished game - if (orderManager.World.PauseStateLocked && !pause) + if (orderManager.World.IsGameOver && !pause) break; if (orderManager.World.Paused != pause && world != null && world.LobbyInfo.NonBotClients.Count() > 1) diff --git a/OpenRA.Game/Scripting/ScriptContext.cs b/OpenRA.Game/Scripting/ScriptContext.cs index e3ca3ddcd7..421addf371 100644 --- a/OpenRA.Game/Scripting/ScriptContext.cs +++ b/OpenRA.Game/Scripting/ScriptContext.cs @@ -223,12 +223,7 @@ namespace OpenRA.Scripting FatalErrorOccurred = true; - World.AddFrameEndTask(w => - { - World.EndGame(); - World.SetPauseState(true); - World.PauseStateLocked = true; - }); + World.AddFrameEndTask(w => World.EndGame()); } public void RegisterMapActor(string name, Actor a) diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 099549e0cb..f76b8f4ce6 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -68,15 +68,19 @@ namespace OpenRA public Player LocalPlayer { get; private set; } public event Action GameOver = () => { }; + + /// Should only be set in public bool IsGameOver { get; private set; } public void EndGame() { if (!IsGameOver) { + SetPauseState(true); IsGameOver = true; foreach (var t in WorldActor.TraitsImplementing()) t.GameOver(this); + gameInfo.FinalGameTick = WorldTick; GameOver(); } @@ -381,7 +385,6 @@ namespace OpenRA public bool Paused { get; internal set; } public bool PredictedPaused { get; internal set; } - public bool PauseStateLocked { get; set; } public int WorldTick { get; private set; } @@ -393,7 +396,7 @@ namespace OpenRA public void SetPauseState(bool paused) { - if (PauseStateLocked) + if (IsGameOver) return; IssueOrder(Order.FromTargetString("PauseGame", paused ? "Pause" : "UnPause", false)); @@ -615,8 +618,6 @@ namespace OpenRA public void OutOfSync() { EndGame(); - SetPauseState(true); - PauseStateLocked = true; } } diff --git a/OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs b/OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs index c2222ba92e..e5a8d3c4e4 100644 --- a/OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs +++ b/OpenRA.Mods.Common/Traits/Player/MissionObjectives.cs @@ -165,12 +165,8 @@ namespace OpenRA.Mods.Common.Traits { Game.RunAfterDelay(Info.GameOverDelay, () => { - if (!Game.IsCurrentWorld(player.World)) - return; - - player.World.EndGame(); - player.World.SetPauseState(true); - player.World.PauseStateLocked = true; + if (Game.IsCurrentWorld(player.World)) + player.World.EndGame(); }); } }