diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 112a570207..6e580d5234 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -308,6 +308,7 @@ namespace OpenRA.Traits Activity VisualMove(Actor self, WPos fromPos, WPos toPos); CPos NearestMoveableCell(CPos target); bool IsMoving { get; set; } + bool IsMovingVertically { get; set; } bool CanEnterTargetNow(Actor self, Target target); } diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index b3097617b4..9913652d8f 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -118,6 +118,11 @@ namespace OpenRA.Mods.Common.Traits bool airborne; bool cruising; + bool firstTick = true; + + bool isMoving; + bool isMovingVertically; + WPos cachedPosition; public Aircraft(ActorInitializer init, AircraftInfo info) { @@ -141,6 +146,7 @@ namespace OpenRA.Mods.Common.Traits { um = self.TraitOrDefault(); speedModifiers = self.TraitsImplementing().ToArray().Select(sm => sm.GetSpeedModifier()); + cachedPosition = self.CenterPosition; } public void AddedToWorld(Actor self) @@ -154,7 +160,6 @@ namespace OpenRA.Mods.Common.Traits OnCruisingAltitudeReached(); } - bool firstTick = true; public virtual void Tick(Actor self) { if (firstTick) @@ -174,6 +179,11 @@ namespace OpenRA.Mods.Common.Traits self.QueueActivity(new TakeOff(self)); } + var oldCachedPosition = cachedPosition; + cachedPosition = self.CenterPosition; + isMoving = (oldCachedPosition - cachedPosition).HorizontalLengthSquared != 0; + isMovingVertically = (oldCachedPosition - cachedPosition).VerticalLengthSquared != 0; + Repulse(); } @@ -266,12 +276,12 @@ namespace OpenRA.Mods.Common.Traits protected void ReserveSpawnBuilding() { - /* HACK: not spawning in the air, so try to assoc. with our afld. */ - var afld = GetActorBelow(); - if (afld == null) + // HACK: Not spawning in the air, so try to associate with our spawner. + var spawner = GetActorBelow(); + if (spawner == null) return; - MakeReservation(afld); + MakeReservation(spawner); } public void MakeReservation(Actor target) @@ -483,7 +493,9 @@ namespace OpenRA.Mods.Common.Traits public CPos NearestMoveableCell(CPos cell) { return cell; } - public bool IsMoving { get { return self.World.Map.DistanceAboveTerrain(CenterPosition).Length > 0; } set { } } + public bool IsMoving { get { return isMoving; } set { } } + + public bool IsMovingVertically { get { return isMovingVertically; } set { } } public bool CanEnterTargetNow(Actor self, Target target) { diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 1398767c77..cdd07f2a70 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -327,6 +327,7 @@ namespace OpenRA.Mods.Common.Traits readonly Actor self; readonly Lazy> speedModifiers; public bool IsMoving { get; set; } + public bool IsMovingVertically { get { return false; } set { } } int facing; CPos fromCell, toCell; diff --git a/OpenRA.Mods.Common/Traits/Render/WithMoveAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithMoveAnimation.cs index aab405043f..ffcb69b146 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithMoveAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithMoveAnimation.cs @@ -27,24 +27,16 @@ namespace OpenRA.Mods.Common.Traits.Render readonly IMove movement; readonly WithSpriteBody wsb; - WPos cachedPosition; - public WithMoveAnimation(ActorInitializer init, WithMoveAnimationInfo info) { this.info = info; movement = init.Self.Trait(); wsb = init.Self.Trait(); - - cachedPosition = init.Self.CenterPosition; } public void Tick(Actor self) { - var oldCachedPosition = cachedPosition; - cachedPosition = self.CenterPosition; - - // Flying units set IsMoving whenever they are airborne, which isn't enough for our purposes - var isMoving = movement.IsMoving && !self.IsDead && (oldCachedPosition - cachedPosition).HorizontalLengthSquared != 0; + var isMoving = movement.IsMoving && !self.IsDead; if (isMoving ^ (wsb.DefaultAnimation.CurrentSequence.Name != info.MoveSequence)) return;