Protocol: add defeat state bitfields to Sync packets
Signed-off-by: Paul Chote <pchote@users.noreply.github.com>
This commit is contained in:
@@ -31,13 +31,14 @@ namespace OpenRA.Network
|
|||||||
return ret;
|
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))
|
using (var writer = new BinaryWriter(ms))
|
||||||
{
|
{
|
||||||
writer.Write((byte)OrderType.SyncHash);
|
writer.Write((byte)OrderType.SyncHash);
|
||||||
writer.Write(sync);
|
writer.Write(sync);
|
||||||
|
writer.Write(defeatState);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ms.GetBuffer();
|
return ms.GetBuffer();
|
||||||
|
|||||||
@@ -192,9 +192,16 @@ namespace OpenRA.Network
|
|||||||
UnitOrders.ProcessOrder(this, World, order.Client, order.Order);
|
UnitOrders.ProcessOrder(this, World, order.Client, order.Order);
|
||||||
|
|
||||||
if (NetFrameNumber + FramesAhead >= GameSaveLastSyncFrame)
|
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
|
else
|
||||||
Connection.SendSync(NetFrameNumber, OrderIO.SerializeSync(0));
|
Connection.SendSync(NetFrameNumber, OrderIO.SerializeSync(0, 0));
|
||||||
|
|
||||||
if (generateSyncReport)
|
if (generateSyncReport)
|
||||||
using (new PerfSample("sync_report"))
|
using (new PerfSample("sync_report"))
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ namespace OpenRA.Server
|
|||||||
// Order types are:
|
// Order types are:
|
||||||
// - 0x65: World sync hash:
|
// - 0x65: World sync hash:
|
||||||
// - Int32 containing the sync hash value
|
// - 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
|
// - 0xBF: Player disconnected
|
||||||
// - 0xFE: Handshake (also used for ServerOrders for ProtocolVersion.Orders < 8)
|
// - 0xFE: Handshake (also used for ServerOrders for ProtocolVersion.Orders < 8)
|
||||||
// - Length-prefixed string specifying a name or key
|
// - Length-prefixed string specifying a name or key
|
||||||
@@ -66,6 +68,6 @@ namespace OpenRA.Server
|
|||||||
// The protocol for server and world orders
|
// The protocol for server and world orders
|
||||||
// This applies after the handshake has completed, and is provided to support
|
// This applies after the handshake has completed, and is provided to support
|
||||||
// alternative server implementations that wish to support multiple versions in parallel
|
// alternative server implementations that wish to support multiple versions in parallel
|
||||||
public const int Orders = 10;
|
public const int Orders = 11;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user