diff --git a/Content.Server/AI/Components/AiControllerComponent.cs b/Content.Server/AI/Components/AiControllerComponent.cs
index 389a1ca766..468a245860 100644
--- a/Content.Server/AI/Components/AiControllerComponent.cs
+++ b/Content.Server/AI/Components/AiControllerComponent.cs
@@ -87,6 +87,8 @@ namespace Content.Server.AI.Components
}
}
+ public Angle LastGridAngle { get => Angle.Zero; set {} }
+
///
[ViewVariables(VVAccess.ReadWrite)]
public float PushStrength { get; set; } = IMobMoverComponent.PushStrengthDefault;
diff --git a/Content.Shared/Movement/Components/IMoverComponent.cs b/Content.Shared/Movement/Components/IMoverComponent.cs
index d0a511116b..607d6e8e15 100644
--- a/Content.Shared/Movement/Components/IMoverComponent.cs
+++ b/Content.Shared/Movement/Components/IMoverComponent.cs
@@ -22,6 +22,8 @@ namespace Content.Shared.Movement.Components
///
bool Sprinting { get; }
+ Angle LastGridAngle { get; set; }
+
///
/// Calculated linear velocity direction of the entity.
///
diff --git a/Content.Shared/Movement/Components/SharedDummyInputMoverComponent.cs b/Content.Shared/Movement/Components/SharedDummyInputMoverComponent.cs
index 6de12adabd..902d602414 100644
--- a/Content.Shared/Movement/Components/SharedDummyInputMoverComponent.cs
+++ b/Content.Shared/Movement/Components/SharedDummyInputMoverComponent.cs
@@ -12,6 +12,8 @@ namespace Content.Shared.Movement.Components
public float CurrentWalkSpeed => 0f;
public float CurrentSprintSpeed => 0f;
+ public Angle LastGridAngle { get => Angle.Zero; set {} }
+
public bool Sprinting => false;
public (Vector2 walking, Vector2 sprinting) VelocityDir => (Vector2.Zero, Vector2.Zero);
diff --git a/Content.Shared/Movement/Components/SharedPlayerInputMoverComponent.cs b/Content.Shared/Movement/Components/SharedPlayerInputMoverComponent.cs
index eed34bdad5..a060918822 100644
--- a/Content.Shared/Movement/Components/SharedPlayerInputMoverComponent.cs
+++ b/Content.Shared/Movement/Components/SharedPlayerInputMoverComponent.cs
@@ -50,6 +50,8 @@ namespace Content.Shared.Movement.Components
private MoveButtons _heldMoveButtons = MoveButtons.None;
+ public Angle LastGridAngle { get; set; } = new(0);
+
public float CurrentWalkSpeed => _movementSpeed?.CurrentWalkSpeed ?? MovementSpeedModifierComponent.DefaultBaseWalkSpeed;
public float CurrentSprintSpeed => _movementSpeed?.CurrentSprintSpeed ?? MovementSpeedModifierComponent.DefaultBaseSprintSpeed;
@@ -117,6 +119,7 @@ namespace Content.Shared.Movement.Components
{
base.Initialize();
Owner.EnsureComponentWarn();
+ LastGridAngle = Owner.Transform.Parent?.WorldRotation ?? new Angle(0);
}
///
diff --git a/Content.Shared/Movement/SharedMoverController.cs b/Content.Shared/Movement/SharedMoverController.cs
index 6bc0081f0e..dd1c89a5de 100644
--- a/Content.Shared/Movement/SharedMoverController.cs
+++ b/Content.Shared/Movement/SharedMoverController.cs
@@ -67,16 +67,21 @@ namespace Content.Shared.Movement
{
var (walkDir, sprintDir) = mover.VelocityDir;
+ var transform = mover.Owner.Transform;
+
// Regular movement.
// Target velocity.
- var total = (walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed);
+ var total = walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed;
- var worldTotal = _relativeMovement ? new Angle(mover.Owner.Transform.Parent!.WorldRotation.Theta).RotateVec(total) : total;
+ var worldTotal = _relativeMovement ? transform.Parent!.WorldRotation.RotateVec(total) : total;
+
+ if (transform.GridID == GridId.Invalid)
+ worldTotal = mover.LastGridAngle.RotateVec(worldTotal);
+ else
+ mover.LastGridAngle = transform.Parent!.WorldRotation;
if (worldTotal != Vector2.Zero)
- {
- mover.Owner.Transform.WorldRotation = worldTotal.GetDir().ToAngle();
- }
+ transform.WorldRotation = worldTotal.GetDir().ToAngle();
physicsComponent.LinearVelocity = worldTotal;
}
@@ -111,6 +116,8 @@ namespace Content.Shared.Movement
if (!touching)
{
+ if (transform.GridID != GridId.Invalid)
+ mover.LastGridAngle = transform.Parent!.WorldRotation;
transform.WorldRotation = physicsComponent.LinearVelocity.GetDir().ToAngle();
return;
}
@@ -119,18 +126,19 @@ namespace Content.Shared.Movement
// Regular movement.
// Target velocity.
// This is relative to the map / grid we're on.
- var total = (walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed);
+ var total = walkDir * mover.CurrentWalkSpeed + sprintDir * mover.CurrentSprintSpeed;
- var worldTotal = _relativeMovement ?
- new Angle(transform.Parent!.WorldRotation.Theta).RotateVec(total) :
- total;
+ var worldTotal = _relativeMovement ? transform.Parent!.WorldRotation.RotateVec(total) : total;
DebugTools.Assert(MathHelper.CloseToPercent(total.Length, worldTotal.Length));
if (weightless)
- {
worldTotal *= mobMover.WeightlessStrength;
- }
+
+ if (transform.GridID == GridId.Invalid)
+ worldTotal = mover.LastGridAngle.RotateVec(worldTotal);
+ else
+ mover.LastGridAngle = transform.Parent!.WorldRotation;
if (worldTotal != Vector2.Zero)
{