diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 9326aacfa2..a312b58150 100644 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -55,25 +55,18 @@ namespace OpenRA viewport.Center(loc); } - internal static string CurrentHost = ""; - internal static int CurrentPort = 0; - internal static void JoinServer(string host, int port) { if (orderManager != null) orderManager.Dispose(); - CurrentHost = host; - CurrentPort = port; - - lastConnectionState = ConnectionState.PreConnecting; - ConnectionStateChanged(); - var replayFilename = ChooseReplayFilename(); string path = Path.Combine( Game.SupportDir, "Replays" ); if( !Directory.Exists( path ) ) Directory.CreateDirectory( path ); var replayFile = File.Create( Path.Combine( path, replayFilename ) ); - orderManager = new OrderManager( new ReplayRecorderConnection( new NetworkConnection( host, port ), replayFile ) ); + orderManager = new OrderManager( host, port, new ReplayRecorderConnection( new NetworkConnection( host, port ), replayFile ) ); + lastConnectionState = ConnectionState.PreConnecting; + ConnectionStateChanged(orderManager); } static string ChooseReplayFilename() @@ -83,11 +76,10 @@ namespace OpenRA static void JoinLocal() { - lastConnectionState = ConnectionState.PreConnecting; - ConnectionStateChanged(); - if (orderManager != null) orderManager.Dispose(); - orderManager = new OrderManager(new EchoConnection()); + orderManager = new OrderManager("", -1, new EchoConnection()); + lastConnectionState = ConnectionState.PreConnecting; + ConnectionStateChanged( orderManager ); } static int lastTime = Environment.TickCount; @@ -101,7 +93,7 @@ namespace OpenRA internal static int LocalTick = 0; const int NetTickScale = 3; // 120ms net tick for 40ms local tick - public static event Action ConnectionStateChanged = () => { }; + internal static event Action ConnectionStateChanged = _ => { }; static ConnectionState lastConnectionState = ConnectionState.PreConnecting; public static int LocalClientId { get { return orderManager.Connection.LocalClientId; } } @@ -110,7 +102,7 @@ namespace OpenRA if (orderManager.Connection.ConnectionState != lastConnectionState) { lastConnectionState = orderManager.Connection.ConnectionState; - ConnectionStateChanged(); + ConnectionStateChanged( orderManager ); } int t = Environment.TickCount; @@ -272,19 +264,21 @@ namespace OpenRA Game.AfterGameStart += world => Widget.OpenWindow("INGAME_ROOT", new Dictionary{{"world", world}}); - Game.ConnectionStateChanged += () => + Game.ConnectionStateChanged += orderManager => { Widget.CloseWindow(); - switch( Game.orderManager.Connection.ConnectionState ) + switch( orderManager.Connection.ConnectionState ) { case ConnectionState.PreConnecting: Widget.OpenWindow("MAINMENU_BG"); break; case ConnectionState.Connecting: - Widget.OpenWindow("CONNECTING_BG"); + Widget.OpenWindow( "CONNECTING_BG", + new Dictionary { { "host", orderManager.Host }, { "port", orderManager.Port } } ); break; case ConnectionState.NotConnected: - Widget.OpenWindow("CONNECTION_FAILED_BG"); + Widget.OpenWindow( "CONNECTION_FAILED_BG", + new Dictionary { { "host", orderManager.Host }, { "port", orderManager.Port } } ); break; case ConnectionState.Connected: var lobby = Widget.OpenWindow( "SERVER_LOBBY", new Dictionary { { "orderManager", orderManager } } ); diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index b375848919..59ab89dcfd 100755 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -24,6 +24,9 @@ namespace OpenRA.Network public Session LobbyInfo = new Session( Game.Settings.Game.Mods ); public Session.Client LocalClient { get { return LobbyInfo.ClientWithIndex( Connection.LocalClientId ); } } + public readonly string Host; + public readonly int Port; + public int FrameNumber { get; private set; } public int FramesAhead = 0; @@ -43,8 +46,10 @@ namespace OpenRA.Network Connection.Send( new List().Serialize( i ) ); } - public OrderManager( IConnection conn ) + public OrderManager( string host, int port, IConnection conn ) { + this.Host = host; + this.Port = port; Connection = conn; } diff --git a/OpenRA.Game/Widgets/Delegates/ConnectionDialogsDelegate.cs b/OpenRA.Game/Widgets/Delegates/ConnectionDialogsDelegate.cs index 3631bf48c3..3fa38332e8 100644 --- a/OpenRA.Game/Widgets/Delegates/ConnectionDialogsDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/ConnectionDialogsDelegate.cs @@ -15,7 +15,10 @@ namespace OpenRA.Widgets.Delegates public class ConnectionDialogsDelegate : IWidgetDelegate { [ObjectCreator.UseCtor] - public ConnectionDialogsDelegate( [ObjectCreator.Param] Widget widget ) + public ConnectionDialogsDelegate( + [ObjectCreator.Param] Widget widget, + [ObjectCreator.Param] string host, + [ObjectCreator.Param] int port ) { widget.GetWidget("CONNECTION_BUTTON_ABORT").OnMouseUp = mi => { widget.GetWidget("CONNECTION_BUTTON_ABORT").Parent.Visible = false; @@ -24,14 +27,17 @@ namespace OpenRA.Widgets.Delegates }; widget.GetWidget("CONNECTING_DESC").GetText = () => - "Connecting to {0}:{1}...".F(Game.CurrentHost, Game.CurrentPort); + "Connecting to {0}:{1}...".F(host, port); } } public class ConnectionFailedDelegate : IWidgetDelegate { [ObjectCreator.UseCtor] - public ConnectionFailedDelegate( [ObjectCreator.Param] Widget widget ) + public ConnectionFailedDelegate( + [ObjectCreator.Param] Widget widget, + [ObjectCreator.Param] string host, + [ObjectCreator.Param] int port ) { widget.GetWidget("CONNECTION_BUTTON_CANCEL").OnMouseUp = mi => { widget.GetWidget("CONNECTION_BUTTON_CANCEL").Parent.Visible = false; @@ -39,12 +45,12 @@ namespace OpenRA.Widgets.Delegates return true; }; widget.GetWidget("CONNECTION_BUTTON_RETRY").OnMouseUp = mi => { - Game.JoinServer(Game.CurrentHost, Game.CurrentPort); + Game.JoinServer(host, port); return true; }; widget.GetWidget("CONNECTION_FAILED_DESC").GetText = () => - "Could not connect to {0}:{1}".F(Game.CurrentHost, Game.CurrentPort); + "Could not connect to {0}:{1}".F(host, port); } } } diff --git a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs index 00939438fc..390811fddc 100755 --- a/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs +++ b/OpenRA.Game/Widgets/Delegates/LobbyDelegate.cs @@ -199,10 +199,10 @@ namespace OpenRA.Widgets.Delegates if (orderManager.LocalClient.Color1 != c1 || orderManager.LocalClient.Color2 != c2) Game.IssueOrder(Order.Command("color {0},{1},{2},{3},{4},{5}".F(c1.R,c1.G,c1.B,c2.R,c2.G,c2.B))); } - - void ResetConnectionState() + + void ResetConnectionState( OrderManager orderManager ) { - if (Game.orderManager.Connection.ConnectionState == ConnectionState.PreConnecting) + if( orderManager.Connection.ConnectionState == ConnectionState.PreConnecting ) hasJoined = false; }