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); }); } }