Let immediate orders send a bitfield for extra order data

This commit is contained in:
abcdefg30
2019-04-13 16:43:21 +02:00
committed by Paul Chote
parent 5e363f18c9
commit 991093df81
2 changed files with 43 additions and 16 deletions

View File

@@ -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;

View File

@@ -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();
}
}