diff --git a/OpenRA.Mods.Common/Traits/Crates/Crate.cs b/OpenRA.Mods.Common/Traits/Crates/Crate.cs index 213d7581de..ee09ad83e0 100644 --- a/OpenRA.Mods.Common/Traits/Crates/Crate.cs +++ b/OpenRA.Mods.Common/Traits/Crates/Crate.cs @@ -61,7 +61,8 @@ namespace OpenRA.Mods.Common.Traits void INotifyCrushed.OnCrush(Actor self, Actor crusher, HashSet crushClasses) { - if (!CrushableBy(crushClasses, crusher.Owner)) + // Crate can only be crushed if it is not in the air. + if (!self.IsAtGroundLevel() || !crushClasses.Contains(info.CrushClass)) return; OnCrushInner(crusher); @@ -84,7 +85,8 @@ namespace OpenRA.Mods.Common.Traits return false; // Make sure that the actor can collect this crate type - return CrushableBy(mi.Crushes, a.Owner); + // Crate can only be crushed if it is not in the air. + return self.IsAtGroundLevel() && mi.Crushes.Contains(info.CrushClass); }); // Destroy the crate if none of the units in the cell are valid collectors @@ -196,7 +198,7 @@ namespace OpenRA.Mods.Common.Traits return GetAvailableSubCell(a, SubCell.Any, ignoreActor, checkTransientActors) != SubCell.Invalid; } - public bool CrushableBy(HashSet crushClasses, Player owner) + bool ICrushable.CrushableBy(HashSet crushClasses, Player owner) { // Crate can only be crushed if it is not in the air. return self.IsAtGroundLevel() && crushClasses.Contains(info.CrushClass); diff --git a/OpenRA.Mods.Common/Traits/Crushable.cs b/OpenRA.Mods.Common/Traits/Crushable.cs index 6d4f4e0ee7..16f8e5466c 100644 --- a/OpenRA.Mods.Common/Traits/Crushable.cs +++ b/OpenRA.Mods.Common/Traits/Crushable.cs @@ -42,7 +42,7 @@ namespace OpenRA.Mods.Common.Traits void INotifyCrushed.WarnCrush(Actor self, Actor crusher, HashSet crushClasses) { - if (!CrushableBy(crushClasses, crusher.Owner)) + if (!CrushableInner(crushClasses, crusher.Owner)) return; var mobile = self.TraitOrDefault(); @@ -52,7 +52,7 @@ namespace OpenRA.Mods.Common.Traits void INotifyCrushed.OnCrush(Actor self, Actor crusher, HashSet crushClasses) { - if (!CrushableBy(crushClasses, crusher.Owner)) + if (!CrushableInner(crushClasses, crusher.Owner)) return; Game.Sound.Play(info.CrushSound, crusher.CenterPosition); @@ -71,7 +71,12 @@ namespace OpenRA.Mods.Common.Traits self.Kill(crusher); } - public bool CrushableBy(HashSet crushClasses, Player crushOwner) + bool ICrushable.CrushableBy(HashSet crushClasses, Player crushOwner) + { + return CrushableInner(crushClasses, crushOwner); + } + + bool CrushableInner(HashSet crushClasses, Player crushOwner) { // Only make actor crushable if it is on the ground. if (!self.IsAtGroundLevel()) diff --git a/OpenRA.Mods.RA/Traits/Mine.cs b/OpenRA.Mods.RA/Traits/Mine.cs index a291c4fb1a..089ffb20dc 100644 --- a/OpenRA.Mods.RA/Traits/Mine.cs +++ b/OpenRA.Mods.RA/Traits/Mine.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.RA.Traits void INotifyCrushed.OnCrush(Actor self, Actor crusher, HashSet crushClasses) { - if (!CrushableBy(crushClasses, crusher.Owner)) + if (!info.CrushClasses.Overlaps(crushClasses)) return; if (crusher.Info.HasTraitInfo() || (self.Owner.Stances[crusher.Owner] == Stance.Ally && info.AvoidFriendly)) @@ -49,7 +49,7 @@ namespace OpenRA.Mods.RA.Traits self.Kill(crusher); } - public bool CrushableBy(HashSet crushClasses, Player owner) + bool ICrushable.CrushableBy(HashSet crushClasses, Player owner) { return info.CrushClasses.Overlaps(crushClasses); }