From c7d3c3ec73b412f078ce0ef37ace22ebe0fcf589 Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Tue, 18 Jul 2017 13:34:05 -0500 Subject: [PATCH] Changes to ExternalCondition.TryRevokeCondition --- .../Scripting/Properties/ConditionProperties.cs | 3 ++- .../Traits/Conditions/ExternalCondition.cs | 16 +++++++++++++--- .../LineBuildSegmentExternalCondition.cs | 3 ++- .../Conditions/ProximityExternalCondition.cs | 3 ++- 4 files changed, 19 insertions(+), 6 deletions(-) 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; } } }