diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index deed94a085..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; @@ -188,6 +188,8 @@ namespace OpenRA else if (orderManager.NetFrameNumber == 0) orderManager.LastTickTime = Environment.TickCount; + + viewport.Tick(); } } } 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..a7e1d9c730 100755 --- a/OpenRA.Game/Network/UnitOrders.cs +++ b/OpenRA.Game/Network/UnitOrders.cs @@ -94,6 +94,19 @@ namespace OpenRA.Network Game.StartGame(orderManager.LobbyInfo.GlobalSettings.Map, false); break; } + + case "PauseGame": + { + var client = orderManager.LobbyInfo.ClientWithIndex(clientId); + + if(client != null) + { + orderManager.GamePaused = !orderManager.GamePaused; + var pausetext = "The game is {0} by {1}".F( orderManager.GamePaused ? "paused" : "un-paused", client.Name ); + Game.AddChatLine(Color.White, "", pausetext); + } + break; + } case "HandshakeRequest": { diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index cae7be0f56..6af0357e56 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -348,6 +348,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": @@ -363,17 +366,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/TimerWidget.cs b/OpenRA.Game/Widgets/TimerWidget.cs index 420352d896..b2f5bfb2ba 100644 --- a/OpenRA.Game/Widgets/TimerWidget.cs +++ b/OpenRA.Game/Widgets/TimerWidget.cs @@ -16,11 +16,11 @@ namespace OpenRA.Widgets { public override void Draw() { - var s = WidgetUtils.FormatTime(Game.LocalTick); var font = Game.Renderer.Fonts["Title"]; var rb = RenderBounds; + + var s = WidgetUtils.FormatTime(Game.LocalTick) + (Game.orderManager.GamePaused?" (paused)":""); var pos = new float2(rb.Left - font.Measure(s).X / 2, rb.Top); - font.DrawTextWithContrast(s, pos, Color.White, Color.Black, 1); } } diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index accef80e75..29721ccaa2 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" || e.KeyName == "f3") + { + world.IssueOrder(Order.PauseRequest()); + } bool handled = false; diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index e2ec53704c..e4c6dc4b50 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -183,7 +183,7 @@ namespace OpenRA while (frameEndActions.Count != 0) frameEndActions.Dequeue()(this); - Game.viewport.Tick(); + } public IEnumerable Actors { get { return actors; } }