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>
This commit is contained in:
Hayden
2025-09-07 18:34:00 -06:00
committed by GitHub
parent 946e9cc2cd
commit 2315ea6ac2
2 changed files with 28 additions and 3 deletions

View File

@@ -1,11 +1,9 @@
using Content.Shared.ActionBlocker; using Content.Shared.ActionBlocker;
using Content.Shared.Buckle.Components;
using Content.Shared.Movement.Events; using Content.Shared.Movement.Events;
using Content.Shared.StepTrigger.Systems; using Content.Shared.StepTrigger.Systems;
using Robust.Shared.Audio; using Content.Shared.Weapons.Misc;
using Robust.Shared.Audio.Systems; using Robust.Shared.Audio.Systems;
using Robust.Shared.Network; using Robust.Shared.Network;
using Robust.Shared.Physics.Components;
using Robust.Shared.Timing; using Robust.Shared.Timing;
namespace Content.Shared.Chasm; namespace Content.Shared.Chasm;
@@ -19,6 +17,7 @@ public sealed class ChasmSystem : EntitySystem
[Dependency] private readonly ActionBlockerSystem _blocker = default!; [Dependency] private readonly ActionBlockerSystem _blocker = default!;
[Dependency] private readonly INetManager _net = default!; [Dependency] private readonly INetManager _net = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedGrapplingGunSystem _grapple = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -69,6 +68,12 @@ public sealed class ChasmSystem : EntitySystem
private void OnStepTriggerAttempt(EntityUid uid, ChasmComponent component, ref StepTriggerAttemptEvent args) private void OnStepTriggerAttempt(EntityUid uid, ChasmComponent component, ref StepTriggerAttemptEvent args)
{ {
if (_grapple.IsEntityHooked(args.Tripper))
{
args.Cancelled = true;
return;
}
args.Continue = true; args.Continue = true;
} }

View File

@@ -40,6 +40,7 @@ public abstract class SharedGrapplingGunSystem : EntitySystem
SubscribeLocalEvent<CanWeightlessMoveEvent>(OnWeightlessMove); SubscribeLocalEvent<CanWeightlessMoveEvent>(OnWeightlessMove);
SubscribeAllEvent<RequestGrapplingReelMessage>(OnGrapplingReel); SubscribeAllEvent<RequestGrapplingReelMessage>(OnGrapplingReel);
// TODO: After step trigger refactor, dropping a grappling gun should manually try and activate step triggers it's suppressing.
SubscribeLocalEvent<GrapplingGunComponent, GunShotEvent>(OnGrapplingShot); SubscribeLocalEvent<GrapplingGunComponent, GunShotEvent>(OnGrapplingShot);
SubscribeLocalEvent<GrapplingGunComponent, ActivateInWorldEvent>(OnGunActivate); SubscribeLocalEvent<GrapplingGunComponent, ActivateInWorldEvent>(OnGunActivate);
SubscribeLocalEvent<GrapplingGunComponent, HandDeselectedEvent>(OnGrapplingDeselected); SubscribeLocalEvent<GrapplingGunComponent, HandDeselectedEvent>(OnGrapplingDeselected);
@@ -203,6 +204,25 @@ public abstract class SharedGrapplingGunSystem : EntitySystem
} }
} }
/// <summary>
/// Checks whether the entity is hooked to something via grappling gun.
/// </summary>
/// <param name="entity">Entity to check.</param>
/// <returns>True if hooked, false otherwise.</returns>
public bool IsEntityHooked(Entity<JointRelayTargetComponent?> entity)
{
if (!Resolve(entity, ref entity.Comp))
return false;
foreach (var uid in entity.Comp.Relayed)
{
if (HasComp<GrapplingGunComponent>(uid))
return true;
}
return false;
}
private void OnGrappleCollide(EntityUid uid, GrapplingProjectileComponent component, ref ProjectileEmbedEvent args) private void OnGrappleCollide(EntityUid uid, GrapplingProjectileComponent component, ref ProjectileEmbedEvent args)
{ {
if (!Timing.IsFirstTimePredicted) if (!Timing.IsFirstTimePredicted)