From f5b4e461b3937818ed4090e6ee503fe548c72e25 Mon Sep 17 00:00:00 2001 From: Saphire Lattice Date: Tue, 2 Nov 2021 20:35:02 +0700 Subject: [PATCH] Make humans move based on their last grid's angle (#5122) * Make humans move based on their last grid's angle * Fix ghost movement, fix weightless grid parenting * Make sure to init the last grid angle without needing to move --- .../AI/Components/AiControllerComponent.cs | 2 ++ .../Movement/Components/IMoverComponent.cs | 2 ++ .../SharedDummyInputMoverComponent.cs | 2 ++ .../SharedPlayerInputMoverComponent.cs | 3 ++ .../Movement/SharedMoverController.cs | 30 ++++++++++++------- 5 files changed, 28 insertions(+), 11 deletions(-) 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) {