diff --git a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
index ebaac32e4a..5a1e2c55d7 100644
--- a/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
+++ b/OpenRA.Mods.Common/OpenRA.Mods.Common.csproj
@@ -307,7 +307,7 @@
-
+
diff --git a/OpenRA.Mods.Common/Traits/Crates/GrantUpgradeCrateAction.cs b/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs
similarity index 65%
rename from OpenRA.Mods.Common/Traits/Crates/GrantUpgradeCrateAction.cs
rename to OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs
index 3482ad574e..daa82819b0 100644
--- a/OpenRA.Mods.Common/Traits/Crates/GrantUpgradeCrateAction.cs
+++ b/OpenRA.Mods.Common/Traits/Crates/GrantExternalConditionCrateAction.cs
@@ -15,11 +15,11 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits
{
[Desc("Grants an upgrade to the collector.")]
- public class GrantUpgradeCrateActionInfo : CrateActionInfo
+ public class GrantExternalConditionCrateActionInfo : CrateActionInfo
{
- [UpgradeGrantedReference, FieldLoader.Require]
- [Desc("The upgrades to apply.")]
- public readonly string[] Upgrades = { };
+ [FieldLoader.Require]
+ [Desc("The condition to apply. Must be included in the target actor's ExternalConditions list.")]
+ public readonly string Condition = null;
[Desc("Duration of the upgrade (in ticks). Set to 0 for a permanent upgrade.")]
public readonly int Duration = 0;
@@ -30,37 +30,36 @@ namespace OpenRA.Mods.Common.Traits
[Desc("The maximum number of extra collectors to grant the crate action to.", "-1 = no limit")]
public readonly int MaxExtraCollectors = 4;
- public override object Create(ActorInitializer init) { return new GrantUpgradeCrateAction(init.Self, this); }
+ public override object Create(ActorInitializer init) { return new GrantExternalConditionCrateAction(init.Self, this); }
}
- public class GrantUpgradeCrateAction : CrateAction
+ public class GrantExternalConditionCrateAction : CrateAction
{
readonly Actor self;
- readonly GrantUpgradeCrateActionInfo info;
+ readonly GrantExternalConditionCrateActionInfo info;
- public GrantUpgradeCrateAction(Actor self, GrantUpgradeCrateActionInfo info)
+ public GrantExternalConditionCrateAction(Actor self, GrantExternalConditionCrateActionInfo info)
: base(self, info)
{
this.self = self;
this.info = info;
}
- bool AcceptsUpgrade(Actor a)
+ bool AcceptsCondition(Actor a)
{
var um = a.TraitOrDefault();
- return um != null && (info.Duration > 0 ?
- info.Upgrades.Any(u => um.AcknowledgesUpgrade(a, u)) : info.Upgrades.Any(u => um.AcceptsUpgrade(a, u)));
+ return um != null && um.AcceptsExternalCondition(a, info.Condition);
}
public override int GetSelectionShares(Actor collector)
{
- return AcceptsUpgrade(collector) ? info.SelectionShares : 0;
+ return AcceptsCondition(collector) ? info.SelectionShares : 0;
}
public override void Activate(Actor collector)
{
var actorsInRange = self.World.FindActorsInCircle(self.CenterPosition, info.Range)
- .Where(a => a != self && a != collector && a.Owner == collector.Owner && AcceptsUpgrade(a));
+ .Where(a => a != self && a != collector && a.Owner == collector.Owner && AcceptsCondition(a));
if (info.MaxExtraCollectors > -1)
actorsInRange = actorsInRange.Take(info.MaxExtraCollectors);
@@ -73,19 +72,10 @@ namespace OpenRA.Mods.Common.Traits
continue;
var um = a.TraitOrDefault();
- foreach (var u in info.Upgrades)
- {
- if (info.Duration > 0)
- {
- if (um.AcknowledgesUpgrade(a, u))
- um.GrantTimedUpgrade(a, u, info.Duration);
- }
- else
- {
- if (um.AcceptsUpgrade(a, u))
- um.GrantUpgrade(a, u, this);
- }
- }
+
+ // Condition token is ignored because we never revoke this condition.
+ if (um != null)
+ um.GrantCondition(a, info.Condition, true, info.Duration);
}
});