diff --git a/OpenRA.Game/Traits/Player/EvaAlerts.cs b/OpenRA.Game/Traits/Player/EvaAlerts.cs index 04e9bd2a87..4369ca8a95 100644 --- a/OpenRA.Game/Traits/Player/EvaAlerts.cs +++ b/OpenRA.Game/Traits/Player/EvaAlerts.cs @@ -25,6 +25,8 @@ namespace OpenRA.Traits public readonly string BuildingCannotPlaceAudio = "nodeply1.aud"; public readonly string UnitSelectAudio = "train1.aud"; public readonly string UnitReadyAudio = "unitrdy1.aud"; + public readonly string UnitReadyBlockedAudio = "nobuild1.aud"; + public readonly string OnHoldAudio = "onhold1.aud"; public readonly string CancelledAudio = "cancld1.aud"; public readonly string NewOptions = "newopt1.aud"; diff --git a/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs b/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs index eb159ebdcb..ab218fdfc0 100755 --- a/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs +++ b/OpenRA.Mods.RA/Player/ClassicProductionQueue.cs @@ -46,7 +46,7 @@ namespace OpenRA.Mods.RA return QueueActive ? base.BuildableItems() : None; } - protected override void BuildUnit( string name ) + protected override bool BuildUnit( string name ) { // Find a production structure to build this actor var producers = self.World.Queries.OwnedBy[self.Owner] @@ -57,7 +57,7 @@ namespace OpenRA.Mods.RA if (producers.Count() == 0) { CancelProduction(name,1); - return; + return true; } foreach (var p in producers) @@ -67,9 +67,10 @@ namespace OpenRA.Mods.RA if (p.Trait.Produce(p.Actor, Rules.Info[ name ])) { FinishProduction(); - break; + return true; } } + return false; } } } diff --git a/OpenRA.Mods.RA/Player/ProductionQueue.cs b/OpenRA.Mods.RA/Player/ProductionQueue.cs index f42c640cbe..5629d5ec8f 100755 --- a/OpenRA.Mods.RA/Player/ProductionQueue.cs +++ b/OpenRA.Mods.RA/Player/ProductionQueue.cs @@ -145,23 +145,31 @@ namespace OpenRA.Mods.RA if (!BuildableItems().Any(b => b.Name == order.TargetString)) return; /* you can't build that!! */ - bool hasPlayedSound = false; - for (var n = 0; n < order.TargetLocation.X; n++) // repeat count { + bool hasPlayedSound = false; BeginProduction(new ProductionItem(this, order.TargetString, (int)time, cost, () => self.World.AddFrameEndTask( _ => { var isBuilding = unit.Traits.Contains(); - if (!hasPlayedSound) + var eva = self.World.WorldActor.Info.Traits.Get(); + + if (isBuilding && !hasPlayedSound) { - var eva = self.World.WorldActor.Info.Traits.Get(); - Sound.PlayToPlayer(order.Player, isBuilding ? eva.BuildingReadyAudio : eva.UnitReadyAudio); + Sound.PlayToPlayer(order.Player, eva.BuildingReadyAudio); hasPlayedSound = true; } - if (!isBuilding) - BuildUnit(order.TargetString); + else if (!isBuilding) + { + if (BuildUnit(order.TargetString)) + Sound.PlayToPlayer(order.Player, eva.UnitReadyAudio); + else if (!hasPlayedSound && time > 0) + { + Sound.PlayToPlayer(order.Player, eva.UnitReadyBlockedAudio); + hasPlayedSound = true; + } + } }))); } break; @@ -233,18 +241,23 @@ namespace OpenRA.Mods.RA } // Builds a unit from the actor that holds this queue (1 queue per building) - protected virtual void BuildUnit( string name ) + // Returns false if the unit can't be built + protected virtual bool BuildUnit( string name ) { // Cannot produce if i'm dead if (!self.IsInWorld || self.IsDead()) { CancelProduction(name, 1); - return; + return true; } var sp = self.TraitsImplementing().Where(p => p.Info.Produces.Contains(Info.Type)).FirstOrDefault(); if (sp != null && !IsDisabledBuilding(self) && sp.Produce(self, Rules.Info[ name ])) - FinishProduction(); + { + FinishProduction(); + return true; + } + return false; } } diff --git a/mods/cnc/bits/nobuild1.aud b/mods/cnc/bits/nobuild1.aud new file mode 100644 index 0000000000..853ef43c7a Binary files /dev/null and b/mods/cnc/bits/nobuild1.aud differ