diff --git a/OpenRA.Game/Network/Session.cs b/OpenRA.Game/Network/Session.cs index 184a1ea775..8e5ad45553 100644 --- a/OpenRA.Game/Network/Session.cs +++ b/OpenRA.Game/Network/Session.cs @@ -76,6 +76,11 @@ namespace OpenRA.Network return Slots.FirstOrDefault(s => !s.Value.Closed && ClientInSlot(s.Key) == null).Key; } + public string FirstEmptyBotSlot() + { + return Slots.FirstOrDefault(s => !s.Value.Closed && ClientInSlot(s.Key) == null && s.Value.AllowBots).Key; + } + public bool IsSinglePlayer { get { return Clients.Count(c => c.Bot == null) == 1; } diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index 6036605dca..9f965d01ba 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -448,7 +448,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic var disconnectButton = lobby.Get("DISCONNECT_BUTTON"); disconnectButton.OnClick = () => { CloseWindow(); onExit(); }; - if (this.skirmishMode) + if (skirmishMode) disconnectButton.Text = "Cancel"; bool teamChat = false; @@ -489,16 +489,19 @@ namespace OpenRA.Mods.RA.Widgets.Logic { "worldRenderer", worldRenderer } }); } + // Add a bot on the first lobbyinfo update - if (this.skirmishMode) + if (skirmishMode) + { Game.LobbyInfoChanged += WidgetUtils.Once(() => { - var slot = orderManager.LobbyInfo.FirstEmptySlot(); + var slot = orderManager.LobbyInfo.FirstEmptyBotSlot(); var bot = Rules.Info["player"].Traits.WithInterface().Select(t => t.Name).FirstOrDefault(); var botController = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.IsAdmin); if (slot != null && bot != null) orderManager.IssueOrder(Order.Command("slot_bot {0} {1} {2}".F(slot, botController.Index, bot))); }); + } } void AddChatLine(Color c, string from, string text) @@ -683,8 +686,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic spec = newSpectatorTemplate.Clone(); LobbyUtils.SetupKickSpectatorsWidget(spec, orderManager, lobby, - () => panel = PanelType.Kick, () => panel = PanelType.Players, this.skirmishMode); - + () => panel = PanelType.Kick, () => panel = PanelType.Players, skirmishMode); + var btn = spec.Get("SPECTATE"); btn.OnClick = () => orderManager.IssueOrder(Order.Command("spectate")); btn.IsDisabled = () => orderManager.LocalClient.IsReady;