diff --git a/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForSupportPowerReset.cs b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForSupportPowerReset.cs new file mode 100644 index 0000000000..5ffa361924 --- /dev/null +++ b/OpenRA.Mods.Cnc/Traits/Infiltration/InfiltrateForSupportPowerReset.cs @@ -0,0 +1,46 @@ +#region Copyright & License Information +/* + * Copyright 2007-2020 The OpenRA Developers (see AUTHORS) + * This file is part of OpenRA, which is free software. It is made + * available to you under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. For more + * information, see COPYING. + */ +#endregion + +using System.Linq; +using OpenRA.Mods.Common.Traits; +using OpenRA.Primitives; +using OpenRA.Traits; + +namespace OpenRA.Mods.Cnc.Traits +{ + class InfiltrateForSupportPowerResetInfo : ITraitInfo + { + public readonly BitSet Types = default(BitSet); + + public object Create(ActorInitializer init) { return new InfiltrateForSupportPowerReset(this); } + } + + class InfiltrateForSupportPowerReset : INotifyInfiltrated + { + readonly InfiltrateForSupportPowerResetInfo info; + + public InfiltrateForSupportPowerReset(InfiltrateForSupportPowerResetInfo info) + { + this.info = info; + } + + void INotifyInfiltrated.Infiltrated(Actor self, Actor infiltrator, BitSet types) + { + if (!info.Types.Overlaps(types)) + return; + + var manager = self.Owner.PlayerActor.Trait(); + var powers = manager.GetPowersForActor(self).Where(sp => !sp.Disabled); + foreach (var power in powers) + power.ResetTimer(); + } + } +} diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs index 7d4fcf99d8..0e02262039 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs @@ -171,6 +171,11 @@ namespace OpenRA.Mods.Common.Traits protected bool notifiedCharging; bool notifiedReady; + public void ResetTimer() + { + remainingSubTicks = TotalTicks * 100; + } + public SupportPowerInstance(string key, SupportPowerInfo info, SupportPowerManager manager) { Key = key; diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index cf4e7e72bc..d9d1206ff8 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -58,6 +58,10 @@ MSLO: CircleSequence: circles SupportPowerPaletteOrder: 70 SupportPowerChargeBar: + InfiltrateForSupportPowerReset: + Types: SpyInfiltrate + Targetable: + TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate Power: Amount: -150 MustBeDestroyed: @@ -424,6 +428,10 @@ IRON: OnFireSound: ironcur9.aud SupportPowerPaletteOrder: 10 SupportPowerChargeBar: + InfiltrateForSupportPowerReset: + Types: SpyInfiltrate + Targetable: + TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate Power: Amount: -200 MustBeDestroyed: @@ -505,6 +513,10 @@ PDOX: Range: 2 SupportPowerPaletteOrder: 30 SupportPowerChargeBar: + InfiltrateForSupportPowerReset: + Types: SpyInfiltrate + Targetable: + TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate Power: Amount: -200 MustBeDestroyed: @@ -961,6 +973,10 @@ ATEK: DisplayTimerStances: Ally, Neutral, Enemy SupportPowerPaletteOrder: 90 SupportPowerChargeBar: + InfiltrateForSupportPowerReset: + Types: SpyInfiltrate + Targetable: + TargetTypes: Ground, C4, DetonateAttack, Structure, SpyInfiltrate Power: Amount: -200 ProvidesPrerequisite@buildingname: