Skirmish mode starts with a bot selected.
This commit is contained in:
@@ -31,6 +31,12 @@ namespace OpenRA.Network
|
|||||||
return Clients.SingleOrDefault(c => c.Slot == slot.Index);
|
return Clients.SingleOrDefault(c => c.Slot == slot.Index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int FirstEmptySlot()
|
||||||
|
{
|
||||||
|
return Slots.First(s => !s.Closed && ClientInSlot(s) == null
|
||||||
|
&& s.Bot == null).Index;
|
||||||
|
}
|
||||||
|
|
||||||
public enum ClientState
|
public enum ClientState
|
||||||
{
|
{
|
||||||
NotReady,
|
NotReady,
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ namespace OpenRA.Server
|
|||||||
|
|
||||||
// Enforce correct PlayerIndex and Slot
|
// Enforce correct PlayerIndex and Slot
|
||||||
client.Index = newConn.PlayerIndex;
|
client.Index = newConn.PlayerIndex;
|
||||||
client.Slot = ChooseFreeSlot();
|
client.Slot = lobbyInfo.FirstEmptySlot();
|
||||||
|
|
||||||
var slotData = lobbyInfo.Slots.FirstOrDefault( x => x.Index == client.Slot );
|
var slotData = lobbyInfo.Slots.FirstOrDefault( x => x.Index == client.Slot );
|
||||||
if (slotData != null && slotData.MapPlayer != null)
|
if (slotData != null && slotData.MapPlayer != null)
|
||||||
@@ -236,13 +236,6 @@ namespace OpenRA.Server
|
|||||||
catch (Exception) { DropClient(newConn); }
|
catch (Exception) { DropClient(newConn); }
|
||||||
}
|
}
|
||||||
|
|
||||||
int ChooseFreeSlot()
|
|
||||||
{
|
|
||||||
return lobbyInfo.Slots.First(s => !s.Closed && s.Bot == null
|
|
||||||
&& !lobbyInfo.Clients.Any( c => c.Slot == s.Index )).Index;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static void SyncClientToPlayerReference(Session.Client c, PlayerReference pr)
|
public static void SyncClientToPlayerReference(Session.Client c, PlayerReference pr)
|
||||||
{
|
{
|
||||||
if (pr == null)
|
if (pr == null)
|
||||||
|
|||||||
@@ -199,6 +199,8 @@ namespace OpenRA.Widgets
|
|||||||
}
|
}
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Action Once( Action a ) { return () => { if (a != null) { a(); a = null; } }; }
|
||||||
}
|
}
|
||||||
|
|
||||||
[Flags]
|
[Flags]
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
Game.OpenWindow("SERVER_LOBBY", new WidgetArgs()
|
Game.OpenWindow("SERVER_LOBBY", new WidgetArgs()
|
||||||
{
|
{
|
||||||
{ "onExit", onExit },
|
{ "onExit", onExit },
|
||||||
{ "onStart", OnGameStart }
|
{ "onStart", OnGameStart },
|
||||||
|
{ "addBots", false }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -86,7 +87,8 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
[ObjectCreator.Param] World world, // Shellmap world
|
[ObjectCreator.Param] World world, // Shellmap world
|
||||||
[ObjectCreator.Param] OrderManager orderManager,
|
[ObjectCreator.Param] OrderManager orderManager,
|
||||||
[ObjectCreator.Param] Action onExit,
|
[ObjectCreator.Param] Action onExit,
|
||||||
[ObjectCreator.Param] Action onStart)
|
[ObjectCreator.Param] Action onStart,
|
||||||
|
[ObjectCreator.Param] bool addBots)
|
||||||
{
|
{
|
||||||
this.orderManager = orderManager;
|
this.orderManager = orderManager;
|
||||||
this.OnGameStart = () => { CloseWindow(); onStart(); };
|
this.OnGameStart = () => { CloseWindow(); onStart(); };
|
||||||
@@ -222,6 +224,16 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
{ "onExit", () => {} },
|
{ "onExit", () => {} },
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Add a bot on the first lobbyinfo update
|
||||||
|
if (addBots)
|
||||||
|
Game.LobbyInfoChanged += WidgetUtils.Once(() =>
|
||||||
|
{
|
||||||
|
var slot = orderManager.LobbyInfo.FirstEmptySlot();
|
||||||
|
var bot = Rules.Info["player"].Traits.WithInterface<IBotInfo>().Select(t => t.Name).FirstOrDefault();
|
||||||
|
if (bot != null)
|
||||||
|
orderManager.IssueOrder(Order.Command("slot_bot {0} {1}".F(slot, bot)));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddChatLine(Color c, string from, string text)
|
public void AddChatLine(Color c, string from, string text)
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
Widget.OpenWindow("SERVERBROWSER_PANEL", new WidgetArgs()
|
Widget.OpenWindow("SERVERBROWSER_PANEL", new WidgetArgs()
|
||||||
{
|
{
|
||||||
{ "onExit", () => Menu = MenuType.Multiplayer },
|
{ "onExit", () => Menu = MenuType.Multiplayer },
|
||||||
{ "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer) }
|
{ "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer, false) }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -78,7 +78,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
Widget.OpenWindow("CREATESERVER_PANEL", new WidgetArgs()
|
Widget.OpenWindow("CREATESERVER_PANEL", new WidgetArgs()
|
||||||
{
|
{
|
||||||
{ "onExit", () => Menu = MenuType.Multiplayer },
|
{ "onExit", () => Menu = MenuType.Multiplayer },
|
||||||
{ "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer) }
|
{ "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer, false) }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
Widget.OpenWindow("DIRECTCONNECT_PANEL", new WidgetArgs()
|
Widget.OpenWindow("DIRECTCONNECT_PANEL", new WidgetArgs()
|
||||||
{
|
{
|
||||||
{ "onExit", () => Menu = MenuType.Multiplayer },
|
{ "onExit", () => Menu = MenuType.Multiplayer },
|
||||||
{ "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer) }
|
{ "openLobby", () => OpenLobbyPanel(MenuType.Multiplayer, false) }
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -140,13 +140,14 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
rootMenu.Parent.RemoveChild(rootMenu);
|
rootMenu.Parent.RemoveChild(rootMenu);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenLobbyPanel(MenuType menu)
|
void OpenLobbyPanel(MenuType menu, bool addBots)
|
||||||
{
|
{
|
||||||
Menu = MenuType.None;
|
Menu = MenuType.None;
|
||||||
Game.OpenWindow("SERVER_LOBBY", new WidgetArgs()
|
Game.OpenWindow("SERVER_LOBBY", new WidgetArgs()
|
||||||
{
|
{
|
||||||
{ "onExit", () => { Game.Disconnect(); Menu = menu; } },
|
{ "onExit", () => { Game.Disconnect(); Menu = menu; } },
|
||||||
{ "onStart", RemoveShellmapUI }
|
{ "onStart", RemoveShellmapUI },
|
||||||
|
{ "addBots", addBots }
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,7 +157,7 @@ namespace OpenRA.Mods.Cnc.Widgets.Logic
|
|||||||
var port = Game.CreateLocalServer(map);
|
var port = Game.CreateLocalServer(map);
|
||||||
CncConnectingLogic.Connect(IPAddress.Loopback.ToString(),
|
CncConnectingLogic.Connect(IPAddress.Loopback.ToString(),
|
||||||
port,
|
port,
|
||||||
() => OpenLobbyPanel(MenuType.Main),
|
() => OpenLobbyPanel(MenuType.Main, true),
|
||||||
() => { Game.CloseServer(); Menu = MenuType.Main; });
|
() => { Game.CloseServer(); Menu = MenuType.Main; });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user