diff --git a/OpenRA.Mods.Cnc/Traits/Buildings/ClonesProducedUnits.cs b/OpenRA.Mods.Cnc/Traits/Buildings/ClonesProducedUnits.cs index fc506b309b..67e87747b4 100644 --- a/OpenRA.Mods.Cnc/Traits/Buildings/ClonesProducedUnits.cs +++ b/OpenRA.Mods.Cnc/Traits/Buildings/ClonesProducedUnits.cs @@ -18,34 +18,36 @@ using OpenRA.Traits; namespace OpenRA.Mods.Cnc.Traits { [Desc("Creates a free duplicate of produced units.")] - public class ClonesProducedUnitsInfo : ITraitInfo, Requires, Requires + public class ClonesProducedUnitsInfo : ConditionalTraitInfo, Requires, Requires { [FieldLoader.Require] [Desc("Uses the \"Cloneable\" trait to determine whether or not we should clone a produced unit.")] public readonly BitSet CloneableTypes = default(BitSet); - public object Create(ActorInitializer init) { return new ClonesProducedUnits(init, this); } + public override object Create(ActorInitializer init) { return new ClonesProducedUnits(init, this); } } - public class ClonesProducedUnits : INotifyOtherProduction + public class ClonesProducedUnits : ConditionalTrait, INotifyOtherProduction { - readonly ClonesProducedUnitsInfo info; readonly Production[] productionTraits; public ClonesProducedUnits(ActorInitializer init, ClonesProducedUnitsInfo info) + : base(info) { - this.info = info; productionTraits = init.Self.TraitsImplementing().ToArray(); } public void UnitProducedByOther(Actor self, Actor producer, Actor produced, string productionType, TypeDictionary init) { + if (IsTraitDisabled) + return; + // No recursive cloning! if (producer.Owner != self.Owner || producer.Info.HasTraitInfo()) return; var ci = produced.Info.TraitInfoOrDefault(); - if (ci == null || !info.CloneableTypes.Overlaps(ci.Types)) + if (ci == null || !Info.CloneableTypes.Overlaps(ci.Types)) return; var factionInit = init.GetOrDefault();