Merge ServerOrder into Order and 0xFE order type into 0xFF.

This commit is contained in:
Paul Chote
2019-05-11 15:58:17 +00:00
committed by abcdefg30
parent 90ebffc6c0
commit 862a274357
7 changed files with 73 additions and 185 deletions

View File

@@ -230,7 +230,7 @@ namespace OpenRA.Network
foreach (var kv in TraitData)
{
var data = new List<MiniYamlNode>() { new MiniYamlNode(kv.Key.ToString(), kv.Value) }.WriteToString();
packetFn(0, 0, new ServerOrder("SaveTraitData", data).Serialize());
packetFn(0, 0, Order.FromTargetString("SaveTraitData", data, true).Serialize());
}
ordersStream.Seek(0, SeekOrigin.Begin);

View File

@@ -19,12 +19,14 @@ namespace OpenRA
[Flags]
enum OrderFields : byte
{
None = 0x0,
Target = 0x01,
TargetString = 0x04,
Queued = 0x08,
ExtraLocation = 0x10,
ExtraData = 0x20,
TargetIsCell = 0x40
TargetIsCell = 0x40,
Subject = 0x80
}
static class OrderFieldsExts
@@ -72,12 +74,15 @@ namespace OpenRA
case 0xFF:
{
var order = r.ReadString();
var subjectId = r.ReadUInt32();
var flags = (OrderFields)r.ReadByte();
Actor subject = null;
if (world != null)
TryGetActorFromUInt(world, subjectId, out subject);
if (flags.HasField(OrderFields.Subject))
{
var subjectId = r.ReadUInt32();
if (world != null)
TryGetActorFromUInt(world, subjectId, out subject);
}
var target = Target.Invalid;
if (flags.HasField(OrderFields.Target))
@@ -139,22 +144,12 @@ namespace OpenRA
if (world == null)
return new Order(order, null, target, targetString, queued, extraLocation, extraData);
if (subject == null && subjectId != uint.MaxValue)
if (subject == null && flags.HasField(OrderFields.Subject))
return null;
return new Order(order, subject, target, targetString, queued, extraLocation, extraData);
}
case 0xfe:
{
var name = 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 = targetString, ExtraData = extraData };
}
default:
{
Log.Write("debug", "Received unknown order with magic {0}", magic);
@@ -200,19 +195,9 @@ namespace OpenRA
return new Order("Chat", null, false) { IsImmediate = true, TargetString = text, ExtraData = teamNumber };
}
public static Order HandshakeResponse(string text)
public static Order FromTargetString(string order, string targetString, bool isImmediate)
{
return new Order("HandshakeResponse", null, false) { IsImmediate = true, TargetString = text };
}
public static Order Pong(string pingTime)
{
return new Order("Pong", null, false) { IsImmediate = true, TargetString = pingTime };
}
public static Order PauseGame(bool paused)
{
return new Order("PauseGame", null, false) { TargetString = paused ? "Pause" : "UnPause" };
return new Order(order, null, false) { IsImmediate = isImmediate, TargetString = targetString };
}
public static Order Command(string text)
@@ -247,36 +232,23 @@ namespace OpenRA
public byte[] Serialize()
{
var minLength = OrderString.Length + 1 + (IsImmediate ? 1 + 1 + TargetString.Length + 1 + 4 : 6);
var minLength = 1 + OrderString.Length + 1 + 4 + 1 + 13 + (TargetString != null ? TargetString.Length + 1 : 0) + 4 + 4;
var ret = new MemoryStream(minLength);
var w = new BinaryWriter(ret);
OrderFields fields = 0;
w.Write((byte)0xFF);
w.Write(OrderString);
var fields = OrderFields.None;
if (Subject != null)
fields |= OrderFields.Subject;
if (TargetString != null)
fields |= OrderFields.TargetString;
if (ExtraData != 0)
fields |= OrderFields.ExtraData;
if (IsImmediate)
{
w.Write((byte)0xFE);
w.Write(OrderString);
w.Write((byte)fields);
if (fields.HasField(OrderFields.TargetString))
w.Write(TargetString);
if (fields.HasField(OrderFields.ExtraData))
w.Write(ExtraData);
return ret.ToArray();
}
w.Write((byte)0xFF);
w.Write(OrderString);
w.Write(UIntFromActor(Subject));
if (Target.SerializableType != TargetType.Invalid)
fields |= OrderFields.Target;
@@ -291,6 +263,9 @@ namespace OpenRA
w.Write((byte)fields);
if (fields.HasField(OrderFields.Subject))
w.Write(UIntFromActor(Subject));
if (fields.HasField(OrderFields.Target))
{
w.Write((byte)Target.SerializableType);

View File

@@ -13,6 +13,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using OpenRA.Primitives;
using OpenRA.Server;
using OpenRA.Traits;
namespace OpenRA.Network
@@ -232,7 +233,12 @@ namespace OpenRA.Network
if (request.AuthToken != null && response.Fingerprint != null)
response.AuthSignature = localProfile.Sign(request.AuthToken);
orderManager.IssueOrder(Order.HandshakeResponse(response.Serialize()));
orderManager.IssueOrder(new Order("HandshakeResponse", null, false)
{
IsImmediate = true,
TargetString = response.Serialize()
});
break;
}
@@ -326,19 +332,15 @@ namespace OpenRA.Network
case "Ping":
{
orderManager.IssueOrder(Order.Pong(order.TargetString));
orderManager.IssueOrder(Order.FromTargetString("Pong", order.TargetString, true));
break;
}
default:
{
if (!order.IsImmediate)
{
var self = order.Subject;
if (!self.IsDead)
foreach (var t in self.TraitsImplementing<IResolveOrder>())
t.ResolveOrder(self, order);
}
if (order.Subject != null && !order.Subject.IsDead)
foreach (var t in order.Subject.TraitsImplementing<IResolveOrder>())
t.ResolveOrder(order.Subject, order);
break;
}