From 7ff7574d3d22e3af3cd68925f4f15fa118c9f1c4 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 2 Dec 2009 07:50:57 +1300 Subject: [PATCH] >2p works; non-netplay works again too. --- OpenRA.Server/Server.cs | 29 +++++++++++++++++++++++++++++ OpenRa.Game/OrderManager.cs | 20 +++++++++++++++----- 2 files changed, 44 insertions(+), 5 deletions(-) diff --git a/OpenRA.Server/Server.cs b/OpenRA.Server/Server.cs index a719e0a950..e6ac243982 100644 --- a/OpenRA.Server/Server.cs +++ b/OpenRA.Server/Server.cs @@ -63,6 +63,8 @@ namespace OpenRA.Server { static List conns = new List(); static TcpListener listener = new TcpListener(IPAddress.Any, 1234); + static Dictionary> inFlightFrames + = new Dictionary>(); public static void Main(string[] args) { @@ -175,6 +177,8 @@ namespace OpenRA.Server DispatchOrders(conn, conn.Frame, bytes); conn.ExpectLength = 8; conn.State = ReceiveState.Header; + + UpdateInFlightFrames(conn); } break; } } @@ -183,6 +187,31 @@ namespace OpenRA.Server // conn.socket.RemoteEndPoint); } + static void UpdateInFlightFrames(Connection conn) + { + if (conn.Frame != 0) + { + if (!inFlightFrames.ContainsKey(conn.Frame)) + { + Console.WriteLine("{0} opens frame {1}", + conn.socket.RemoteEndPoint, + conn.Frame); + inFlightFrames[conn.Frame] = new List { conn }; + } + else + inFlightFrames[conn.Frame].Add(conn); + + if (conns.All(c => inFlightFrames[conn.Frame].Contains(c))) + { + inFlightFrames.Remove(conn.Frame); + Console.WriteLine("frame {0} completed.", + conn.Frame); + + DispatchOrders(null, conn.Frame, new byte[] { 0xef }); + } + } + } + static void DispatchOrdersToClient(Connection c, int frame, byte[] data) { try diff --git a/OpenRa.Game/OrderManager.cs b/OpenRa.Game/OrderManager.cs index 3b82e402d2..147ef4cb4b 100755 --- a/OpenRa.Game/OrderManager.cs +++ b/OpenRa.Game/OrderManager.cs @@ -16,6 +16,7 @@ namespace OpenRa.Game const int FramesAhead = 3; public bool GameStarted { get { return frameNumber != 0; } } + public bool IsNetplay { get { return sources.OfType().Any(); } } public void StartGame() { @@ -32,6 +33,8 @@ namespace OpenRa.Game public OrderManager( IEnumerable sources ) { this.sources = sources.ToList(); + if (!IsNetplay) + StartGame(); } public OrderManager( IEnumerable sources, string replayFilename ) @@ -157,6 +160,7 @@ namespace OpenRa.Game TcpClient socket; Dictionary> orderBuffers = new Dictionary>(); + Dictionary gotEverything = new Dictionary(); public NetworkOrderSource( TcpClient socket ) { @@ -174,11 +178,16 @@ namespace OpenRa.Game lock (orderBuffers) { - /* accumulate this chunk */ - if (!orderBuffers.ContainsKey(frame)) - orderBuffers[frame] = new List { buf }; + if (len == 5 && buf[0] == 0xef) /* got everything marker */ + gotEverything[frame] = true; else - orderBuffers[frame].Add(buf); + { + /* accumulate this chunk */ + if (!orderBuffers.ContainsKey(frame)) + orderBuffers[frame] = new List { buf }; + else + orderBuffers[frame].Add(buf); + } } } } ) { IsBackground = true }.Start(); @@ -193,6 +202,7 @@ namespace OpenRa.Game if (!orderBuffers.TryGetValue(frame, out result)) result = NoOrders; orderBuffers.Remove(frame); + gotEverything.Remove(frame); return result; } } @@ -211,7 +221,7 @@ namespace OpenRa.Game public bool IsReadyForFrame( int frameNumber ) { lock( orderBuffers ) - return orderBuffers.ContainsKey( frameNumber ); + return gotEverything.ContainsKey( frameNumber ); } }