Fixed issue with unit ready when capturing
This commit is contained in:
committed by
Paul Chote
parent
dec11f4fa0
commit
11db40a2b3
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user