From d907192be099da30bf82fd116ace944daf12893b Mon Sep 17 00:00:00 2001 From: michaeldgg2 <119738087+michaeldgg2@users.noreply.github.com> Date: Thu, 27 Jul 2023 17:52:42 +0200 Subject: [PATCH] Added GrantConditionOnMinelaying trait Uses INotifyMineLaying callbacks --- .../Conditions/GrantConditionOnMinelaying.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnMinelaying.cs 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); + } + } +}