diff --git a/OpenRA.Game/Network/FrameData.cs b/OpenRA.Game/Network/FrameData.cs index bbc1226696..e3e4d2c635 100755 --- a/OpenRA.Game/Network/FrameData.cs +++ b/OpenRA.Game/Network/FrameData.cs @@ -34,12 +34,17 @@ namespace OpenRA.Network frameData.Add( clientId, orders ); } - public bool IsReadyForFrame( int frame ) - { - var frameData = framePackets.GetOrAdd( frame ); - return ClientsPlayingInFrame( frame ) - .All( client => frameData.ContainsKey( client ) ); - } + public bool IsReadyForFrame(int frame) + { + return !ClientsNotReadyForFrame(frame).Any(); + } + + public IEnumerable ClientsNotReadyForFrame(int frame) + { + var frameData = framePackets.GetOrAdd(frame); + return ClientsPlayingInFrame(frame) + .Where(client => !frameData.ContainsKey(client)); + } public IEnumerable OrdersForFrame( World world, int frame ) { diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index 5dadc2a17a..1c34dcc57c 100755 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -155,7 +155,19 @@ namespace OpenRA.Network public bool IsReadyForNextFrame { get { return NetFrameNumber >= 1 && frameData.IsReadyForFrame( NetFrameNumber ); } - } + } + + static readonly IEnumerable NoClients = new Session.Client[] {}; + public IEnumerable GetClientsNotReadyForNextFrame + { + get + { + return NetFrameNumber >= 1 + ? frameData.ClientsNotReadyForFrame(NetFrameNumber) + .Select(a => LobbyInfo.ClientWithIndex(a)) + : NoClients; + } + } public void Tick() {