From 991093df818b1f22f35fd5cf9041892f4c6f7863 Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Sat, 13 Apr 2019 16:43:21 +0200 Subject: [PATCH] Let immediate orders send a bitfield for extra order data --- OpenRA.Game/Network/Order.cs | 31 ++++++++++++++++++++----------- OpenRA.Game/Server/ServerOrder.cs | 28 +++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/OpenRA.Game/Network/Order.cs b/OpenRA.Game/Network/Order.cs index 96fc6437e1..46382df681 100644 --- a/OpenRA.Game/Network/Order.cs +++ b/OpenRA.Game/Network/Order.cs @@ -148,9 +148,11 @@ namespace OpenRA case 0xfe: { var name = r.ReadString(); - var data = r.ReadString(); + var flags = (OrderFields)r.ReadByte(); + var targetString = flags.HasField(OrderFields.TargetString) ? r.ReadString() : null; + var extraData = flags.HasField(OrderFields.ExtraData) ? r.ReadUInt32() : 0; - return new Order(name, null, false) { IsImmediate = true, TargetString = data }; + return new Order(name, null, false) { IsImmediate = true, TargetString = targetString, ExtraData = extraData }; } default: @@ -245,15 +247,29 @@ namespace OpenRA public byte[] Serialize() { - var minLength = OrderString.Length + 1 + (IsImmediate ? 1 + TargetString.Length + 1 : 6); + var minLength = OrderString.Length + 1 + (IsImmediate ? 1 + 1 + TargetString.Length + 1 + 4 : 6); var ret = new MemoryStream(minLength); var w = new BinaryWriter(ret); + OrderFields fields = 0; + if (TargetString != null) + fields |= OrderFields.TargetString; + + if (ExtraData != 0) + fields |= OrderFields.ExtraData; + if (IsImmediate) { w.Write((byte)0xFE); w.Write(OrderString); - w.Write(TargetString); + w.Write((byte)fields); + + if (fields.HasField(OrderFields.TargetString)) + w.Write(TargetString); + + if (fields.HasField(OrderFields.ExtraData)) + w.Write(ExtraData); + return ret.ToArray(); } @@ -261,22 +277,15 @@ namespace OpenRA w.Write(OrderString); w.Write(UIntFromActor(Subject)); - OrderFields fields = 0; if (Target.SerializableType != TargetType.Invalid) fields |= OrderFields.Target; - if (TargetString != null) - fields |= OrderFields.TargetString; - if (Queued) fields |= OrderFields.Queued; if (ExtraLocation != CPos.Zero) fields |= OrderFields.ExtraLocation; - if (ExtraData != 0) - fields |= OrderFields.ExtraData; - if (Target.SerializableCell != null) fields |= OrderFields.TargetIsCell; diff --git a/OpenRA.Game/Server/ServerOrder.cs b/OpenRA.Game/Server/ServerOrder.cs index 2c47e07daa..9441f667b2 100644 --- a/OpenRA.Game/Server/ServerOrder.cs +++ b/OpenRA.Game/Server/ServerOrder.cs @@ -18,11 +18,13 @@ namespace OpenRA.Server { public readonly string Name; public readonly string Data; + public readonly uint ExtraData; - public ServerOrder(string name, string data) + public ServerOrder(string name, string data, uint extraData = 0) { Name = name; Data = data; + ExtraData = extraData; } public static ServerOrder Deserialize(BinaryReader r) @@ -40,9 +42,11 @@ namespace OpenRA.Server case 0xfe: { var name = r.ReadString(); - var data = r.ReadString(); + var flags = (OrderFields)r.ReadByte(); + var data = flags.HasField(OrderFields.TargetString) ? r.ReadString() : null; + var extraData = flags.HasField(OrderFields.ExtraData) ? r.ReadUInt32() : 0; - return new ServerOrder(name, data); + return new ServerOrder(name, data, extraData); } default: @@ -52,12 +56,26 @@ namespace OpenRA.Server public byte[] Serialize() { - var ms = new MemoryStream(1 + Name.Length + 1 + Data.Length + 1); + var ms = new MemoryStream(1 + Name.Length + 1 + 1 + Data.Length + 1 + 4); var bw = new BinaryWriter(ms); + OrderFields fields = 0; + if (Data != null) + fields |= OrderFields.TargetString; + + if (ExtraData != 0) + fields |= OrderFields.ExtraData; + bw.Write((byte)0xfe); bw.Write(Name); - bw.Write(Data); + bw.Write((byte)fields); + + if (fields.HasField(OrderFields.TargetString)) + bw.Write(Data); + + if (fields.HasField(OrderFields.ExtraData)) + bw.Write(ExtraData); + return ms.ToArray(); } }