diff --git a/OpenRA.Game/Traits/Mobile.cs b/OpenRA.Game/Traits/Mobile.cs index 67780ec52e..18197f8564 100644 --- a/OpenRA.Game/Traits/Mobile.cs +++ b/OpenRA.Game/Traits/Mobile.cs @@ -191,33 +191,30 @@ namespace OpenRA.Traits } // Check mobile actors - if (checkTransientActors) + if (checkTransientActors && uim.AnyUnitsAt(cell)) { - var actors = uim.GetUnitsAt(cell); - if (actors.Any()) + var actors = uim.GetUnitsAt(cell).Where(a => a != self && a != ignoreActor).ToArray(); + var nonshareable = canShareCell ? actors : actors.Where(a => !a.traits.Contains()).ToArray(); + + if (canShareCell) { - var actors2 = actors.Where(a => a != self && a != ignoreActor).ToArray(); - var nonshareable = canShareCell ? actors2 : actors2.Where(a => !a.traits.Contains()).ToArray(); + var shareable = actors.Where(a => a.traits.Contains()); - if (canShareCell) - { - var shareable = actors2.Where(a => a.traits.Contains()); - - // only allow 5 in a cell - if (shareable.Count() >= 5) - return false; - } - - // We can enter a cell with nonshareable units only if we can crush all of them - if (Info.Crushes == null && nonshareable.Length > 0) - return false; - - if (nonshareable.Length > 0 && nonshareable.Any(a => !(a.traits.Contains() && - a.traits.WithInterface().Any(b => b.CrushClasses.Intersect(Info.Crushes).Any())))) + // only allow 5 in a cell + if (shareable.Count() >= 5) return false; } + + // We can enter a cell with nonshareable units only if we can crush all of them + if (Info.Crushes == null && nonshareable.Length > 0) + return false; + + if (nonshareable.Length > 0 && nonshareable.Any(a => !(a.traits.Contains() && + a.traits.WithInterface().Any(b => b.CrushClasses.Intersect(Info.Crushes).Any())))) + return false; } + return true; } diff --git a/OpenRA.Game/Traits/World/UnitInfluence.cs b/OpenRA.Game/Traits/World/UnitInfluence.cs index 37e3a754c6..66a5c4fc67 100644 --- a/OpenRA.Game/Traits/World/UnitInfluence.cs +++ b/OpenRA.Game/Traits/World/UnitInfluence.cs @@ -65,6 +65,11 @@ namespace OpenRA.Traits return influence[ a.X, a.Y ]; } + public bool AnyUnitsAt(int2 a) + { + return map.IsInMap(a) && influence[a.X, a.Y].Count > 0; + } + public void Add( Actor self, IOccupySpace unit ) { foreach( var c in unit.OccupiedCells() )