Serialize the actor generation for network orders
This commit is contained in:
@@ -118,8 +118,10 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
case TargetType.Actor:
|
case TargetType.Actor:
|
||||||
{
|
{
|
||||||
if (world != null && TryGetActorFromUInt(world, r.ReadUInt32(), out var targetActor))
|
var actorID = r.ReadUInt32();
|
||||||
target = Target.FromActor(targetActor);
|
var actorGeneration = r.ReadInt32();
|
||||||
|
if (world != null && TryGetActorFromUInt(world, actorID, out var targetActor))
|
||||||
|
target = Target.FromSerializedActor(targetActor, actorGeneration);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -367,6 +369,7 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
case TargetType.Actor:
|
case TargetType.Actor:
|
||||||
w.Write(UIntFromActor(Target.SerializableActor));
|
w.Write(UIntFromActor(Target.SerializableActor));
|
||||||
|
w.Write(Target.SerializableGeneration);
|
||||||
break;
|
break;
|
||||||
case TargetType.FrozenActor:
|
case TargetType.FrozenActor:
|
||||||
w.Write(Target.FrozenActor.Viewer.PlayerActor.ActorID);
|
w.Write(Target.FrozenActor.Viewer.PlayerActor.ActorID);
|
||||||
|
|||||||
@@ -77,6 +77,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 = 19;
|
public const int Orders = 20;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,11 +56,11 @@ namespace OpenRA.Traits
|
|||||||
generation = 0;
|
generation = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Target(Actor a)
|
Target(Actor a, int generation)
|
||||||
{
|
{
|
||||||
type = TargetType.Actor;
|
type = TargetType.Actor;
|
||||||
actor = a;
|
actor = a;
|
||||||
generation = a.Generation;
|
this.generation = generation;
|
||||||
|
|
||||||
terrainCenterPosition = WPos.Zero;
|
terrainCenterPosition = WPos.Zero;
|
||||||
terrainPositions = null;
|
terrainPositions = null;
|
||||||
@@ -85,7 +85,7 @@ namespace OpenRA.Traits
|
|||||||
public static Target FromPos(WPos p) { return new Target(p); }
|
public static Target FromPos(WPos p) { return new Target(p); }
|
||||||
public static Target FromTargetPositions(in Target t) { return new Target(t.CenterPosition, t.Positions.ToArray()); }
|
public static Target FromTargetPositions(in Target t) { return new Target(t.CenterPosition, t.Positions.ToArray()); }
|
||||||
public static Target FromCell(World w, CPos c, SubCell subCell = SubCell.FullCell) { return new Target(w, c, subCell); }
|
public static Target FromCell(World w, CPos c, SubCell subCell = SubCell.FullCell) { return new Target(w, c, subCell); }
|
||||||
public static Target FromActor(Actor a) { return a != null ? new Target(a) : Invalid; }
|
public static Target FromActor(Actor a) { return a != null ? new Target(a, a.Generation) : Invalid; }
|
||||||
public static Target FromFrozenActor(FrozenActor fa) { return new Target(fa); }
|
public static Target FromFrozenActor(FrozenActor fa) { return new Target(fa); }
|
||||||
|
|
||||||
public Actor Actor => actor;
|
public Actor Actor => actor;
|
||||||
@@ -225,8 +225,10 @@ namespace OpenRA.Traits
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Expose internal state for serialization by the orders code *only*
|
// Expose internal state for serialization by the orders code *only*
|
||||||
|
internal static Target FromSerializedActor(Actor a, int generation) { return a != null ? new Target(a, generation) : Invalid; }
|
||||||
internal TargetType SerializableType => type;
|
internal TargetType SerializableType => type;
|
||||||
internal Actor SerializableActor => actor;
|
internal Actor SerializableActor => actor;
|
||||||
|
internal int SerializableGeneration => generation;
|
||||||
internal CPos? SerializableCell => cell;
|
internal CPos? SerializableCell => cell;
|
||||||
internal SubCell? SerializableSubCell => subCell;
|
internal SubCell? SerializableSubCell => subCell;
|
||||||
internal WPos SerializablePos => terrainCenterPosition;
|
internal WPos SerializablePos => terrainCenterPosition;
|
||||||
|
|||||||
Reference in New Issue
Block a user