diff --git a/OpenRA.Game/Network/Connection.cs b/OpenRA.Game/Network/Connection.cs index edf8ce1f71..3cc90f83d1 100755 --- a/OpenRA.Game/Network/Connection.cs +++ b/OpenRA.Game/Network/Connection.cs @@ -30,7 +30,9 @@ namespace OpenRA.Network { int LocalClientId { get; } ConnectionState ConnectionState { get; } - void Send( byte[] packet ); + void Send( int frame, List orders ); + void SendImmediate( List orders ); + void SendSync( int frame, byte[] syncData ); void Receive( Action packetFn ); } @@ -53,7 +55,33 @@ namespace OpenRA.Network get { return ConnectionState.PreConnecting; } } - public virtual void Send( byte[] packet ) + public void Send( int frame, List orders ) + { + var ms = new MemoryStream(); + ms.Write( BitConverter.GetBytes( frame ) ); + foreach( var o in orders ) + ms.Write( o ); + Send( ms.ToArray() ); + } + + public void SendImmediate( List orders ) + { + var ms = new MemoryStream(); + ms.Write( BitConverter.GetBytes( (int)0 ) ); + foreach( var o in orders ) + ms.Write( o ); + Send( ms.ToArray() ); + } + + public void SendSync( int frame, byte[] syncData ) + { + var ms = new MemoryStream(); + ms.Write( BitConverter.GetBytes( frame ) ); + ms.Write( syncData ); + Send( ms.ToArray() ); + } + + protected virtual void Send( byte[] packet ) { if( packet.Length == 0 ) throw new NotImplementedException(); @@ -129,7 +157,7 @@ namespace OpenRA.Network public override int LocalClientId { get { return clientId; } } public override ConnectionState ConnectionState { get { return connectionState; } } - public override void Send( byte[] packet ) + protected override void Send( byte[] packet ) { base.Send( packet ); diff --git a/OpenRA.Game/Network/OrderIO.cs b/OpenRA.Game/Network/OrderIO.cs index d46ee764a3..efe11d5f9c 100755 --- a/OpenRA.Game/Network/OrderIO.cs +++ b/OpenRA.Game/Network/OrderIO.cs @@ -22,22 +22,6 @@ namespace OpenRA.Network s.Write(buf, 0, buf.Length); } - public static void WriteFrameData(this Stream s, IEnumerable orders, int frameNumber) - { - var bytes = Serialize( orders, frameNumber ); - s.Write( BitConverter.GetBytes( (int)bytes.Length ) ); - s.Write( bytes ); - } - - public static byte[] Serialize( this IEnumerable orders, int frameNumber ) - { - var ms = new MemoryStream(); - ms.Write( BitConverter.GetBytes( frameNumber ) ); - foreach( var o in orders.Select( o => o.Serialize() ) ) - ms.Write( o ); - return ms.ToArray(); - } - public static List ToOrderList(this byte[] bytes, World world) { var ms = new MemoryStream(bytes, 4, bytes.Length - 4); @@ -52,12 +36,11 @@ namespace OpenRA.Network return ret; } - public static byte[] SerializeSync( this List sync, int frameNumber ) + public static byte[] SerializeSync( this List sync ) { var ms = new MemoryStream(); using( var writer = new BinaryWriter( ms ) ) { - writer.Write( frameNumber ); writer.Write( (byte)0x65 ); foreach( var s in sync ) writer.Write( s ); diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index 31758deaa1..08dcafbe21 100755 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -47,7 +47,7 @@ namespace OpenRA.Network NetFrameNumber = 1; for( int i = NetFrameNumber ; i <= FramesAhead ; i++ ) - Connection.Send( new List().Serialize( i ) ); + Connection.Send( i, new List() ); } public OrderManager( string host, int port, IConnection conn ) @@ -73,7 +73,7 @@ namespace OpenRA.Network { var immediateOrders = localOrders.Where( o => o.IsImmediate ).ToList(); if( immediateOrders.Count != 0 ) - Connection.Send( immediateOrders.Serialize( 0 ) ); + Connection.SendImmediate( immediateOrders.Select( o => o.Serialize() ).ToList() ); localOrders.RemoveAll( o => o.IsImmediate ); var immediatePackets = new List>(); @@ -156,7 +156,7 @@ namespace OpenRA.Network if( !IsReadyForNextFrame ) throw new InvalidOperationException(); - Connection.Send( localOrders.Serialize( NetFrameNumber + FramesAhead ) ); + Connection.Send( NetFrameNumber + FramesAhead, localOrders.Select( o => o.Serialize() ).ToList() ); localOrders.Clear(); var sync = new List(); @@ -168,8 +168,8 @@ namespace OpenRA.Network sync.Add( world.SyncHash() ); } - var ss = sync.SerializeSync( NetFrameNumber ); - Connection.Send( ss ); + var ss = sync.SerializeSync(); + Connection.SendSync( NetFrameNumber, ss ); syncReport.UpdateSyncReport(); diff --git a/OpenRA.Game/Network/ReplayConnection.cs b/OpenRA.Game/Network/ReplayConnection.cs index 277e834882..688b7d24e0 100755 --- a/OpenRA.Game/Network/ReplayConnection.cs +++ b/OpenRA.Game/Network/ReplayConnection.cs @@ -26,10 +26,10 @@ namespace OpenRA.Network get { return ConnectionState.Connected; } } - public void Send( byte[] packet ) - { - // do nothing; ignore locally generated orders - } + // do nothing; ignore locally generated orders + public void Send( int frame, List orders ) { } + public void SendImmediate( List orders ) { } + public void SendSync( int frame, byte[] syncData ) { } public void Receive( Action packetFn ) { @@ -63,10 +63,9 @@ namespace OpenRA.Network public int LocalClientId { get { return inner.LocalClientId; } } public ConnectionState ConnectionState { get { return inner.ConnectionState; } } - public void Send( byte[] packet ) - { - inner.Send( packet ); - } + public void Send( int frame, List orders ) { inner.Send( frame, orders ); } + public void SendImmediate( List orders ) { inner.SendImmediate( orders ); } + public void SendSync( int frame, byte[] syncData ) { inner.SendSync( frame, syncData ); } public void Receive( Action packetFn ) {