diff --git a/OpenRA.Game/Orders/PlaceBuildingOrderGenerator.cs b/OpenRA.Game/Orders/PlaceBuildingOrderGenerator.cs index a04656e526..4d6c817e94 100644 --- a/OpenRA.Game/Orders/PlaceBuildingOrderGenerator.cs +++ b/OpenRA.Game/Orders/PlaceBuildingOrderGenerator.cs @@ -57,13 +57,10 @@ namespace OpenRA.Orders yield break; } - yield return new Order("PlaceBuilding", Producer.Owner.PlayerActor, topLeft, Building); - - // Linebuild for walls. - // Assumes a 1x1 footprint; weird things will happen for other footprints if (Rules.Info[ Building ].Traits.Contains()) - foreach( var t in LineBuildUtils.GetLineBuildCells( world, topLeft, Building, BuildingInfo )) - yield return new Order("PlaceBuilding", Producer.Owner.PlayerActor, t, Building); + yield return new Order("LineBuild", Producer.Owner.PlayerActor, topLeft, Building); + else + yield return new Order("PlaceBuilding", Producer.Owner.PlayerActor, topLeft, Building); } } diff --git a/OpenRA.Game/Traits/Player/PlaceBuilding.cs b/OpenRA.Game/Traits/Player/PlaceBuilding.cs index dfdb9b9a2e..79700bc015 100644 --- a/OpenRA.Game/Traits/Player/PlaceBuilding.cs +++ b/OpenRA.Game/Traits/Player/PlaceBuilding.cs @@ -28,31 +28,46 @@ namespace OpenRA.Traits { public void ResolveOrder( Actor self, Order order ) { - if( order.OrderString == "PlaceBuilding" ) + if( order.OrderString == "PlaceBuilding" || order.OrderString == "LineBuild" ) { self.World.AddFrameEndTask( _ => { var queue = self.traits.Get(); var unit = Rules.Info[ order.TargetString ]; var producing = queue.CurrentItem(unit.Category); - + if( producing == null || producing.Item != order.TargetString || producing.RemainingTime != 0 ) return; - - var building = self.World.CreateActor( order.TargetString, order.TargetLocation, order.Player ); - foreach (var s in building.Info.Traits.Get().BuildSounds) - Sound.PlayToPlayer(order.Player, s); - + if( order.OrderString == "LineBuild" ) + { + bool playSounds = true; + var buildingInfo = unit.Traits.Get(); + foreach( var t in LineBuildUtils.GetLineBuildCells( self.World, order.TargetLocation, order.TargetString, buildingInfo ) ) + { + var building = self.World.CreateActor( order.TargetString, order.TargetLocation, order.Player ); + if( playSounds ) + foreach( var s in building.Info.Traits.Get().BuildSounds ) + Sound.PlayToPlayer( order.Player, s ); + playSounds = false; + } + } + else + { + var building = self.World.CreateActor( order.TargetString, order.TargetLocation, order.Player ); + foreach (var s in building.Info.Traits.Get().BuildSounds) + Sound.PlayToPlayer(order.Player, s); + } + var facts = self.World.Queries.OwnedBy[self.Owner] .WithTrait().Select(x => x.Actor); - + var primaryFact = facts.Where(y => y.traits.Get().IsPrimary); var fact = (primaryFact.Count() > 0) ? primaryFact.FirstOrDefault() : facts.FirstOrDefault(); if (fact != null) fact.traits.Get().PlayCustomAnim(fact, "build"); - + queue.FinishProduction(unit.Category); } ); }