diff --git a/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs index 1e1df80305..46f4872fb4 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs @@ -36,7 +36,7 @@ namespace OpenRA.Mods.Common.Scripting "If duration > 0 the condition will be automatically revoked after the defined number of ticks")] public int GrantCondition(string condition, int duration = 0) { - if (!conditionManager.AcceptsExternalCondition(Self, condition)) + if (!conditionManager.AcceptsExternalCondition(Self, condition, duration > 0)) throw new InvalidDataException("Condition `{0}` has not been listed on an ExternalConditions trait".F(condition)); return conditionManager.GrantCondition(Self, condition, true, duration); @@ -49,9 +49,9 @@ namespace OpenRA.Mods.Common.Scripting } [Desc("Check whether this actor accepts a specific external condition.")] - public bool AcceptsCondition(string condition) + public bool AcceptsCondition(string condition, bool timed = false) { - return conditionManager.AcceptsExternalCondition(Self, condition); + return conditionManager.AcceptsExternalCondition(Self, condition, timed); } [Desc("Grant an upgrade to this actor. DEPRECATED! Will be removed.")] diff --git a/OpenRA.Mods.Common/Traits/Conditions/ConditionManager.cs b/OpenRA.Mods.Common/Traits/Conditions/ConditionManager.cs index 31e79fd5ec..875733a518 100644 --- a/OpenRA.Mods.Common/Traits/Conditions/ConditionManager.cs +++ b/OpenRA.Mods.Common/Traits/Conditions/ConditionManager.cs @@ -211,7 +211,7 @@ namespace OpenRA.Mods.Common.Traits } /// Returns true if the given external condition will have an effect on this actor. - public bool AcceptsExternalCondition(Actor self, string condition) + public bool AcceptsExternalCondition(Actor self, string condition, bool timed = false) { if (state == null) throw new InvalidOperationException("AcceptsExternalCondition cannot be queried before the actor has been fully created."); @@ -219,6 +219,10 @@ namespace OpenRA.Mods.Common.Traits if (!externalConditions.Contains(condition)) return false; + // A timed condition can always replace an existing timed condition (resetting its duration) + if (timed && timers.ContainsKey(condition)) + return true; + string[] sc; if (stackedConditions.TryGetValue(condition, out sc)) return stackedTokens[condition].Count < sc.Length; diff --git a/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs index 3681aadfd2..0a9ea8a2bc 100644 --- a/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs +++ b/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs @@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Traits bool AcceptsCondition(Actor a) { var cm = a.TraitOrDefault(); - return cm != null && cm.AcceptsExternalCondition(a, info.Condition); + return cm != null && cm.AcceptsExternalCondition(a, info.Condition, info.Duration > 0); } public override int GetSelectionShares(Actor collector) diff --git a/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs b/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs index f0eacb4541..2e00ebefc9 100644 --- a/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs +++ b/OpenRA.Mods.Common/Traits/SupportPowers/GrantExternalConditionPower.cs @@ -91,7 +91,7 @@ namespace OpenRA.Mods.Common.Traits return false; var cm = a.TraitOrDefault(); - return cm != null && cm.AcceptsExternalCondition(a, info.Condition); + return cm != null && cm.AcceptsExternalCondition(a, info.Condition, info.Duration > 0); }); } diff --git a/OpenRA.Mods.Common/Warheads/GrantExternalConditionWarhead.cs b/OpenRA.Mods.Common/Warheads/GrantExternalConditionWarhead.cs index be5f1ccd91..31884f8431 100644 --- a/OpenRA.Mods.Common/Warheads/GrantExternalConditionWarhead.cs +++ b/OpenRA.Mods.Common/Warheads/GrantExternalConditionWarhead.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Warheads var cm = a.TraitOrDefault(); // Condition token is ignored because we never revoke this condition. - if (cm != null && cm.AcceptsExternalCondition(a, Condition)) + if (cm != null && cm.AcceptsExternalCondition(a, Condition, Duration > 0)) cm.GrantCondition(a, Condition, true, Duration); } }