From b199f45f043dd1012334c267634e05b2f0ed6fb3 Mon Sep 17 00:00:00 2001 From: Michael Silber Date: Thu, 10 May 2018 08:49:34 +0000 Subject: [PATCH] Account for custom terrain layers in GrantConditionOnTerrain. --- .../Conditions/GrantConditionOnTerrain.cs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnTerrain.cs b/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnTerrain.cs index 4a01f10d8d..05c548a4ab 100644 --- a/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnTerrain.cs +++ b/OpenRA.Mods.Common/Traits/Conditions/GrantConditionOnTerrain.cs @@ -31,14 +31,18 @@ namespace OpenRA.Mods.Common.Traits public class GrantConditionOnTerrain : INotifyCreated, ITick { readonly GrantConditionOnTerrainInfo info; + readonly TileSet tileSet; ConditionManager conditionManager; int conditionToken = ConditionManager.InvalidConditionToken; - string previousTerrain; + + string cachedTerrain; + CPos cachedLocation; public GrantConditionOnTerrain(ActorInitializer init, GrantConditionOnTerrainInfo info) { this.info = info; + tileSet = init.World.Map.Rules.TileSet; } void INotifyCreated.Created(Actor self) @@ -48,12 +52,15 @@ namespace OpenRA.Mods.Common.Traits void ITick.Tick(Actor self) { - if (conditionManager == null) + var loc = self.Location; + if (conditionManager == null || loc == cachedLocation) return; - var currentTerrain = self.World.Map.GetTerrainInfo(self.Location).Type; + var currentTerrain = loc.Layer == 0 ? self.World.Map.GetTerrainInfo(loc).Type : + tileSet[self.World.GetCustomMovementLayers()[loc.Layer].GetTerrainIndex(loc)].Type; + var wantsGranted = info.TerrainTypes.Contains(currentTerrain); - if (currentTerrain != previousTerrain) + if (currentTerrain != cachedTerrain) { if (wantsGranted && conditionToken == ConditionManager.InvalidConditionToken) conditionToken = conditionManager.GrantCondition(self, info.Condition); @@ -61,7 +68,8 @@ namespace OpenRA.Mods.Common.Traits conditionToken = conditionManager.RevokeCondition(self, conditionToken); } - previousTerrain = currentTerrain; + cachedTerrain = currentTerrain; + cachedLocation = loc; } } }