Use actor/target generations to invalidate targets on ownership change
This commit is contained in:
@@ -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>())
|
||||||
|
|||||||
@@ -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; } }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user