diff --git a/OpenRA.Mods.Common/Traits/Demolishable.cs b/OpenRA.Mods.Common/Traits/Demolishable.cs index 0af013d03e..def41658e9 100644 --- a/OpenRA.Mods.Common/Traits/Demolishable.cs +++ b/OpenRA.Mods.Common/Traits/Demolishable.cs @@ -28,7 +28,7 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new Demolishable(this); } } - public class Demolishable : ConditionalTrait, IDemolishable, ITick + public class Demolishable : ConditionalTrait, IDemolishable, ITick, INotifyOwnerChanged { class DemolishAction { @@ -48,10 +48,23 @@ namespace OpenRA.Mods.Common.Traits readonly List actions = new List(); readonly List removeActions = new List(); + IDamageModifier[] damageModifiers; public Demolishable(DemolishableInfo info) : base(info) { } + protected override void Created(Actor self) + { + damageModifiers = self.TraitsImplementing() + .Concat(self.Owner.PlayerActor.TraitsImplementing()).ToArray(); + } + + void INotifyOwnerChanged.OnOwnerChanged(Actor self, Player oldOwner, Player newOwner) + { + damageModifiers = self.TraitsImplementing() + .Concat(newOwner.PlayerActor.TraitsImplementing()).ToArray(); + } + bool IDemolishable.IsValidTarget(Actor self, Actor saboteur) { return !IsTraitDisabled; @@ -68,18 +81,14 @@ namespace OpenRA.Mods.Common.Traits void ITick.Tick(Actor self) { - if (IsTraitDisabled) + if (IsTraitDisabled || actions.Count == 0) return; foreach (var a in actions) { if (a.Delay-- <= 0) { - var modifiers = self.TraitsImplementing() - .Concat(self.Owner.PlayerActor.TraitsImplementing()) - .Select(t => t.GetDamageModifier(self, null)); - - if (Util.ApplyPercentageModifiers(100, modifiers) > 0) + if (Util.ApplyPercentageModifiers(100, damageModifiers.Select(t => t.GetDamageModifier(self, null))) > 0) self.Kill(a.Saboteur, a.DamageTypes); else if (a.Token != Actor.InvalidConditionToken) {