diff --git a/OpenRA.Game/Network/OrderIO.cs b/OpenRA.Game/Network/OrderIO.cs index 82819aa8e1..41baf3d4bd 100644 --- a/OpenRA.Game/Network/OrderIO.cs +++ b/OpenRA.Game/Network/OrderIO.cs @@ -31,13 +31,14 @@ namespace OpenRA.Network return ret; } - public static byte[] SerializeSync(int sync) + public static byte[] SerializeSync(int sync, ulong defeatState) { - var ms = new MemoryStream(1 + 4); + var ms = new MemoryStream(1 + 4 + 8); using (var writer = new BinaryWriter(ms)) { writer.Write((byte)OrderType.SyncHash); writer.Write(sync); + writer.Write(defeatState); } return ms.GetBuffer(); diff --git a/OpenRA.Game/Network/OrderManager.cs b/OpenRA.Game/Network/OrderManager.cs index c8296d5f56..fad36e8953 100644 --- a/OpenRA.Game/Network/OrderManager.cs +++ b/OpenRA.Game/Network/OrderManager.cs @@ -192,9 +192,16 @@ namespace OpenRA.Network UnitOrders.ProcessOrder(this, World, order.Client, order.Order); if (NetFrameNumber + FramesAhead >= GameSaveLastSyncFrame) - Connection.SendSync(NetFrameNumber, OrderIO.SerializeSync(World.SyncHash())); + { + var defeatState = 0UL; + for (var i = 0; i < World.Players.Length; i++) + if (World.Players[i].WinState == WinState.Lost) + defeatState |= 1UL << i; + + Connection.SendSync(NetFrameNumber, OrderIO.SerializeSync(World.SyncHash(), defeatState)); + } else - Connection.SendSync(NetFrameNumber, OrderIO.SerializeSync(0)); + Connection.SendSync(NetFrameNumber, OrderIO.SerializeSync(0, 0)); if (generateSyncReport) using (new PerfSample("sync_report")) diff --git a/OpenRA.Game/Server/ProtocolVersion.cs b/OpenRA.Game/Server/ProtocolVersion.cs index 0a491f1829..83964c861b 100644 --- a/OpenRA.Game/Server/ProtocolVersion.cs +++ b/OpenRA.Game/Server/ProtocolVersion.cs @@ -25,6 +25,8 @@ namespace OpenRA.Server // Order types are: // - 0x65: World sync hash: // - Int32 containing the sync hash value + // - UInt64 containing the current defeat state (a bit set + // to 1 means the corresponding player is defeated) // - 0xBF: Player disconnected // - 0xFE: Handshake (also used for ServerOrders for ProtocolVersion.Orders < 8) // - Length-prefixed string specifying a name or key @@ -66,6 +68,6 @@ namespace OpenRA.Server // The protocol for server and world orders // This applies after the handshake has completed, and is provided to support // alternative server implementations that wish to support multiple versions in parallel - public const int Orders = 10; + public const int Orders = 11; } }