diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index e86d16fe1a..efaf2a2b47 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -372,20 +372,23 @@ namespace OpenRA return modData.ObjectCreator.CreateObject( name ); } - public static void CreateServer(string name, string map, int port, bool advertiseOnline, int externalPort) + public static void CreateServer(ServerSettings settings) { - server = new Server.Server(IPAddress.Any, port, name, Settings.Game.Mods, map, advertiseOnline, externalPort, modData); + server = new Server.Server(IPAddress.Any, settings.ListenPort, Game.Settings.Game.Mods, settings, modData); } public static void CreateLocalServer(string map) { + var settings = new ServerSettings() + { + Name = "Skirmish Game", + AdvertiseOnline = false, + Map = map + }; server = new Server.Server(IPAddress.Loopback, Game.Settings.Server.LoopbackPort, - "Skirmish Game", Game.Settings.Game.Mods, - map, - false, - 0, + settings, modData); } diff --git a/OpenRA.Game/GameRules/Settings.cs b/OpenRA.Game/GameRules/Settings.cs index 2e8355e68a..54a725baaa 100755 --- a/OpenRA.Game/GameRules/Settings.cs +++ b/OpenRA.Game/GameRules/Settings.cs @@ -28,7 +28,20 @@ namespace OpenRA.GameRules public bool AdvertiseOnline = true; public string MasterServer = "http://master.open-ra.org/"; public bool AllowCheats = false; - public string LastMap = null; + public string Map = null; + + public ServerSettings() { } + public ServerSettings(ServerSettings other) + { + Name = other.Name; + LoopbackPort = other.LoopbackPort; + ListenPort = other.ListenPort; + ExternalPort = other.ExternalPort; + AdvertiseOnline = other.AdvertiseOnline; + MasterServer = other.MasterServer; + AllowCheats = other.AllowCheats; + Map = other.Map; + } } public class DebugSettings diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index 394e339943..b855a147b4 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -37,13 +37,11 @@ namespace OpenRA.Server TypeDictionary ServerTraits = new TypeDictionary(); public Session lobbyInfo; public bool GameStarted = false; - public string Name; - public IPAddress Ip {get; private set;} - public int Port {get; private set;} - public int ExternalPort {get; private set;} - public bool AdvertiseOnline {get; private set;} + public readonly IPAddress Ip; + public readonly int Port; int randomSeed; + public ServerSettings Settings; public ModData ModData; public Map Map; @@ -53,25 +51,23 @@ namespace OpenRA.Server shutdown = true; } - public Server(IPAddress ip, int port, string serverName, string[] mods, string map, bool advertiseOnline, int externalPort, ModData modData) + public Server(IPAddress ip, int port, string[] mods, ServerSettings settings, ModData modData) { Log.AddChannel("server", "server.log"); + Settings = settings; Ip = ip; Port = port; - ExternalPort = externalPort; listener = new TcpListener(ip, port); - Name = serverName; randomSeed = (int)DateTime.Now.ToBinary(); ModData = modData; - AdvertiseOnline = advertiseOnline; foreach (var trait in modData.Manifest.ServerTraits) ServerTraits.Add( modData.ObjectCreator.CreateObject(trait) ); lobbyInfo = new Session( mods ); lobbyInfo.GlobalSettings.RandomSeed = randomSeed; - lobbyInfo.GlobalSettings.Map = map; - lobbyInfo.GlobalSettings.ServerName = serverName; + lobbyInfo.GlobalSettings.Map = settings.Map; + lobbyInfo.GlobalSettings.ServerName = settings.Name; foreach (var t in ServerTraits.WithInterface()) t.ServerStarted(this); diff --git a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs index 8161b8cace..9880387a43 100755 --- a/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncLobbyLogic.cs @@ -193,11 +193,11 @@ namespace OpenRA.Mods.Cnc.Widgets var onSelect = new Action(m => { orderManager.IssueOrder(Order.Command("map " + m.Uid)); - Game.Settings.Server.LastMap = m.Uid; + Game.Settings.Server.Map = m.Uid; Game.Settings.Save(); }); - Widget.OpenWindow( "MAPCHOOSER_PANEL", new WidgetArgs() + Widget.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs() { { "initialMap", Map.Uid }, { "onExit", () => {} }, diff --git a/OpenRA.Mods.Cnc/Widgets/CncServerCreationLogic.cs b/OpenRA.Mods.Cnc/Widgets/CncServerCreationLogic.cs index 163cd3820e..a878789ce0 100644 --- a/OpenRA.Mods.Cnc/Widgets/CncServerCreationLogic.cs +++ b/OpenRA.Mods.Cnc/Widgets/CncServerCreationLogic.cs @@ -13,6 +13,7 @@ using System.Net; using OpenRA.Widgets; using System; using System.Collections.Generic; +using OpenRA.GameRules; namespace OpenRA.Mods.Cnc.Widgets { @@ -38,7 +39,7 @@ namespace OpenRA.Mods.Cnc.Widgets panel.GetWidget("MAP_BUTTON").OnClick = () => { - Widget.OpenWindow( "MAPCHOOSER_PANEL", new WidgetArgs() + Widget.OpenWindow("MAPCHOOSER_PANEL", new WidgetArgs() { { "initialMap", map.Uid }, { "onExit", () => {} }, @@ -46,7 +47,7 @@ namespace OpenRA.Mods.Cnc.Widgets }); }; - if (string.IsNullOrEmpty(Game.Settings.Server.LastMap) || !Game.modData.AvailableMaps.TryGetValue(Game.Settings.Server.LastMap, out map)) + if (string.IsNullOrEmpty(Game.Settings.Server.Map) || !Game.modData.AvailableMaps.TryGetValue(Game.Settings.Server.Map, out map)) map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Value; panel.GetWidget("MAP_PREVIEW").Map = () => map; @@ -84,11 +85,14 @@ namespace OpenRA.Mods.Cnc.Widgets Game.Settings.Server.ListenPort = listenPort; Game.Settings.Server.ExternalPort = externalPort; Game.Settings.Server.AdvertiseOnline = advertiseOnline; - Game.Settings.Server.LastMap = map.Uid; + Game.Settings.Server.Map = map.Uid; Game.Settings.Save(); + + // Take a copy so that subsequent changes don't affect the server + var settings = new ServerSettings(Game.Settings.Server); // Create and join the server - Game.CreateServer(name, map.Uid, listenPort, advertiseOnline, externalPort); + Game.CreateServer(settings); Widget.CloseWindow(); CncConnectingLogic.Connect(IPAddress.Loopback.ToString(), Game.Settings.Server.ListenPort, onCreate, onExit); } diff --git a/OpenRA.Mods.RA/ServerTraits/MasterServerPinger.cs b/OpenRA.Mods.RA/ServerTraits/MasterServerPinger.cs index 1ef40be7c5..01ac0a9325 100644 --- a/OpenRA.Mods.RA/ServerTraits/MasterServerPinger.cs +++ b/OpenRA.Mods.RA/ServerTraits/MasterServerPinger.cs @@ -44,7 +44,7 @@ namespace OpenRA.Mods.RA.Server Queue masterServerMessages = new Queue(); public void PingMasterServer(S server) { - if (isBusy || !server.AdvertiseOnline) return; + if (isBusy || !server.Settings.AdvertiseOnline) return; lastPing = Environment.TickCount; isBusy = true; @@ -60,8 +60,8 @@ namespace OpenRA.Mods.RA.Server { wc.Proxy = null; wc.DownloadData( - Game.Settings.Server.MasterServer + url.F( - server.ExternalPort, Uri.EscapeUriString(server.Name), + server.Settings.MasterServer + url.F( + server.Settings.ExternalPort, Uri.EscapeUriString(server.Settings.Name), server.GameStarted ? 2 : 1, // todo: post-game states, etc. server.lobbyInfo.Clients.Count, string.Join(",", Game.CurrentMods.Select(f => "{0}@{1}".F(f.Key, f.Value.Version)).ToArray()), diff --git a/OpenRA.Mods.RA/Widgets/Delegates/CreateServerMenuDelegate.cs b/OpenRA.Mods.RA/Widgets/Delegates/CreateServerMenuDelegate.cs index 1f2a9dde82..e90293e8e4 100644 --- a/OpenRA.Mods.RA/Widgets/Delegates/CreateServerMenuDelegate.cs +++ b/OpenRA.Mods.RA/Widgets/Delegates/CreateServerMenuDelegate.cs @@ -11,6 +11,7 @@ using System.Linq; using System.Net; using OpenRA.Widgets; +using OpenRA.GameRules; namespace OpenRA.Mods.RA.Widgets.Delegates { @@ -27,14 +28,14 @@ namespace OpenRA.Mods.RA.Widgets.Delegates }; cs.GetWidget("BUTTON_START").OnMouseUp = mi => { - var map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Key; - settings.Server.Name = cs.GetWidget("GAME_TITLE").Text; settings.Server.ListenPort = int.Parse(cs.GetWidget("LISTEN_PORT").Text); settings.Server.ExternalPort = int.Parse(cs.GetWidget("EXTERNAL_PORT").Text); + settings.Server.Map = Game.modData.AvailableMaps.FirstOrDefault(m => m.Value.Selectable).Key; settings.Save(); - Game.CreateServer(settings.Server.Name, map,settings.Server.ListenPort, settings.Server.AdvertiseOnline, settings.Server.ExternalPort); + // Take a copy so that subsequent settings changes don't affect the server + Game.CreateServer(new ServerSettings(Game.Settings.Server)); Game.JoinServer(IPAddress.Loopback.ToString(), settings.Server.ListenPort); return true; };