diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index b33da10f5c..34e3017026 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -672,7 +672,13 @@ namespace OpenRA.Mods.Common.Traits void INotifyBecomingIdle.OnBecomingIdle(Actor self) { - if (TopLeft.Layer == 0) + if (self.Location.Layer == 0) + return; + + var cml = self.World.WorldActor.TraitsImplementing() + .First(l => l.Index == self.Location.Layer); + + if (!cml.ReturnToGroundLayerOnIdle) return; var moveTo = ClosestGroundCell(); diff --git a/OpenRA.Mods.Common/Traits/World/ElevatedBridgeLayer.cs b/OpenRA.Mods.Common/Traits/World/ElevatedBridgeLayer.cs index c6c18efa58..1d85442427 100644 --- a/OpenRA.Mods.Common/Traits/World/ElevatedBridgeLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/ElevatedBridgeLayer.cs @@ -72,6 +72,7 @@ namespace OpenRA.Mods.Common.Traits bool ICustomMovementLayer.EnabledForActor(ActorInfo a, LocomotorInfo li) { return enabled; } byte ICustomMovementLayer.Index { get { return CustomMovementLayerType.ElevatedBridge; } } bool ICustomMovementLayer.InteractsWithDefaultLayer { get { return true; } } + bool ICustomMovementLayer.ReturnToGroundLayerOnIdle { get { return false; } } WPos ICustomMovementLayer.CenterOfCell(CPos cell) { diff --git a/OpenRA.Mods.Common/Traits/World/JumpjetActorLayer.cs b/OpenRA.Mods.Common/Traits/World/JumpjetActorLayer.cs index f6fb7562cf..67bf333159 100644 --- a/OpenRA.Mods.Common/Traits/World/JumpjetActorLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/JumpjetActorLayer.cs @@ -65,6 +65,7 @@ namespace OpenRA.Mods.Common.Traits bool ICustomMovementLayer.EnabledForActor(ActorInfo a, LocomotorInfo li) { return li is JumpjetLocomotorInfo; } byte ICustomMovementLayer.Index { get { return CustomMovementLayerType.Jumpjet; } } bool ICustomMovementLayer.InteractsWithDefaultLayer { get { return true; } } + bool ICustomMovementLayer.ReturnToGroundLayerOnIdle { get { return true; } } WPos ICustomMovementLayer.CenterOfCell(CPos cell) { diff --git a/OpenRA.Mods.Common/Traits/World/PathFinder.cs b/OpenRA.Mods.Common/Traits/World/PathFinder.cs index 44dedd99e2..67410c878e 100644 --- a/OpenRA.Mods.Common/Traits/World/PathFinder.cs +++ b/OpenRA.Mods.Common/Traits/World/PathFinder.cs @@ -76,7 +76,7 @@ namespace OpenRA.Mods.Common.Traits return EmptyPath; var distance = source - target; - if (distance.LengthSquared < 3 && li.CanMoveFreelyInto(world, self, target, null, CellConditions.All)) + if (source.Layer == target.Layer && distance.LengthSquared < 3 && li.CanMoveFreelyInto(world, self, target, null, CellConditions.All)) return new List { target }; List pb; diff --git a/OpenRA.Mods.Common/Traits/World/SubterraneanActorLayer.cs b/OpenRA.Mods.Common/Traits/World/SubterraneanActorLayer.cs index 43fb705427..1bed6e51c8 100644 --- a/OpenRA.Mods.Common/Traits/World/SubterraneanActorLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/SubterraneanActorLayer.cs @@ -64,6 +64,7 @@ namespace OpenRA.Mods.Common.Traits bool ICustomMovementLayer.EnabledForActor(ActorInfo a, LocomotorInfo li) { return li is SubterraneanLocomotorInfo; } byte ICustomMovementLayer.Index { get { return CustomMovementLayerType.Subterranean; } } bool ICustomMovementLayer.InteractsWithDefaultLayer { get { return false; } } + bool ICustomMovementLayer.ReturnToGroundLayerOnIdle { get { return true; } } WPos ICustomMovementLayer.CenterOfCell(CPos cell) { diff --git a/OpenRA.Mods.Common/Traits/World/TerrainTunnelLayer.cs b/OpenRA.Mods.Common/Traits/World/TerrainTunnelLayer.cs index 94d5f6e96d..99b1e99bb0 100644 --- a/OpenRA.Mods.Common/Traits/World/TerrainTunnelLayer.cs +++ b/OpenRA.Mods.Common/Traits/World/TerrainTunnelLayer.cs @@ -71,6 +71,7 @@ namespace OpenRA.Mods.Common.Traits bool ICustomMovementLayer.EnabledForActor(ActorInfo a, LocomotorInfo li) { return enabled; } byte ICustomMovementLayer.Index { get { return CustomMovementLayerType.Tunnel; } } bool ICustomMovementLayer.InteractsWithDefaultLayer { get { return false; } } + bool ICustomMovementLayer.ReturnToGroundLayerOnIdle { get { return true; } } WPos ICustomMovementLayer.CenterOfCell(CPos cell) { diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 50776c9c1b..95661c3e81 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -367,6 +367,7 @@ namespace OpenRA.Mods.Common.Traits { byte Index { get; } bool InteractsWithDefaultLayer { get; } + bool ReturnToGroundLayerOnIdle { get; } bool EnabledForActor(ActorInfo a, LocomotorInfo li); int EntryMovementCost(ActorInfo a, LocomotorInfo li, CPos cell);