diff --git a/OpenRA.Mods.Cnc/Traits/Render/WithLandingCraftAnimation.cs b/OpenRA.Mods.Cnc/Traits/Render/WithLandingCraftAnimation.cs index bf08b199b0..7561a07386 100644 --- a/OpenRA.Mods.Cnc/Traits/Render/WithLandingCraftAnimation.cs +++ b/OpenRA.Mods.Cnc/Traits/Render/WithLandingCraftAnimation.cs @@ -59,7 +59,7 @@ namespace OpenRA.Mods.Cnc.Traits.Render if (move.CurrentMovementTypes != MovementType.None || self.World.Map.DistanceAboveTerrain(self.CenterPosition).Length > 0) return false; - return cargo.CurrentAdjacentCells.Any(c => self.World.Map.Contains(c) + return cargo.CurrentAdjacentCells().Any(c => self.World.Map.Contains(c) && info.OpenTerrainTypes.Contains(self.World.Map.GetTerrainInfo(c).Type)); } diff --git a/OpenRA.Mods.Common/Activities/UnloadCargo.cs b/OpenRA.Mods.Common/Activities/UnloadCargo.cs index 26c029b305..171ac53277 100644 --- a/OpenRA.Mods.Common/Activities/UnloadCargo.cs +++ b/OpenRA.Mods.Common/Activities/UnloadCargo.cs @@ -53,7 +53,7 @@ namespace OpenRA.Mods.Common.Activities { var pos = passenger.Trait(); - return cargo.CurrentAdjacentCells + return cargo.CurrentAdjacentCells() .Shuffle(self.World.SharedRandom) .Select(c => (c, pos.GetAvailableSubCell(c))) .Cast<(CPos, SubCell SubCell)?>() @@ -65,7 +65,7 @@ namespace OpenRA.Mods.Common.Activities var pos = passenger.Trait(); // Find the cells that are blocked by transient actors - return cargo.CurrentAdjacentCells + return cargo.CurrentAdjacentCells() .Where(c => pos.CanEnterCell(c, null, BlockedByActor.All) != pos.CanEnterCell(c, null, BlockedByActor.None)); } diff --git a/OpenRA.Mods.Common/Traits/Cargo.cs b/OpenRA.Mods.Common/Traits/Cargo.cs index 50117d76ad..d16b34c9ca 100644 --- a/OpenRA.Mods.Common/Traits/Cargo.cs +++ b/OpenRA.Mods.Common/Traits/Cargo.cs @@ -14,7 +14,6 @@ using System.Collections.Generic; using System.Linq; using OpenRA.Mods.Common.Activities; using OpenRA.Mods.Common.Orders; -using OpenRA.Mods.Common.Widgets; using OpenRA.Primitives; using OpenRA.Traits; @@ -107,10 +106,6 @@ namespace OpenRA.Mods.Common.Traits bool takeOffAfterLoad; bool initialised; - readonly CachedTransform> currentAdjacentCells; - - public IEnumerable CurrentAdjacentCells => currentAdjacentCells.Update(self.Location); - public IEnumerable Passengers => cargo; public int PassengerCount => cargo.Count; @@ -123,9 +118,6 @@ namespace OpenRA.Mods.Common.Traits self = init.Self; checkTerrainType = info.UnloadTerrainTypes.Count > 0; - currentAdjacentCells = new CachedTransform>(loc => - Util.AdjacentCells(self.World, Target.FromActor(self)).Where(c => loc != c)); - var runtimeCargoInit = init.GetOrDefault(info); var cargoInit = init.GetOrDefault(info); if (runtimeCargoInit != null) @@ -234,6 +226,11 @@ namespace OpenRA.Mods.Common.Traits } } + public IEnumerable CurrentAdjacentCells() + { + return Util.AdjacentCells(self.World, Target.FromActor(self)).Where(c => self.Location != c); + } + public bool CanUnload(BlockedByActor check = BlockedByActor.None) { if (IsTraitDisabled) @@ -249,7 +246,7 @@ namespace OpenRA.Mods.Common.Traits } return !IsEmpty() && (aircraft == null || aircraft.CanLand(self.Location, blockedByMobile: false)) - && CurrentAdjacentCells != null && CurrentAdjacentCells.Any(c => Passengers.Any(p => !p.IsDead && p.Trait().CanEnterCell(c, null, check))); + && CurrentAdjacentCells().Any(c => Passengers.Any(p => !p.IsDead && p.Trait().CanEnterCell(c, null, check))); } public bool CanLoad(Actor a)