diff --git a/OpenRA.Mods.Common/Traits/Buildings/BuildingUtils.cs b/OpenRA.Mods.Common/Traits/Buildings/BuildingUtils.cs index ca10c021dc..7adc2f91b5 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/BuildingUtils.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/BuildingUtils.cs @@ -71,12 +71,11 @@ namespace OpenRA.Mods.Common.Traits continue; // Cell is empty; continue search // Cell contains an actor. Is it the type we want? - if (world.ActorsHavingTrait() - .Any(a => a.Location == cell - && a.Info.TraitInfo().Types.Overlaps(lbi.NodeTypes))) - dirs[d] = i; // Cell contains actor of correct type - else - dirs[d] = -1; // Cell is blocked by another actor type + var hasConnector = world.ActorMap.GetActorsAt(cell) + .Any(a => a.Info.TraitInfos() + .Any(info => info.Types.Overlaps(lbi.NodeTypes) && info.Connections.Contains(vecs[d]))); + + dirs[d] = hasConnector ? i : -1; } // Place intermediate-line sections diff --git a/OpenRA.Mods.Common/Traits/Buildings/LineBuildNode.cs b/OpenRA.Mods.Common/Traits/Buildings/LineBuildNode.cs index 5eceef6af2..4567ac2ab7 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/LineBuildNode.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/LineBuildNode.cs @@ -18,6 +18,9 @@ namespace OpenRA.Mods.Common.Traits { [Desc("This actor is of LineBuild 'NodeType'...")] public readonly HashSet Types = new HashSet { "wall" }; + + [Desc("Cells (outside the footprint) that contain cells that can connect to this actor.")] + public readonly CVec[] Connections = new[] { new CVec(1, 0), new CVec(0, 1), new CVec(-1, 0), new CVec(0, -1) }; } public class LineBuildNode { }