Make ClonesProducedUnits Conditional.

This commit is contained in:
Mustafa Alperen Seki
2019-05-05 17:13:25 +03:00
committed by reaperrr
parent 1ed36da107
commit e007568e17

View File

@@ -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<ProductionInfo>, Requires<ExitInfo>
public class ClonesProducedUnitsInfo : ConditionalTraitInfo, Requires<ProductionInfo>, Requires<ExitInfo>
{
[FieldLoader.Require]
[Desc("Uses the \"Cloneable\" trait to determine whether or not we should clone a produced unit.")]
public readonly BitSet<CloneableType> CloneableTypes = default(BitSet<CloneableType>);
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<ClonesProducedUnitsInfo>, INotifyOtherProduction
{
readonly ClonesProducedUnitsInfo info;
readonly Production[] productionTraits;
public ClonesProducedUnits(ActorInitializer init, ClonesProducedUnitsInfo info)
: base(info)
{
this.info = info;
productionTraits = init.Self.TraitsImplementing<Production>().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<ClonesProducedUnitsInfo>())
return;
var ci = produced.Info.TraitInfoOrDefault<CloneableInfo>();
if (ci == null || !info.CloneableTypes.Overlaps(ci.Types))
if (ci == null || !Info.CloneableTypes.Overlaps(ci.Types))
return;
var factionInit = init.GetOrDefault<FactionInit>();