From 394e33dcc250b2c77eaa0f0c2860eeb0c69b639d Mon Sep 17 00:00:00 2001 From: abcdefg30 Date: Sat, 3 Nov 2018 14:45:04 +0000 Subject: [PATCH] Improve ClonesProducedUnits logic: - Supports multiple Production trait instances - Clones the correct faction variant, if defined --- .../Traits/Buildings/ClonesProducedUnits.cs | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.Cnc/Traits/Buildings/ClonesProducedUnits.cs b/OpenRA.Mods.Cnc/Traits/Buildings/ClonesProducedUnits.cs index fabe65be41..f04da0326d 100644 --- a/OpenRA.Mods.Cnc/Traits/Buildings/ClonesProducedUnits.cs +++ b/OpenRA.Mods.Cnc/Traits/Buildings/ClonesProducedUnits.cs @@ -9,6 +9,7 @@ */ #endregion +using System.Linq; using OpenRA.Mods.Common; using OpenRA.Mods.Common.Traits; using OpenRA.Primitives; @@ -29,14 +30,12 @@ namespace OpenRA.Mods.Cnc.Traits public class ClonesProducedUnits : INotifyOtherProduction { readonly ClonesProducedUnitsInfo info; - readonly Production production; - readonly string faction; + readonly Production[] productionTraits; public ClonesProducedUnits(ActorInitializer init, ClonesProducedUnitsInfo info) { this.info = info; - production = init.Self.Trait(); - faction = init.Contains() ? init.Get() : init.Self.Owner.Faction.InternalName; + productionTraits = init.Self.TraitsImplementing().ToArray(); } public void UnitProducedByOther(Actor self, Actor producer, Actor produced, string productionType, TypeDictionary init) @@ -49,13 +48,23 @@ namespace OpenRA.Mods.Cnc.Traits if (ci == null || !info.CloneableTypes.Overlaps(ci.Types)) return; - var inits = new TypeDictionary - { - new OwnerInit(self.Owner), - new FactionInit(BuildableInfo.GetInitialFaction(produced.Info, faction)) - }; + var factionInit = init.GetOrDefault(); - production.Produce(self, produced.Info, productionType, inits); + // Stop as soon as one production trait successfully produced + foreach (var p in productionTraits) + { + if (!string.IsNullOrEmpty(productionType) && !p.Info.Produces.Contains(productionType)) + continue; + + var inits = new TypeDictionary + { + new OwnerInit(self.Owner), + factionInit ?? new FactionInit(BuildableInfo.GetInitialFaction(produced.Info, p.Faction)) + }; + + if (p.Produce(self, produced.Info, productionType, inits)) + return; + } } } }