From 11f57b2b269730312497eb81e71cc03fde0600f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= Date: Sun, 5 Jul 2020 19:25:35 +0200 Subject: [PATCH] Protocol: add defeat state bitfields to Sync packets Signed-off-by: Paul Chote --- OpenRA.Game/Network/OrderIO.cs | 5 +++-- OpenRA.Game/Network/OrderManager.cs | 11 +++++++++-- OpenRA.Game/Server/ProtocolVersion.cs | 4 +++- 3 files changed, 15 insertions(+), 5 deletions(-) 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; } }