From 037a7d7d3d53a623f70a07908299e8fc4df1b4a5 Mon Sep 17 00:00:00 2001 From: ShadowCommander Date: Sat, 13 Apr 2024 08:36:05 -0700 Subject: [PATCH] Fix pulling a new entity when already pulling an entity (#26499) Fix pulling when already pulling The TryStopPull were failing due to wrong arguments provided. Replacing the virtual item in hand with a different pull was failing due to the hand not being cleared. Fix stop pulling checks that had the wrong variables provided. VirtualItems are already queue deleted at the end of HandleEntityRemoved. --- Content.Server/Hands/Systems/HandsSystem.cs | 5 +--- .../Movement/Pulling/Systems/PullingSystem.cs | 25 ++++++++----------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index bfd6393790..e7527e2c76 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -9,7 +9,6 @@ using Content.Shared.Damage.Systems; using Content.Shared.Explosion; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; -using Content.Shared.IdentityManagement; using Content.Shared.Input; using Content.Shared.Inventory.VirtualItem; using Content.Shared.Movement.Pulling.Components; @@ -17,8 +16,6 @@ using Content.Shared.Movement.Pulling.Events; using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Stacks; using Content.Shared.Throwing; -using Robust.Shared.Audio; -using Robust.Shared.Audio.Systems; using Robust.Shared.GameStates; using Robust.Shared.Input.Binding; using Robust.Shared.Map; @@ -160,7 +157,7 @@ namespace Content.Server.Hands.Systems continue; } - QueueDel(hand.HeldEntity.Value); + TryDrop(args.PullerUid, hand, handsComp: component); break; } } diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index acca7aafd0..3c265d5a02 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -301,7 +301,9 @@ public sealed class PullingSystem : EntitySystem return false; } - if (pullerComp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) + if (pullerComp.NeedsHands + && !_handsSystem.TryGetEmptyHand(puller, out _) + && pullerComp.Pulling == null) { return false; } @@ -365,7 +367,7 @@ public sealed class PullingSystem : EntitySystem return TogglePull(puller.Pulling.Value, pullerUid, pullable); } - public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, EntityUid? user = null, + public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, PullerComponent? pullerComp = null, PullableComponent? pullableComp = null) { if (!Resolve(pullerUid, ref pullerComp, false) || @@ -387,23 +389,18 @@ public sealed class PullingSystem : EntitySystem } // Ensure that the puller is not currently pulling anything. - var oldPullable = pullerComp.Pulling; + if (TryComp(pullerComp.Pulling, out var oldPullable) + && !TryStopPull(pullerComp.Pulling.Value, oldPullable, pullerUid)) + return false; - if (oldPullable != null) - { - // Well couldn't stop the old one. - if (!TryStopPull(oldPullable.Value, pullableComp, user)) - return false; - } - - // Is the pullable currently being pulled by something else? + // Stop anyone else pulling the entity we want to pull if (pullableComp.Puller != null) { - // Uhhh + // We're already pulling this item if (pullableComp.Puller == pullerUid) return false; - if (!TryStopPull(pullableUid, pullableComp, pullerUid)) + if (!TryStopPull(pullableUid, pullableComp, pullableComp.Puller)) return false; } @@ -469,7 +466,7 @@ public sealed class PullingSystem : EntitySystem var pullerUidNull = pullable.Puller; if (pullerUidNull == null) - return false; + return true; var msg = new AttemptStopPullingEvent(user); RaiseLocalEvent(pullableUid, msg, true);