diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs index 1c2dc82131..ce5f282653 100755 --- a/OpenRA.Game/Game.cs +++ b/OpenRA.Game/Game.cs @@ -265,19 +265,27 @@ namespace OpenRA Log.AddChannel("sync", "syncreport.log"); Log.AddChannel("server", "server.log"); - try + if (Settings.Server.DiscoverNatDevices) { - NatUtility.Logger = Log.Channels["server"].Writer; - NatUtility.Verbose = Settings.Server.VerboseNatDiscovery; - NatUtility.DeviceFound += DeviceFound; - NatUtility.DeviceLost += DeviceLost; - Settings.Server.NatDeviceAvailable = false; - NatUtility.StartDiscovery(); - Log.Write("server", "NAT discovery started."); + try + { + NatUtility.Logger = Log.Channels["server"].Writer; + NatUtility.Verbose = Settings.Server.VerboseNatDiscovery; + NatUtility.DeviceFound += DeviceFound; + NatUtility.DeviceLost += DeviceLost; + Settings.Server.NatDeviceAvailable = false; + NatUtility.StartDiscovery(); + Log.Write("server", "NAT discovery started."); + } + catch (Exception e) + { + Log.Write("server", "Can't discover UPnP-enabled device: {0}", e); + Settings.Server.NatDeviceAvailable = false; + Settings.Server.AllowUPnP = false; + } } - catch (Exception e) + else { - Log.Write("server", "Can't discover UPnP-enabled device: {0}", e); Settings.Server.NatDeviceAvailable = false; Settings.Server.AllowUPnP = false; } @@ -293,32 +301,38 @@ namespace OpenRA Sound.Create(Settings.Sound.Engine); InitializeWithMods(Settings.Game.Mods); - RunAfterDelay(Settings.Server.NatDiscoveryTimeout, () => + if (Settings.Server.DiscoverNatDevices) { - Log.Write("server", "Stopping NAT discovery."); + RunAfterDelay(Settings.Server.NatDiscoveryTimeout, () => + { + Log.Write("server", "Stopping NAT discovery."); - try - { - NatUtility.StopDiscovery(); - } - catch (Exception e) - { - Log.Write("server", "Failed to stop NAT device discovery: {0}", e); - Settings.Server.NatDeviceAvailable = false; - Settings.Server.AllowUPnP = false; - } + try + { + NatUtility.StopDiscovery(); + } + catch (Exception e) + { + Log.Write("server", "Failed to stop NAT device discovery: {0}", e); + Settings.Server.NatDeviceAvailable = false; + Settings.Server.AllowUPnP = false; + } - if (natDevice == null) - { - Log.Write("server", "No NAT devices with UPnP enabled found within {0} ms deadline. Disabling automatic port forwarding.".F(Settings.Server.NatDiscoveryTimeout)); - Settings.Server.NatDeviceAvailable = false; - Settings.Server.AllowUPnP = false; - } - }); + if (natDevice == null) + { + Log.Write("server", "No NAT devices with UPnP enabled found within {0} ms deadline. Disabling automatic port forwarding.".F(Settings.Server.NatDiscoveryTimeout)); + Settings.Server.NatDeviceAvailable = false; + Settings.Server.AllowUPnP = false; + } + }); + } } public static void DeviceFound(object sender, DeviceEventArgs args) { + if (args.Device == null) + return; + Log.Write("server", "NAT device discovered."); Settings.Server.NatDeviceAvailable = true; @@ -347,6 +361,9 @@ namespace OpenRA { Log.Write("server", "NAT device lost."); + if (args.Device == null) + return; + try { natDevice = args.Device; diff --git a/OpenRA.Game/GameRules/Settings.cs b/OpenRA.Game/GameRules/Settings.cs index de52bbdb12..77b2d638b4 100644 --- a/OpenRA.Game/GameRules/Settings.cs +++ b/OpenRA.Game/GameRules/Settings.cs @@ -29,7 +29,8 @@ namespace OpenRA.GameRules public int ExternalPort = 1234; public bool AdvertiseOnline = true; public string MasterServer = "http://master.open-ra.org/"; - public bool AllowUPnP = true; // let the user disable it + public bool DiscoverNatDevices = true; // Allow users to disable NAT discovery if problems occur + public bool AllowUPnP = true; // let the user disable it even if compatible devices are found public bool NatDeviceAvailable = false; // internal check if discovery succeeded public int NatDiscoveryTimeout = 1000; // ms to search for UPnP enabled NATs public bool VerboseNatDiscovery = false; // print very detailed logs for debugging @@ -51,6 +52,7 @@ namespace OpenRA.GameRules ExternalPort = other.ExternalPort; AdvertiseOnline = other.AdvertiseOnline; MasterServer = other.MasterServer; + DiscoverNatDevices = other.DiscoverNatDevices; AllowUPnP = other.AllowUPnP; NatDeviceAvailable = other.NatDeviceAvailable; NatDiscoveryTimeout = other.NatDiscoveryTimeout;