diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 5d3f90309f..b2030602bd 100755 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -142,6 +142,7 @@ namespace OpenRA.Traits public interface ICrushable { void OnCrush(Actor crusher); + void WarnCrush(Actor crusher); bool CrushableBy(string[] crushClasses, Player owner); } diff --git a/OpenRA.Mods.RA/Buildings/Wall.cs b/OpenRA.Mods.RA/Buildings/Wall.cs index e5e486de0a..d00f39d4d9 100755 --- a/OpenRA.Mods.RA/Buildings/Wall.cs +++ b/OpenRA.Mods.RA/Buildings/Wall.cs @@ -31,7 +31,9 @@ namespace OpenRA.Mods.RA.Buildings this.self = self; this.info = info; } - + + public void WarnCrush(Actor crusher) {} + public bool CrushableBy(string[] crushClasses, Player crushOwner) { if (crushOwner.Stances[self.Owner] == Stance.Ally) diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs index 7f38113604..d4d3c86f94 100644 --- a/OpenRA.Mods.RA/Crate.cs +++ b/OpenRA.Mods.RA/Crate.cs @@ -56,6 +56,8 @@ namespace OpenRA.Mods.RA this.Info = info; } + public void WarnCrush(Actor crusher) {} + public void OnCrush(Actor crusher) { var shares = self.TraitsImplementing().Select( diff --git a/OpenRA.Mods.RA/Mine.cs b/OpenRA.Mods.RA/Mine.cs index 1738c1ef35..5c320b5f6e 100644 --- a/OpenRA.Mods.RA/Mine.cs +++ b/OpenRA.Mods.RA/Mine.cs @@ -40,6 +40,8 @@ namespace OpenRA.Mods.RA this.location = init.Get(); } + public void WarnCrush(Actor crusher) {} + public void OnCrush(Actor crusher) { if (crusher.HasTrait() || self.Owner.Stances[crusher.Owner] == Stance.Ally) diff --git a/OpenRA.Mods.RA/Move/Mobile.cs b/OpenRA.Mods.RA/Move/Mobile.cs index 5a3b5cb3f3..c711ab30c5 100755 --- a/OpenRA.Mods.RA/Move/Mobile.cs +++ b/OpenRA.Mods.RA/Move/Mobile.cs @@ -329,6 +329,17 @@ namespace OpenRA.Mods.RA.Move return Info.CanEnterCell(self.World, self.Owner, cell, ignoreActor, checkTransientActors); } + public void EnteringCell(Actor self) + { + var crushable = self.World.ActorMap.GetUnitsAt(toCell).Where(a => a != self && a.HasTrait()); + foreach (var a in crushable) + { + var crushActions = a.TraitsImplementing().Where(b => b.CrushableBy(Info.Crushes, self.Owner)); + foreach (var b in crushActions) + b.WarnCrush(self); + } + } + public void FinishedMoving(Actor self) { var crushable = self.World.ActorMap.GetUnitsAt(toCell).Where(a => a != self && a.HasTrait()); diff --git a/OpenRA.Mods.RA/Move/Move.cs b/OpenRA.Mods.RA/Move/Move.cs index 3d1823e2da..933f94c743 100755 --- a/OpenRA.Mods.RA/Move/Move.cs +++ b/OpenRA.Mods.RA/Move/Move.cs @@ -349,6 +349,7 @@ namespace OpenRA.Mods.RA.Move mobile.Facing, moveFraction - moveFractionTotal ); + mobile.EnteringCell(self); mobile.SetLocation( mobile.toCell, mobile.__toSubCell, mobile.toCell, mobile.__toSubCell ); return ret2; }