76 lines
2.0 KiB
C#
Executable File
76 lines
2.0 KiB
C#
Executable File
#region Copyright & License Information
|
|
/*
|
|
* Copyright 2007-2014 The OpenRA Developers (see AUTHORS)
|
|
* This file is part of OpenRA, which is free software. It is made
|
|
* available to you under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation. For more information,
|
|
* see COPYING.
|
|
*/
|
|
#endregion
|
|
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace OpenRA.Network
|
|
{
|
|
class FrameData
|
|
{
|
|
public struct ClientOrder
|
|
{
|
|
public int Client;
|
|
public Order Order;
|
|
}
|
|
|
|
readonly Dictionary<int, int> clientQuitTimes = new Dictionary<int, int>();
|
|
readonly Dictionary<int, Dictionary<int, byte[]>> framePackets = new Dictionary<int, Dictionary<int, byte[]>>();
|
|
|
|
public IEnumerable<int> ClientsPlayingInFrame( int frame )
|
|
{
|
|
return clientQuitTimes
|
|
.Where( x => frame <= x.Value )
|
|
.Select( x => x.Key )
|
|
.OrderBy( x => x );
|
|
}
|
|
|
|
public void ClientQuit( int clientId, int lastClientFrame )
|
|
{
|
|
if (lastClientFrame == -1)
|
|
lastClientFrame = framePackets
|
|
.Where(x => x.Value.ContainsKey(clientId))
|
|
.Select(x => x.Key).OrderBy(x => x).LastOrDefault();
|
|
|
|
clientQuitTimes[clientId] = lastClientFrame;
|
|
}
|
|
|
|
public void AddFrameOrders( int clientId, int frame, byte[] orders )
|
|
{
|
|
var frameData = framePackets.GetOrAdd( frame );
|
|
frameData.Add( clientId, orders );
|
|
}
|
|
|
|
public bool IsReadyForFrame(int frame)
|
|
{
|
|
return !ClientsNotReadyForFrame(frame).Any();
|
|
}
|
|
|
|
public IEnumerable<int> ClientsNotReadyForFrame(int frame)
|
|
{
|
|
var frameData = framePackets.GetOrAdd(frame);
|
|
return ClientsPlayingInFrame(frame)
|
|
.Where(client => !frameData.ContainsKey(client));
|
|
}
|
|
|
|
public IEnumerable<ClientOrder> OrdersForFrame( World world, int frame )
|
|
{
|
|
var frameData = framePackets[ frame ];
|
|
var clientData = ClientsPlayingInFrame( frame )
|
|
.ToDictionary( k => k, v => frameData[ v ] );
|
|
|
|
return clientData
|
|
.SelectMany( x => x.Value
|
|
.ToOrderList( world )
|
|
.Select( o => new ClientOrder { Client = x.Key, Order = o } ) );
|
|
}
|
|
}
|
|
}
|