]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix for holoparasite's ability to attack the host through mech (#36659)
authornikitosych <boriszyn@gmail.com>
Sat, 14 Jun 2025 17:22:45 +0000 (19:22 +0200)
committerGitHub <noreply@github.com>
Sat, 14 Jun 2025 17:22:45 +0000 (20:22 +0300)
Content.Server/Guardian/GuardianSystem.cs
Content.Shared/Guardian/GuardianCreatorDoAfterEvent.cs
Content.Shared/Mech/EntitySystems/SharedMechSystem.Relay.cs [new file with mode: 0644]
Content.Shared/Mech/EntitySystems/SharedMechSystem.cs

index 3a0783c2eff03ac0b9cc89f1b2d77075f50ad7b8..ea1a6f4f4ff63bb874ddff2b29f312be292d88fc 100644 (file)
@@ -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<GuardianHostComponent, GuardianToggleActionEvent>(OnPerformAction);
 
             SubscribeLocalEvent<GuardianComponent, AttackAttemptEvent>(OnGuardianAttackAttempt);
+
+            SubscribeLocalEvent<GuardianHostComponent, MechPilotRelayedEvent<GettingAttackedAttemptEvent>>(OnPilotAttackAttempt);
         }
 
         private void OnGuardianShutdown(EntityUid uid, GuardianComponent component, ComponentShutdown args)
@@ -144,6 +147,16 @@ namespace Content.Server.Guardian
             args.Cancel();
         }
 
+        private void OnPilotAttackAttempt(Entity<GuardianHostComponent> uid, ref MechPilotRelayedEvent<GettingAttackedAttemptEvent> 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<GuardianComponent>(hostComponent.HostedGuardian, out var guardianComponent))
index 8addfa2ed15ac4de83ac7f7bb8dbc62eb1bdf82a..d918c32eca076497d1b928b889724cc90733cf8f 100644 (file)
@@ -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 (file)
index 0000000..64adb3a
--- /dev/null
@@ -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<MechComponent, GettingAttackedAttemptEvent>(RelayRefToPilot);
+    }
+
+    private void RelayToPilot<T>(Entity<MechComponent> uid, T args) where T : class
+    {
+        if (uid.Comp.PilotSlot.ContainedEntity is not { } pilot)
+            return;
+
+        var ev = new MechPilotRelayedEvent<T>(args);
+
+        RaiseLocalEvent(pilot, ref ev);
+    }
+
+    private void RelayRefToPilot<T>(Entity<MechComponent> uid, ref T args) where T :struct
+    {
+        if (uid.Comp.PilotSlot.ContainedEntity is not { } pilot)
+            return;
+
+        var ev = new MechPilotRelayedEvent<T>(args);
+
+        RaiseLocalEvent(pilot, ref ev);
+
+        args = ev.Args;
+    }
+}
+
+[ByRefEvent]
+public record struct MechPilotRelayedEvent<TEvent>(TEvent Args)
+{
+    public TEvent Args = Args;
+}
index 2ec48085c47dd7eb3e279e4468bdd36d055a1d78..ab0f658af0900ee191a4ff261862f60d8087e73f 100644 (file)
@@ -26,7 +26,7 @@ namespace Content.Shared.Mech.EntitySystems;
 /// <summary>
 /// Handles all of the interactions, UI handling, and items shennanigans for <see cref="MechComponent"/>
 /// </summary>
-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<MechPilotComponent, GetMeleeWeaponEvent>(OnGetMeleeWeapon);
         SubscribeLocalEvent<MechPilotComponent, CanAttackFromContainerEvent>(OnCanAttackFromContainer);
         SubscribeLocalEvent<MechPilotComponent, AttackAttemptEvent>(OnAttackAttempt);
+
+        InitializeRelay();
     }
 
     private void OnToggleEquipmentAction(EntityUid uid, MechComponent component, MechToggleEquipmentEvent args)