diff --git a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs index 5a9ae4b591..278c7fce51 100644 --- a/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Mods.Common/Orders/PlaceBuildingOrderGenerator.cs @@ -301,20 +301,32 @@ namespace OpenRA.Mods.Common.Orders IEnumerable ClearBlockersOrders(World world, CPos topLeft) { var allTiles = variants[variant].BuildingInfo.Tiles(topLeft).ToArray(); - var neightborTiles = Util.ExpandFootprint(allTiles, true).Except(allTiles) + var adjacentTiles = Util.ExpandFootprint(allTiles, true).Except(allTiles) .Where(world.Map.Contains).ToList(); var blockers = allTiles.SelectMany(world.ActorMap.GetActorsAt) .Where(a => a.Owner == queue.Actor.Owner && a.IsIdle) - .Select(a => new TraitPair(a, a.TraitOrDefault())); + .Select(a => new TraitPair(a, a.TraitOrDefault())) + .Where(x => x.Trait != null); - foreach (var blocker in blockers.Where(x => x.Trait != null)) + foreach (var blocker in blockers) { - var availableCells = neightborTiles.Where(t => blocker.Trait.CanEnterCell(t)).ToList(); - if (availableCells.Count == 0) + CPos moveCell; + var mobile = blocker.Trait as Mobile; + if (mobile != null) + { + var availableCells = adjacentTiles.Where(t => mobile.CanEnterCell(t)).ToList(); + if (availableCells.Count == 0) + continue; + + moveCell = blocker.Actor.ClosestCell(availableCells); + } + else if (blocker.Trait is Aircraft) + moveCell = blocker.Actor.Location; + else continue; - yield return new Order("Move", blocker.Actor, Target.FromCell(world, blocker.Actor.ClosestCell(availableCells)), false) + yield return new Order("Move", blocker.Actor, Target.FromCell(world, moveCell), false) { SuppressVisualFeedback = true };