From 1bbf094c7967e08765b90b2f74a0e27195485069 Mon Sep 17 00:00:00 2001 From: nikitosych Date: Sat, 14 Jun 2025 19:22:45 +0200 Subject: [PATCH] Fix for holoparasite's ability to attack the host through mech (#36659) --- Content.Server/Guardian/GuardianSystem.cs | 13 ++++++ .../Guardian/GuardianCreatorDoAfterEvent.cs | 2 +- .../EntitySystems/SharedMechSystem.Relay.cs | 40 +++++++++++++++++++ .../Mech/EntitySystems/SharedMechSystem.cs | 4 +- 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 Content.Shared/Mech/EntitySystems/SharedMechSystem.Relay.cs diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index 3a0783c2ef..ea1a6f4f4f 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -10,6 +10,7 @@ using Content.Shared.Hands.EntitySystems; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; +using Content.Shared.Mech.EntitySystems; using Content.Shared.Mobs; using Content.Shared.Popups; using Robust.Shared.Audio.Systems; @@ -56,6 +57,8 @@ namespace Content.Server.Guardian SubscribeLocalEvent(OnPerformAction); SubscribeLocalEvent(OnGuardianAttackAttempt); + + SubscribeLocalEvent>(OnPilotAttackAttempt); } private void OnGuardianShutdown(EntityUid uid, GuardianComponent component, ComponentShutdown args) @@ -144,6 +147,16 @@ namespace Content.Server.Guardian args.Cancel(); } + private void OnPilotAttackAttempt(Entity uid, ref MechPilotRelayedEvent args) + { + if (args.Args.Cancelled) + return; + + _popupSystem.PopupCursor(Loc.GetString("guardian-attack-host"), args.Args.Attacker, PopupType.LargeCaution); + + args.Args.Cancelled = true; + } + public void ToggleGuardian(EntityUid user, GuardianHostComponent hostComponent) { if (!TryComp(hostComponent.HostedGuardian, out var guardianComponent)) diff --git a/Content.Shared/Guardian/GuardianCreatorDoAfterEvent.cs b/Content.Shared/Guardian/GuardianCreatorDoAfterEvent.cs index 8addfa2ed1..d918c32eca 100644 --- a/Content.Shared/Guardian/GuardianCreatorDoAfterEvent.cs +++ b/Content.Shared/Guardian/GuardianCreatorDoAfterEvent.cs @@ -1,4 +1,4 @@ -using Content.Shared.DoAfter; +using Content.Shared.DoAfter; using Robust.Shared.Serialization; namespace Content.Shared.Guardian; diff --git a/Content.Shared/Mech/EntitySystems/SharedMechSystem.Relay.cs b/Content.Shared/Mech/EntitySystems/SharedMechSystem.Relay.cs new file mode 100644 index 0000000000..64adb3a932 --- /dev/null +++ b/Content.Shared/Mech/EntitySystems/SharedMechSystem.Relay.cs @@ -0,0 +1,40 @@ +using Content.Shared.Interaction.Events; +using Content.Shared.Mech.Components; + +namespace Content.Shared.Mech.EntitySystems; + +public abstract partial class SharedMechSystem +{ + private void InitializeRelay() + { + SubscribeLocalEvent(RelayRefToPilot); + } + + private void RelayToPilot(Entity uid, T args) where T : class + { + if (uid.Comp.PilotSlot.ContainedEntity is not { } pilot) + return; + + var ev = new MechPilotRelayedEvent(args); + + RaiseLocalEvent(pilot, ref ev); + } + + private void RelayRefToPilot(Entity uid, ref T args) where T :struct + { + if (uid.Comp.PilotSlot.ContainedEntity is not { } pilot) + return; + + var ev = new MechPilotRelayedEvent(args); + + RaiseLocalEvent(pilot, ref ev); + + args = ev.Args; + } +} + +[ByRefEvent] +public record struct MechPilotRelayedEvent(TEvent Args) +{ + public TEvent Args = Args; +} diff --git a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs index 2ec48085c4..ab0f658af0 100644 --- a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs +++ b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs @@ -26,7 +26,7 @@ namespace Content.Shared.Mech.EntitySystems; /// /// Handles all of the interactions, UI handling, and items shennanigans for /// -public abstract class SharedMechSystem : EntitySystem +public abstract partial class SharedMechSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly INetManager _net = default!; @@ -55,6 +55,8 @@ public abstract class SharedMechSystem : EntitySystem SubscribeLocalEvent(OnGetMeleeWeapon); SubscribeLocalEvent(OnCanAttackFromContainer); SubscribeLocalEvent(OnAttackAttempt); + + InitializeRelay(); } private void OnToggleEquipmentAction(EntityUid uid, MechComponent component, MechToggleEquipmentEvent args)