diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 47232401ee..9dfefe23a7 100755 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -254,10 +254,15 @@ namespace OpenRA { World.AddFrameEndTask(w => { + var oldOwner = Owner; + // momentarily remove from world so the ownership queries don't get confused w.Remove(this); Owner = newOwner; w.Add(this); + + foreach (var t in this.TraitsImplementing()) + t.OnOwnerChanged(this, oldOwner, newOwner); }); } } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 9350d0b0ff..4182ebf6a4 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -63,6 +63,7 @@ namespace OpenRA.Traits public interface INotifyAppliedDamage { void AppliedDamage(Actor self, Actor damaged, AttackInfo e); } public interface INotifyBuildComplete { void BuildingComplete(Actor self); } public interface INotifyProduction { void UnitProduced(Actor self, Actor other, CPos exit); } + public interface INotifyOwnerChanged { void OnOwnerChanged(Actor self, Player oldOwner, Player newOwner); } public interface INotifyCapture { void OnCapture(Actor self, Actor captor, Player oldOwner, Player newOwner); } public interface INotifyOtherCaptured { void OnActorCaptured(Actor self, Actor captured, Actor captor, Player oldOwner, Player newOwner); } public interface IAcceptSpy { void OnInfiltrate(Actor self, Actor spy); }