diff --git a/OpenRA.Mods.Common/Activities/Repair.cs b/OpenRA.Mods.Common/Activities/Repair.cs index aeff9e65f5..3821229a50 100644 --- a/OpenRA.Mods.Common/Activities/Repair.cs +++ b/OpenRA.Mods.Common/Activities/Repair.cs @@ -19,15 +19,22 @@ namespace OpenRA.Mods.Common.Activities public class Repair : Activity { readonly RepairsUnitsInfo repairsUnits; - readonly Actor host; + readonly Target host; + readonly WDist closeEnough; + int remainingTicks; Health health; bool played = false; - public Repair(Actor host) + public Repair(Actor self, Actor host) + : this(self, host, WDist.Zero) { } + + public Repair(Actor self, Actor host, WDist closeEnough) { - this.host = host; + this.host = Target.FromActor(host); + this.closeEnough = closeEnough; repairsUnits = host.Info.TraitInfo(); + health = self.TraitOrDefault(); } public override Activity Tick(Actor self) @@ -40,18 +47,17 @@ namespace OpenRA.Mods.Common.Activities return this; } - if (host == null || !host.IsInWorld) + if (host.Type == TargetType.Invalid || health == null) return NextActivity; - health = self.TraitOrDefault(); - if (health == null) + if (closeEnough.LengthSquared > 0 && !host.IsInRange(self.CenterPosition, closeEnough)) return NextActivity; if (health.DamageState == DamageState.Undamaged) { - if (host.Owner != self.Owner) + if (host.Actor.Owner != self.Owner) { - var exp = host.Owner.PlayerActor.TraitOrDefault(); + var exp = host.Actor.Owner.PlayerActor.TraitOrDefault(); if (exp != null) exp.GiveExperience(repairsUnits.PlayerExperience); } @@ -80,8 +86,8 @@ namespace OpenRA.Mods.Common.Activities self.InflictDamage(self, new Damage(-hpToRepair)); - foreach (var depot in host.TraitsImplementing()) - depot.Repairing(host, self); + foreach (var depot in host.Actor.TraitsImplementing()) + depot.Repairing(host.Actor, self); remainingTicks = repairsUnits.Interval; } diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 2c9f5b090f..fe95d68d9b 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -341,7 +341,7 @@ namespace OpenRA.Mods.Common.Traits if (Info.RearmBuildings.Contains(name)) yield return new Rearm(self); if (Info.RepairBuildings.Contains(name)) - yield return new Repair(a); + yield return new Repair(self, a); } public void ModifyDeathActorInit(Actor self, TypeDictionary init) diff --git a/OpenRA.Mods.Common/Traits/Repairable.cs b/OpenRA.Mods.Common/Traits/Repairable.cs index 98bf6871cf..b1471d4096 100644 --- a/OpenRA.Mods.Common/Traits/Repairable.cs +++ b/OpenRA.Mods.Common/Traits/Repairable.cs @@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.Traits if (CanRearmAt(order.TargetActor) && CanRearm()) self.QueueActivity(new Rearm(self)); - self.QueueActivity(new Repair(order.TargetActor)); + self.QueueActivity(new Repair(self, order.TargetActor)); var rp = order.TargetActor.TraitOrDefault(); if (rp != null) diff --git a/OpenRA.Mods.Common/Traits/RepairableNear.cs b/OpenRA.Mods.Common/Traits/RepairableNear.cs index 4f649e1f3f..6313cb74e1 100644 --- a/OpenRA.Mods.Common/Traits/RepairableNear.cs +++ b/OpenRA.Mods.Common/Traits/RepairableNear.cs @@ -79,7 +79,7 @@ namespace OpenRA.Mods.Common.Traits self.CancelActivity(); self.QueueActivity(movement.MoveWithinRange(target, info.CloseEnough)); - self.QueueActivity(new Repair(order.TargetActor)); + self.QueueActivity(new Repair(self, order.TargetActor, info.CloseEnough)); self.SetTargetLine(target, Color.Green, false); } diff --git a/OpenRA.Mods.RA/Activities/LayMines.cs b/OpenRA.Mods.RA/Activities/LayMines.cs index fa6a0fb8eb..7d27522274 100644 --- a/OpenRA.Mods.RA/Activities/LayMines.cs +++ b/OpenRA.Mods.RA/Activities/LayMines.cs @@ -57,7 +57,7 @@ namespace OpenRA.Mods.RA.Activities new MoveAdjacentTo(self, Target.FromActor(rearmTarget)), movement.MoveTo(self.World.Map.CellContaining(rearmTarget.CenterPosition), rearmTarget), new Rearm(self), - new Repair(rearmTarget), + new Repair(self, rearmTarget), this); }