From cfc026a1ac4667fc3a05fad9fef7681f852ad545 Mon Sep 17 00:00:00 2001 From: Gustas <37534529+PunkPun@users.noreply.github.com> Date: Wed, 3 May 2023 10:39:45 +0300 Subject: [PATCH] Fix aircraft jittering --- OpenRA.Mods.Common/Activities/Air/Fly.cs | 17 ++++++++++++++--- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 3 +++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/OpenRA.Mods.Common/Activities/Air/Fly.cs b/OpenRA.Mods.Common/Activities/Air/Fly.cs index 87d444761d..40163f79e3 100644 --- a/OpenRA.Mods.Common/Activities/Air/Fly.cs +++ b/OpenRA.Mods.Common/Activities/Air/Fly.cs @@ -9,6 +9,7 @@ */ #endregion +using System; using System.Collections.Generic; using System.Linq; using OpenRA.Activities; @@ -185,7 +186,19 @@ namespace OpenRA.Mods.Common.Activities return true; var isSlider = aircraft.Info.CanSlide; - var desiredFacing = delta.HorizontalLengthSquared != 0 ? delta.Yaw : aircraft.Facing; + + var desiredFacing = aircraft.Facing; + if (delta.HorizontalLengthSquared != 0) + { + var facing = delta.Yaw; + + // Prevent jittering. + var diff = Math.Abs(facing.Angle - desiredFacing.Angle); + var deadzone = aircraft.Info.TurnDeadzone.Angle; + if (diff > deadzone && diff < 1024 - deadzone) + desiredFacing = facing; + } + var move = isSlider ? aircraft.FlyStep(desiredFacing) : aircraft.FlyStep(aircraft.Facing); // Inside the minimum range, so reverse if we CanSlide, otherwise face away from the target. @@ -194,9 +207,7 @@ namespace OpenRA.Mods.Common.Activities if (isSlider) FlyTick(self, aircraft, desiredFacing, aircraft.Info.CruiseAltitude, -move); else - { FlyTick(self, aircraft, desiredFacing + new WAngle(512), aircraft.Info.CruiseAltitude, move); - } return false; } diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 18c2074edb..7988f8cc08 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -56,6 +56,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("Turn speed to apply when aircraft flies in circles while idle. Defaults to TurnSpeed if undefined.")] public readonly WAngle? IdleTurnSpeed = null; + [Desc("When flying if the difference between current facing and desired facing is less than this value, don't turn. This prevents visual jitter.")] + public readonly WAngle TurnDeadzone = new(2); + [Desc("Maximum flight speed when cruising.")] public readonly int Speed = 1;