From a07697be035330bb1bec9ebaff2d00e4e399e8b4 Mon Sep 17 00:00:00 2001 From: Remco van der Zon Date: Wed, 16 May 2012 17:35:10 +0200 Subject: [PATCH] Pause the game option. Game is paused when PAUSE on the keyboard has been hit. It can also be unpaused this way. --- OpenRA.Game/Game.cs | 2 +- OpenRA.Game/Network/Order.cs | 11 +++++++++++ OpenRA.Game/Network/OrderManager.cs | 1 + OpenRA.Game/Network/UnitOrders.cs | 6 ++++++ OpenRA.Game/Server/Server.cs | 17 +++++++++++++---- .../Widgets/WorldInteractionControllerWidget.cs | 4 ++++ 6 files changed, 36 insertions(+), 5 deletions(-) diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 4df9808aa5..41638ce1b4 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -166,7 +166,7 @@ namespace OpenRA { var isNetTick = LocalTick % NetTickScale == 0; - if (!isNetTick || orderManager.IsReadyForNextFrame) + if ((!isNetTick || orderManager.IsReadyForNextFrame) && !orderManager.GamePaused ) { ++orderManager.LocalFrameNumber; diff --git a/OpenRA.Game/Network/Order.cs b/OpenRA.Game/Network/Order.cs index b81a9f2731..7f2bb449b7 100755 --- a/OpenRA.Game/Network/Order.cs +++ b/OpenRA.Game/Network/Order.cs @@ -199,7 +199,18 @@ namespace OpenRA { return new Order("HandshakeResponse", null, false) { IsImmediate = true, TargetString = text }; } + + public static Order PauseRequest() + { + return new Order("PauseRequest", null, false) { IsImmediate = true, TargetString="" }; //TODO: targetbool? + } + + public static Order PauseGame() + { + return new Order("PauseGame", null, false) { IsImmediate = true, TargetString=""}; //TODO: targetbool? + } + public static Order Command(string text) { return new Order("Command", null, false) { IsImmediate = true, TargetString = text }; diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index 708caf08fd..8d16467ad1 100755 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -36,6 +36,7 @@ namespace OpenRA.Network public int LastTickTime = Environment.TickCount; public bool GameStarted { get { return NetFrameNumber != 0; } } + public bool GamePaused {get; set;} public IConnection Connection { get; private set; } public readonly int SyncHeaderSize = 9; diff --git a/OpenRA.Game/Network/UnitOrders.cs b/OpenRA.Game/Network/UnitOrders.cs index 92f3fb3e93..36c18f1eab 100755 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -94,6 +94,12 @@ namespace OpenRA.Network Game.StartGame(orderManager.LobbyInfo.GlobalSettings.Map, false); break; } + + case "PauseGame": + { + orderManager.GamePaused = !orderManager.GamePaused; + break; + } case "HandshakeRequest": { diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index e50101bb5b..c5cd929119 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -332,6 +332,9 @@ namespace OpenRA.Server void InterpretServerOrder(Connection conn, ServerOrder so) { + var fromClient = GetClient(conn); + var fromIndex = fromClient != null ? fromClient.Index : 0; + switch (so.Name) { case "Command": @@ -347,17 +350,23 @@ namespace OpenRA.Server } break; + case "HandshakeResponse": ValidateClient(conn, so.Data); break; + case "Chat": case "TeamChat": - var fromClient = GetClient(conn); - var fromIndex = fromClient != null ? fromClient.Index : 0; - foreach (var c in conns.Except(conn).ToArray()) DispatchOrdersToClient(c, fromIndex, 0, so.Serialize()); - break; + break; + + case "PauseRequest": + foreach (var c in conns.ToArray()) + { var x = Order.PauseGame(); + DispatchOrdersToClient(c, fromIndex, 0, x.Serialize()); + } + break; } } diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index accef80e75..bcdc813434 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -148,6 +148,10 @@ namespace OpenRA.Widgets world.Selection.DoControlGroup(world, e.KeyName[0] - '0', e.Modifiers); return true; } + else if(e.KeyName == "pause") + { + world.IssueOrder(Order.PauseRequest()); + } bool handled = false;