From e4de2fdd6c241238feba47d7c5cdd54fc9c022c6 Mon Sep 17 00:00:00 2001 From: Kevin Zheng Date: Mon, 25 Sep 2023 18:21:31 -0800 Subject: [PATCH] Prevent pull-moving (#20502) --- Content.Server/Physics/Controllers/PullController.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Content.Server/Physics/Controllers/PullController.cs b/Content.Server/Physics/Controllers/PullController.cs index abe4d42bf679..8f58f807aaee 100644 --- a/Content.Server/Physics/Controllers/PullController.cs +++ b/Content.Server/Physics/Controllers/PullController.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Shared.ActionBlocker; using Content.Shared.Gravity; using Content.Shared.Pulling; using Content.Shared.Pulling.Components; @@ -37,6 +38,7 @@ public sealed class PullController : VirtualController // How much you must move for the puller movement check to actually hit. private const float MinimumMovementDistance = 0.005f; + [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedPullingSystem _pullableSystem = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; @@ -191,9 +193,10 @@ public override void UpdateBeforeSolve(bool prediction, float frameTime) var impulse = accel * physics.Mass * frameTime; PhysicsSystem.ApplyLinearImpulse(pullableEnt, impulse, body: physics); - // if the puller is weightless, then we apply the inverse impulse. + // if the puller is weightless or can't move, then we apply the inverse impulse (Newton's third law). // doing it under gravity produces an unsatisfying wiggling when pulling. - if (_gravity.IsWeightless(puller) && pullerXform.GridUid == null) + // If player can't move, assume they are on a chair and we need to prevent pull-moving. + if ((_gravity.IsWeightless(puller) && pullerXform.GridUid == null) || !_actionBlockerSystem.CanMove(puller)) { PhysicsSystem.WakeBody(puller); PhysicsSystem.ApplyLinearImpulse(puller, -impulse);