diff --git a/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs b/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs index 71d7b22894..a55a5efa55 100644 --- a/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs +++ b/OpenRA.Mods.Common/Scripting/Properties/ConditionProperties.cs @@ -50,7 +50,8 @@ namespace OpenRA.Mods.Common.Scripting public void RevokeCondition(int token) { foreach (var external in externalConditions) - external.TryRevokeCondition(Self, this, token); + if (external.TryRevokeCondition(Self, this, token)) + break; } [Desc("Check whether this actor accepts a specific external condition.")] diff --git a/OpenRA.Mods.Common/Traits/Conditions/ExternalCondition.cs b/OpenRA.Mods.Common/Traits/Conditions/ExternalCondition.cs index 8e9c0ab91d..4a16e56a61 100644 --- a/OpenRA.Mods.Common/Traits/Conditions/ExternalCondition.cs +++ b/OpenRA.Mods.Common/Traits/Conditions/ExternalCondition.cs @@ -130,10 +130,20 @@ namespace OpenRA.Mods.Common.Traits if (conditionManager == null || source == null) return false; - var removed = permanentTokens.GetOrAdd(source).Remove(token) || - timedTokens.GetOrAdd(source).RemoveWhere(t => t.Token == token) > 0; + HashSet permanentTokensForSource; + if (permanentTokens.TryGetValue(source, out permanentTokensForSource)) + { + if (!permanentTokensForSource.Remove(token)) + return false; + } + else + { + HashSet timedTokensForSource = null; + if (timedTokens.TryGetValue(source, out timedTokensForSource) && timedTokensForSource.RemoveWhere(t => t.Token == token) == 0) + return false; + } - if (removed && conditionManager.TokenValid(self, token)) + if (conditionManager.TokenValid(self, token)) conditionManager.RevokeCondition(self, token); return true; diff --git a/OpenRA.Mods.Common/Traits/Conditions/LineBuildSegmentExternalCondition.cs b/OpenRA.Mods.Common/Traits/Conditions/LineBuildSegmentExternalCondition.cs index c78414ef0d..ddd1d368b2 100644 --- a/OpenRA.Mods.Common/Traits/Conditions/LineBuildSegmentExternalCondition.cs +++ b/OpenRA.Mods.Common/Traits/Conditions/LineBuildSegmentExternalCondition.cs @@ -56,7 +56,8 @@ namespace OpenRA.Mods.Common.Traits return; foreach (var external in segment.TraitsImplementing()) - external.TryRevokeCondition(segment, self, token); + if (external.TryRevokeCondition(segment, self, token)) + break; } void INotifyLineBuildSegmentsChanged.SegmentAdded(Actor self, Actor segment) diff --git a/OpenRA.Mods.Common/Traits/Conditions/ProximityExternalCondition.cs b/OpenRA.Mods.Common/Traits/Conditions/ProximityExternalCondition.cs index f38322ca78..d6057fbd9d 100644 --- a/OpenRA.Mods.Common/Traits/Conditions/ProximityExternalCondition.cs +++ b/OpenRA.Mods.Common/Traits/Conditions/ProximityExternalCondition.cs @@ -156,7 +156,8 @@ namespace OpenRA.Mods.Common.Traits tokens.Remove(a); foreach (var external in a.TraitsImplementing()) - external.TryRevokeCondition(a, self, token); + if (external.TryRevokeCondition(a, self, token)) + break; } } }