diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs
index 53ba8cd825..69b72e3140 100644
--- a/OpenRA.Game/Actor.cs
+++ b/OpenRA.Game/Actor.cs
@@ -276,27 +276,33 @@ namespace OpenRA
// TODO: move elsewhere.
public void ChangeOwner(Player newOwner)
{
- World.AddFrameEndTask(w =>
- {
- if (Disposed)
- return;
+ World.AddFrameEndTask(_ => ChangeOwnerSync(newOwner));
+ }
- var oldOwner = Owner;
- var wasInWorld = IsInWorld;
+ ///
+ /// Change the actors owner without queuing a FrameEndTask.
+ /// This must only be called from inside an existing FrameEndTask.
+ ///
+ public void ChangeOwnerSync(Player newOwner)
+ {
+ if (Disposed)
+ return;
- // momentarily remove from world so the ownership queries don't get confused
- if (wasInWorld)
- w.Remove(this);
+ var oldOwner = Owner;
+ var wasInWorld = IsInWorld;
- Owner = newOwner;
- Generation++;
+ // momentarily remove from world so the ownership queries don't get confused
+ if (wasInWorld)
+ World.Remove(this);
- foreach (var t in TraitsImplementing())
- t.OnOwnerChanged(this, oldOwner, newOwner);
+ Owner = newOwner;
+ Generation++;
- if (wasInWorld)
- w.Add(this);
- });
+ foreach (var t in TraitsImplementing())
+ t.OnOwnerChanged(this, oldOwner, newOwner);
+
+ if (wasInWorld)
+ World.Add(this);
}
public DamageState GetDamageState()
diff --git a/OpenRA.Mods.Common/Activities/ExternalCaptureActor.cs b/OpenRA.Mods.Common/Activities/ExternalCaptureActor.cs
index 7a2b3d3780..f58b24252a 100644
--- a/OpenRA.Mods.Common/Activities/ExternalCaptureActor.cs
+++ b/OpenRA.Mods.Common/Activities/ExternalCaptureActor.cs
@@ -67,8 +67,6 @@ namespace OpenRA.Mods.Common.Activities
var oldOwner = target.Actor.Owner;
- target.Actor.ChangeOwner(self.Owner);
-
foreach (var t in target.Actor.TraitsImplementing())
t.OnCapture(target.Actor, self, oldOwner, self.Owner);
@@ -83,6 +81,8 @@ namespace OpenRA.Mods.Common.Activities
if (capturesInfo != null && capturesInfo.ConsumeActor)
self.Dispose();
+
+ target.Actor.ChangeOwnerSync(self.Owner);
});
}
}