Use actor/target generations to invalidate targets on ownership change

This commit is contained in:
Chris Forbes
2013-06-13 09:44:50 +12:00
parent 5bc47f4834
commit ae809ce39f
2 changed files with 2 additions and 3 deletions

View File

@@ -273,6 +273,7 @@ namespace OpenRA
// momentarily remove from world so the ownership queries don't get confused // momentarily remove from world so the ownership queries don't get confused
w.Remove(this); w.Remove(this);
Owner = newOwner; Owner = newOwner;
Generation++;
w.Add(this); w.Add(this);
foreach (var t in this.TraitsImplementing<INotifyOwnerChanged>()) foreach (var t in this.TraitsImplementing<INotifyOwnerChanged>())

View File

@@ -15,7 +15,6 @@ namespace OpenRA.Traits
public static Target[] NoTargets = {}; public static Target[] NoTargets = {};
Actor actor; Actor actor;
Player owner;
PPos pos; PPos pos;
bool valid; bool valid;
int generation; int generation;
@@ -26,7 +25,6 @@ namespace OpenRA.Traits
{ {
actor = a, actor = a,
valid = (a != null), valid = (a != null),
owner = (a != null) ? a.Owner : null,
generation = a.Generation, generation = a.Generation,
}; };
} }
@@ -41,7 +39,7 @@ namespace OpenRA.Traits
public static readonly Target None = new Target(); public static readonly Target None = new Target();
public bool IsValid { get { return valid && (actor == null || (actor.IsInWorld && !actor.IsDead() && actor.Owner == owner && actor.Generation == generation)); } } public bool IsValid { get { return valid && (actor == null || (actor.IsInWorld && !actor.IsDead() && actor.Generation == generation)); } }
public PPos PxPosition { get { return IsActor ? actor.Trait<IHasLocation>().PxPosition : pos; } } public PPos PxPosition { get { return IsActor ? actor.Trait<IHasLocation>().PxPosition : pos; } }
public PPos CenterLocation { get { return PxPosition; } } public PPos CenterLocation { get { return PxPosition; } }