From 2315ea6ac295b4e60e12a150cadb94204762ebce Mon Sep 17 00:00:00 2001 From: Hayden Date: Sun, 7 Sep 2025 18:34:00 -0600 Subject: [PATCH] Being grappled with a grapple gun allows you to cross chasms (#39983) * Being grappled with a grapple gun allows you to cross chasms Closes #31698 * Update Content.Shared/Weapons/Misc/SharedGrapplingGunSystem.cs * AAAAAAAAAAAAAAAAA --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- Content.Shared/Chasm/ChasmSystem.cs | 11 +++++++--- .../Weapons/Misc/SharedGrapplingGunSystem.cs | 20 +++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Chasm/ChasmSystem.cs b/Content.Shared/Chasm/ChasmSystem.cs index 86b8d4fc4d..ab5c32eddd 100644 --- a/Content.Shared/Chasm/ChasmSystem.cs +++ b/Content.Shared/Chasm/ChasmSystem.cs @@ -1,11 +1,9 @@ using Content.Shared.ActionBlocker; -using Content.Shared.Buckle.Components; using Content.Shared.Movement.Events; using Content.Shared.StepTrigger.Systems; -using Robust.Shared.Audio; +using Content.Shared.Weapons.Misc; using Robust.Shared.Audio.Systems; using Robust.Shared.Network; -using Robust.Shared.Physics.Components; using Robust.Shared.Timing; namespace Content.Shared.Chasm; @@ -19,6 +17,7 @@ public sealed class ChasmSystem : EntitySystem [Dependency] private readonly ActionBlockerSystem _blocker = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedGrapplingGunSystem _grapple = default!; public override void Initialize() { @@ -69,6 +68,12 @@ public sealed class ChasmSystem : EntitySystem private void OnStepTriggerAttempt(EntityUid uid, ChasmComponent component, ref StepTriggerAttemptEvent args) { + if (_grapple.IsEntityHooked(args.Tripper)) + { + args.Cancelled = true; + return; + } + args.Continue = true; } diff --git a/Content.Shared/Weapons/Misc/SharedGrapplingGunSystem.cs b/Content.Shared/Weapons/Misc/SharedGrapplingGunSystem.cs index d27efa4d76..af4a376bd0 100644 --- a/Content.Shared/Weapons/Misc/SharedGrapplingGunSystem.cs +++ b/Content.Shared/Weapons/Misc/SharedGrapplingGunSystem.cs @@ -40,6 +40,7 @@ public abstract class SharedGrapplingGunSystem : EntitySystem SubscribeLocalEvent(OnWeightlessMove); SubscribeAllEvent(OnGrapplingReel); + // TODO: After step trigger refactor, dropping a grappling gun should manually try and activate step triggers it's suppressing. SubscribeLocalEvent(OnGrapplingShot); SubscribeLocalEvent(OnGunActivate); SubscribeLocalEvent(OnGrapplingDeselected); @@ -203,6 +204,25 @@ public abstract class SharedGrapplingGunSystem : EntitySystem } } + /// + /// Checks whether the entity is hooked to something via grappling gun. + /// + /// Entity to check. + /// True if hooked, false otherwise. + public bool IsEntityHooked(Entity entity) + { + if (!Resolve(entity, ref entity.Comp)) + return false; + + foreach (var uid in entity.Comp.Relayed) + { + if (HasComp(uid)) + return true; + } + + return false; + } + private void OnGrappleCollide(EntityUid uid, GrapplingProjectileComponent component, ref ProjectileEmbedEvent args) { if (!Timing.IsFirstTimePredicted)