Fixed issue with unit ready when capturing

This commit is contained in:
Andrii Yukhymchak
2018-01-01 11:08:38 +00:00
committed by Paul Chote
parent dec11f4fa0
commit 11db40a2b3
2 changed files with 24 additions and 18 deletions

View File

@@ -276,27 +276,33 @@ namespace OpenRA
// TODO: move elsewhere. // TODO: move elsewhere.
public void ChangeOwner(Player newOwner) public void ChangeOwner(Player newOwner)
{ {
World.AddFrameEndTask(w => World.AddFrameEndTask(_ => ChangeOwnerSync(newOwner));
{ }
if (Disposed)
return;
var oldOwner = Owner; /// <summary>
var wasInWorld = IsInWorld; /// Change the actors owner without queuing a FrameEndTask.
/// This must only be called from inside an existing FrameEndTask.
/// </summary>
public void ChangeOwnerSync(Player newOwner)
{
if (Disposed)
return;
// momentarily remove from world so the ownership queries don't get confused var oldOwner = Owner;
if (wasInWorld) var wasInWorld = IsInWorld;
w.Remove(this);
Owner = newOwner; // momentarily remove from world so the ownership queries don't get confused
Generation++; if (wasInWorld)
World.Remove(this);
foreach (var t in TraitsImplementing<INotifyOwnerChanged>()) Owner = newOwner;
t.OnOwnerChanged(this, oldOwner, newOwner); Generation++;
if (wasInWorld) foreach (var t in TraitsImplementing<INotifyOwnerChanged>())
w.Add(this); t.OnOwnerChanged(this, oldOwner, newOwner);
});
if (wasInWorld)
World.Add(this);
} }
public DamageState GetDamageState() public DamageState GetDamageState()

View File

@@ -67,8 +67,6 @@ namespace OpenRA.Mods.Common.Activities
var oldOwner = target.Actor.Owner; var oldOwner = target.Actor.Owner;
target.Actor.ChangeOwner(self.Owner);
foreach (var t in target.Actor.TraitsImplementing<INotifyCapture>()) foreach (var t in target.Actor.TraitsImplementing<INotifyCapture>())
t.OnCapture(target.Actor, self, oldOwner, self.Owner); t.OnCapture(target.Actor, self, oldOwner, self.Owner);
@@ -83,6 +81,8 @@ namespace OpenRA.Mods.Common.Activities
if (capturesInfo != null && capturesInfo.ConsumeActor) if (capturesInfo != null && capturesInfo.ConsumeActor)
self.Dispose(); self.Dispose();
target.Actor.ChangeOwnerSync(self.Owner);
}); });
} }
} }