From 8bc5f29f9f5507b8de442fdd0af24bbbb6d2d707 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 17 Dec 2022 14:47:15 +1100 Subject: [PATCH] Prevent subfloor melee attacks (#12899) Co-authored-by: DrSmugleaf --- .../ActionBlocker/ActionBlockerSystem.cs | 12 +++++++++++- .../Events/GettingAttackedAttemptEvent.cs | 7 +++++++ .../SubFloor/SharedSubFloorHideSystem.cs | 7 +++++++ .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 17 +++++++++++++++-- 4 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 Content.Shared/Interaction/Events/GettingAttackedAttemptEvent.cs diff --git a/Content.Shared/ActionBlocker/ActionBlockerSystem.cs b/Content.Shared/ActionBlocker/ActionBlockerSystem.cs index 352135be22..6cc80feb38 100644 --- a/Content.Shared/ActionBlocker/ActionBlockerSystem.cs +++ b/Content.Shared/ActionBlocker/ActionBlockerSystem.cs @@ -156,7 +156,17 @@ namespace Content.Shared.ActionBlocker var ev = new AttackAttemptEvent(uid, target); RaiseLocalEvent(uid, ev); - return !ev.Cancelled; + if (ev.Cancelled) + return false; + + if (target != null) + { + var tev = new GettingAttackedAttemptEvent(); + RaiseLocalEvent(target.Value, ref tev); + return !tev.Cancelled; + } + + return true; } public bool CanChangeDirection(EntityUid uid) diff --git a/Content.Shared/Interaction/Events/GettingAttackedAttemptEvent.cs b/Content.Shared/Interaction/Events/GettingAttackedAttemptEvent.cs new file mode 100644 index 0000000000..ed7379fd72 --- /dev/null +++ b/Content.Shared/Interaction/Events/GettingAttackedAttemptEvent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.Interaction.Events; + +/// +/// Raised directed on the target entity when being attacked. +/// +[ByRefEvent] +public record struct GettingAttackedAttemptEvent(bool Cancelled); diff --git a/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs b/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs index 87951475a4..33f42efd99 100644 --- a/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs +++ b/Content.Shared/SubFloor/SharedSubFloorHideSystem.cs @@ -31,6 +31,13 @@ namespace Content.Shared.SubFloor // Like 80% sure this doesn't need to handle re-anchoring. SubscribeLocalEvent(HandleAnchorChanged); SubscribeLocalEvent(OnInteractionAttempt); + SubscribeLocalEvent(OnAttackAttempt); + } + + private void OnAttackAttempt(EntityUid uid, SubFloorHideComponent component, ref GettingAttackedAttemptEvent args) + { + if (component.BlockInteractions && component.IsUnderCover) + args.Cancelled = true; } private void OnInteractionAttempt(EntityUid uid, SubFloorHideComponent component, GettingInteractedWithAttemptEvent args) diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 9340407f8b..4db68335d9 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -295,8 +295,21 @@ public abstract class SharedMeleeWeaponSystem : EntitySystem if (!CombatMode.IsInCombatMode(user)) return; - if (!Blocker.CanAttack(user)) - return; + switch (attack) + { + case LightAttackEvent light: + if (!Blocker.CanAttack(user, light.Target)) + return; + break; + case DisarmAttackEvent disarm: + if (!Blocker.CanAttack(user, disarm.Target)) + return; + break; + default: + if (!Blocker.CanAttack(user)) + return; + break; + } // Windup time checked elsewhere.