diff --git a/OpenRA.Mods.RA/Activities/CaptureBuilding.cs b/OpenRA.Mods.RA/Activities/CaptureBuilding.cs index dfb9f859bf..0b94b0f8f3 100644 --- a/OpenRA.Mods.RA/Activities/CaptureBuilding.cs +++ b/OpenRA.Mods.RA/Activities/CaptureBuilding.cs @@ -8,33 +8,36 @@ */ #endregion +using System.Linq; using OpenRA.Traits; namespace OpenRA.Mods.RA.Activities { class CaptureBuilding : CancelableActivity { - Target target; + Actor target; - public CaptureBuilding(Actor target) { this.target = Target.FromActor(target); } + public CaptureBuilding(Actor target) { this.target = target; } public override IActivity Tick(Actor self) { if (IsCanceled) return NextActivity; - if (!target.IsValid) return NextActivity; - if ((target.Actor.Location - self.Location).Length > 1) - return NextActivity; + if (target == null || !target.IsInWorld || target.IsDead()) return NextActivity; + if (target.Owner == self.Owner) return NextActivity; + if( !target.Trait().OccupiedCells().Any( x => x == self.Location ) ) + return NextActivity; + self.World.AddFrameEndTask(w => { // momentarily remove from world so the ownership queries don't get confused - var oldOwner = target.Actor.Owner; - w.Remove(target.Actor); - target.Actor.Owner = self.Owner; - w.Add(target.Actor); + var oldOwner = target.Owner; + w.Remove(target); + target.Owner = self.Owner; + w.Add(target); - foreach (var t in target.Actor.TraitsImplementing()) - t.OnCapture(target.Actor, self, oldOwner, self.Owner); + foreach (var t in target.TraitsImplementing()) + t.OnCapture(target, self, oldOwner, self.Owner); self.Destroy(); }); diff --git a/OpenRA.Mods.RA/Activities/Infiltrate.cs b/OpenRA.Mods.RA/Activities/Infiltrate.cs index 7366af2a3a..2680f54c3f 100644 --- a/OpenRA.Mods.RA/Activities/Infiltrate.cs +++ b/OpenRA.Mods.RA/Activities/Infiltrate.cs @@ -8,6 +8,7 @@ */ #endregion +using System.Linq; using OpenRA.Traits; namespace OpenRA.Mods.RA.Activities @@ -23,12 +24,15 @@ namespace OpenRA.Mods.RA.Activities if (target == null || !target.IsInWorld || target.IsDead()) return NextActivity; if (target.Owner == self.Owner) return NextActivity; + if( !target.Trait().OccupiedCells().Any( x => x == self.Location ) ) + return NextActivity; + foreach (var t in target.TraitsImplementing()) t.OnInfiltrate(target, self); self.Destroy(); - return NextActivity; + return this; } } } diff --git a/OpenRA.Mods.RA/Activities/RepairBuilding.cs b/OpenRA.Mods.RA/Activities/RepairBuilding.cs index e737c71175..b02c8e5801 100644 --- a/OpenRA.Mods.RA/Activities/RepairBuilding.cs +++ b/OpenRA.Mods.RA/Activities/RepairBuilding.cs @@ -6,33 +6,34 @@ * as published by the Free Software Foundation. For more information, * see LICENSE. */ -#endregion - +#endregion + +using System.Linq; using OpenRA.Traits; namespace OpenRA.Mods.RA.Activities { class RepairBuilding : CancelableActivity { - Target target; + Actor target; - public RepairBuilding(Actor target) { this.target = Target.FromActor(target); } + public RepairBuilding(Actor target) { this.target = target; } public override IActivity Tick(Actor self) { - if (IsCanceled) return NextActivity; - if (!target.IsValid) return NextActivity; - if ((target.Actor.Location - self.Location).Length > 1) - return NextActivity; + if (IsCanceled) return NextActivity; + if (target == null || !target.IsInWorld || target.IsDead()) return NextActivity; + if( !target.Trait().OccupiedCells().Any( x => x == self.Location ) ) + return NextActivity; - var health = target.Actor.Trait(); + var health = target.Trait(); if (health.DamageState == DamageState.Undamaged) return NextActivity; - - target.Actor.InflictDamage(self, -health.MaxHP, null); + + target.InflictDamage(self, -health.MaxHP, null); self.Destroy(); - return NextActivity; + return this; } } }