diff --git a/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnMinelaying.cs b/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnMinelaying.cs new file mode 100644 index 0000000000..0016d3697b --- /dev/null +++ b/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnMinelaying.cs @@ -0,0 +1,44 @@ +using OpenRA.Traits; + +namespace OpenRA.Mods.Common.Traits +{ + public class GrantConditionOnMinelayingInfo : ConditionalTraitInfo, Requires + { + [FieldLoader.Require] + [GrantedConditionReference] + [Desc("Condition to grant.")] + public readonly string Condition = null; + + public override object Create(ActorInitializer init) + { + return new GrantConditionOnMinelaying(this); + } + } + + public class GrantConditionOnMinelaying : ConditionalTrait, INotifyMineLaying + { + int conditionToken = Actor.InvalidConditionToken; + + public GrantConditionOnMinelaying(GrantConditionOnMinelayingInfo info) + : base(info) + { + } + + void INotifyMineLaying.MineLaid(Actor self, Actor mine) + { + if (conditionToken != Actor.InvalidConditionToken) + conditionToken = self.RevokeCondition(conditionToken); + } + + void INotifyMineLaying.MineLaying(Actor self, CPos location) + { + conditionToken = self.GrantCondition(Info.Condition); + } + + void INotifyMineLaying.MineLayingCanceled(Actor self, CPos location) + { + if (conditionToken != Actor.InvalidConditionToken) + conditionToken = self.RevokeCondition(conditionToken); + } + } +}