/// <summary>
///
/// </summary>
/// <param name="server"></param>
void SendSnapshot ( NetServer server, SnapshotQueue queue, long serverTicks )
{
// snapshot request is stored in connection's tag.s
var debug = Game.Network.ShowSnapshots;
var conns = server.Connections.Where ( c => c.IsSnapshotRequested() );
var sw = new Stopwatch();
foreach ( var conn in conns ) {
sw.Reset();
sw.Start();
var frame = queue.LastFrame;
var prevFrame = conn.GetRequestedSnapshotID();
int size = 0;
var commandID = conn.GetLastCommandID();
var snapshot = queue.Compress( ref prevFrame, out size);
// reset snapshot request :
conn.ResetRequestSnapshot();
var msg = server.CreateMessage( snapshot.Length + 4 * 4 + 8 + 1 );
msg.Write( (byte)NetCommand.Snapshot );
msg.Write( frame );
msg.Write( prevFrame );
msg.Write( commandID );
msg.Write( serverTicks );
msg.Write( snapshot.Length );
msg.Write( snapshot );
// append atom table to first snapshot :
if (commandID==0) {
atoms.Write( msg );
}
// Zero snapshot frame index means that client is waiting for first snapshot.
// and snapshot should reach the client.
var delivery = prevFrame == 0 ? NetDeliveryMethod.ReliableOrdered : NetDeliveryMethod.UnreliableSequenced;
if (prevFrame==0) {
Log.Message("SV: Sending initial snapshot to {0}", conn.GetHailGuid().ToString() );
}
sw.Stop();
server.SendMessage( msg, conn, delivery, 0 );
if (debug) {
Log.Message("Snapshot: #{0} - #{1} : {2} / {3} to {4} at {5} msec",
frame, prevFrame, snapshot.Length, size, conn.RemoteEndPoint.ToString(), sw.Elapsed.TotalMilliseconds );
}
}
}