diff --git a/Content.Client/Eye/EyeLerpingSystem.cs b/Content.Client/Eye/EyeLerpingSystem.cs index 837f923ec8..d1af9a211b 100644 --- a/Content.Client/Eye/EyeLerpingSystem.cs +++ b/Content.Client/Eye/EyeLerpingSystem.cs @@ -87,7 +87,7 @@ public sealed class EyeLerpingSystem : EntitySystem foundEyes.Add(entity); moverQuery.TryGetComponent(entity, out var mover); xformQuery.TryGetComponent(entity, out var xform); - lerpInfo.LastRotation = eye.Rotation; + lerpInfo.LastRotation = lerpInfo.TargetRotation; lerpInfo.TargetRotation = GetRotation(xformQuery, mover, xform); if (xform != null) @@ -109,6 +109,20 @@ public sealed class EyeLerpingSystem : EntitySystem } } + /// + /// Does the eye need to lerp or is its rotation matched. + /// + private bool NeedsLerp(EntityUid uid, InputMoverComponent? mover = null) + { + if (mover == null) + return true; + + if (mover.RelativeRotation.Equals(mover.TargetRelativeRotation)) + return false; + + return true; + } + private Angle GetRotation(EntityQuery xformQuery, InputMoverComponent? mover = null, TransformComponent? xform = null) { // If we can move then tie our eye to our inputs (these also get lerped so it should be fine). @@ -160,12 +174,19 @@ public sealed class EyeLerpingSystem : EntitySystem { var tickFraction = (float) _gameTiming.TickFraction / ushort.MaxValue; const double lerpMinimum = 0.00001; + var xformQuery = GetEntityQuery(); foreach (var (eye, entity) in GetEyes()) { if (!_activeEyes.TryGetValue(entity, out var lerpInfo)) continue; + if (TryComp(entity, out var mover) && !NeedsLerp(entity, mover)) + { + eye.Rotation = GetRotation(xformQuery, mover); + continue; + } + var shortest = Angle.ShortestDistance(lerpInfo.LastRotation, lerpInfo.TargetRotation); if (Math.Abs(shortest.Theta) < lerpMinimum)