diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index e452f09a07..a9601b338b 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -196,6 +196,7 @@ namespace OpenRA.Network public bool ShortGame = true; public bool AllowVersionMismatch; public string GameUid; + public bool DisableSingleplayer; public static Global Deserialize(MiniYaml data) { diff --git a/OpenRA.Game/Server/Server.cs b/OpenRA.Game/Server/Server.cs index cc7640f373..fca8bc6b1c 100644 --- a/OpenRA.Game/Server/Server.cs +++ b/OpenRA.Game/Server/Server.cs @@ -148,7 +148,8 @@ namespace OpenRA.Server RandomSeed = randomSeed, Map = settings.Map, ServerName = settings.Name, - Dedicated = settings.Dedicated + Dedicated = settings.Dedicated, + DisableSingleplayer = settings.DisableSinglePlayer, } }; @@ -395,8 +396,8 @@ namespace OpenRA.Server if (Map.RuleDefinitions.Any() && !LobbyInfo.IsSinglePlayer) SendOrderTo(newConn, "Message", "This map contains custom rules. Game experience may change."); - if (Settings.LockBots) - SendOrderTo(newConn, "Message", "Bots have been disabled on this server."); + if (Settings.DisableSinglePlayer) + SendOrderTo(newConn, "Message", "Singleplayer games have been disabled on this server."); else if (MapPlayers.Players.Where(p => p.Value.Playable).All(p => !p.Value.AllowBots)) SendOrderTo(newConn, "Message", "Bots have been disabled on this map."); diff --git a/OpenRA.Game/Settings.cs b/OpenRA.Game/Settings.cs index 7a46459fd9..57b18c896b 100644 --- a/OpenRA.Game/Settings.cs +++ b/OpenRA.Game/Settings.cs @@ -70,8 +70,8 @@ namespace OpenRA [Desc("Automatically restart when a game ends. Disable this when something else already takes care about it.")] public bool DedicatedLoop = true; - [Desc("Disallow AI bots.")] - public bool LockBots = false; + [Desc("Disallow games where only one player plays with bots.")] + public bool DisableSinglePlayer = false; public string TimestampFormat = "s"; diff --git a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs index 86dc76dfb8..065ee7a850 100644 --- a/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs +++ b/OpenRA.Mods.Common/ServerTraits/LobbyCommands.cs @@ -67,6 +67,10 @@ namespace OpenRA.Mods.Common.Server if (server.LobbyInfo.Slots.Any(sl => sl.Value.Required && server.LobbyInfo.ClientInSlot(sl.Key) == null)) return; + // Does server have only one player? + if (server.Settings.DisableSinglePlayer && playerClients.Count() == 1) + return; + server.StartGame(); } @@ -115,6 +119,13 @@ namespace OpenRA.Mods.Common.Server return true; } + if (server.Settings.DisableSinglePlayer && + server.LobbyInfo.Clients.Where(c => c.Bot == null && c.Slot != null).Count() == 1) + { + server.SendOrderTo(conn, "Message", "Unable to start the game until another player joins."); + return true; + } + server.StartGame(); return true; } @@ -373,8 +384,8 @@ namespace OpenRA.Mods.Common.Server if (server.Map.RuleDefinitions.Any()) server.SendMessage("This map contains custom rules. Game experience may change."); - if (server.Settings.LockBots) - server.SendMessage("Bots have been disabled on this server."); + if (server.Settings.DisableSinglePlayer) + server.SendMessage("Singleplayer games have been disabled on this server."); else if (server.MapPlayers.Players.Where(p => p.Value.Playable).All(p => !p.Value.AllowBots)) server.SendMessage("Bots have been disabled on this map."); @@ -923,8 +934,6 @@ namespace OpenRA.Mods.Common.Server static Session.Slot MakeSlotFromPlayerReference(PlayerReference pr) { if (!pr.Playable) return null; - if (Game.Settings.Server.LockBots) - pr.AllowBots = false; return new Session.Slot { PlayerReference = pr.Name, diff --git a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs index 20061830f4..65f40d5e5c 100644 --- a/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs +++ b/OpenRA.Mods.Common/Widgets/Logic/Lobby/LobbyLogic.cs @@ -318,7 +318,8 @@ namespace OpenRA.Mods.Common.Widgets.Logic if (startGameButton != null) { startGameButton.IsDisabled = () => configurationDisabled() || Map.RuleStatus != MapRuleStatus.Cached || - orderManager.LobbyInfo.Slots.Any(sl => sl.Value.Required && orderManager.LobbyInfo.ClientInSlot(sl.Key) == null); + orderManager.LobbyInfo.Slots.Any(sl => sl.Value.Required && orderManager.LobbyInfo.ClientInSlot(sl.Key) == null) || + (orderManager.LobbyInfo.GlobalSettings.DisableSingleplayer && orderManager.LobbyInfo.IsSinglePlayer); startGameButton.OnClick = () => { // Bots and admins don't count