diff --git a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
index f2aeefea5f..1e2f11951a 100644
--- a/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
+++ b/OpenRA.Mods.RA/OpenRA.Mods.RA.csproj
@@ -485,6 +485,7 @@
+
diff --git a/OpenRA.Mods.RA/Widgets/Logic/ConnectionLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/ConnectionLogic.cs
index 255d05ea61..89b4c91bae 100644
--- a/OpenRA.Mods.RA/Widgets/Logic/ConnectionLogic.cs
+++ b/OpenRA.Mods.RA/Widgets/Logic/ConnectionLogic.cs
@@ -88,7 +88,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic
var abortButton = panel.Get("ABORT_BUTTON");
var retryButton = panel.Get("RETRY_BUTTON");
+ abortButton.Visible = onAbort != null;
abortButton.OnClick = () => { Ui.CloseWindow(); onAbort(); };
+
+ retryButton.Visible = onRetry != null;
retryButton.OnClick = () =>
{
var password = passwordField != null && passwordField.IsVisible() ? passwordField.Text : orderManager.Password;
diff --git a/OpenRA.Mods.RA/Widgets/Logic/DisconnectWatcherLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/DisconnectWatcherLogic.cs
new file mode 100644
index 0000000000..dc780ee678
--- /dev/null
+++ b/OpenRA.Mods.RA/Widgets/Logic/DisconnectWatcherLogic.cs
@@ -0,0 +1,41 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see COPYING.
+ */
+#endregion
+
+using OpenRA.Network;
+using OpenRA.Widgets;
+
+namespace OpenRA.Mods.RA.Widgets.Logic
+{
+ public class DisconnectWatcherLogic
+ {
+ [ObjectCreator.UseCtor]
+ public DisconnectWatcherLogic(Widget widget, OrderManager orderManager)
+ {
+ var disconnected = false;
+ widget.Get("DISCONNECT_WATCHER").OnTick = () =>
+ {
+ if (!disconnected && orderManager.Connection.ConnectionState == ConnectionState.NotConnected)
+ {
+ Game.RunAfterTick(() =>
+ {
+ Ui.OpenWindow("CONNECTIONFAILED_PANEL", new WidgetArgs()
+ {
+ { "orderManager", orderManager },
+ { "onAbort", null },
+ { "onRetry", null }
+ });
+ });
+
+ disconnected = true;
+ }
+ };
+ }
+ }
+}
diff --git a/mods/cnc/chrome/ingame.yaml b/mods/cnc/chrome/ingame.yaml
index fa94cd273f..3e6182850b 100644
--- a/mods/cnc/chrome/ingame.yaml
+++ b/mods/cnc/chrome/ingame.yaml
@@ -1,6 +1,8 @@
Container@INGAME_ROOT:
Logic:CncIngameChromeLogic
Children:
+ LogicTicker@DISCONNECT_WATCHER:
+ Logic:DisconnectWatcherLogic
Timer@GAME_TIMER:
X: WINDOW_RIGHT/2
Y: 0
diff --git a/mods/d2k/chrome/ingame.yaml b/mods/d2k/chrome/ingame.yaml
index d7a96bad48..177cce6a79 100644
--- a/mods/d2k/chrome/ingame.yaml
+++ b/mods/d2k/chrome/ingame.yaml
@@ -1,6 +1,8 @@
Container@INGAME_ROOT:
Logic:IngameChromeLogic
Children:
+ LogicTicker@DISCONNECT_WATCHER:
+ Logic:DisconnectWatcherLogic
WorldInteractionController@INTERACTION_CONTROLLER:
X:0
Y:0
diff --git a/mods/ra/chrome/ingame.yaml b/mods/ra/chrome/ingame.yaml
index 233cb833ea..2700640889 100644
--- a/mods/ra/chrome/ingame.yaml
+++ b/mods/ra/chrome/ingame.yaml
@@ -1,6 +1,8 @@
Container@INGAME_ROOT:
Logic:IngameChromeLogic
Children:
+ LogicTicker@DISCONNECT_WATCHER:
+ Logic:DisconnectWatcherLogic
WorldInteractionController@INTERACTION_CONTROLLER:
X:0
Y:0