]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Replace IClickAlert with events (#30728)
authorNemanja <98561806+EmoGarbage404@users.noreply.github.com>
Wed, 7 Aug 2024 05:15:35 +0000 (01:15 -0400)
committerGitHub <noreply@github.com>
Wed, 7 Aug 2024 05:15:35 +0000 (15:15 +1000)
* Replace IAlertClick with events

* whoop

* eek!

33 files changed:
Content.Client/Alerts/ClientAlertsSystem.cs
Content.Server/Abilities/Mime/MimePowersSystem.cs
Content.Server/Alert/Click/BreakVow.cs [deleted file]
Content.Server/Alert/Click/RemoveCuffs.cs [deleted file]
Content.Server/Alert/Click/RemoveEnsnare.cs [deleted file]
Content.Server/Alert/Click/ResistFire.cs [deleted file]
Content.Server/Alert/Click/RetakeVow.cs [deleted file]
Content.Server/Alert/Click/StopBeingPulled.cs [deleted file]
Content.Server/Alert/Click/StopPiloting.cs [deleted file]
Content.Server/Alert/Click/StopPulling.cs [deleted file]
Content.Server/Alert/Click/ToggleInternals.cs [deleted file]
Content.Server/Alert/Click/Unbuckle.cs [deleted file]
Content.Server/Atmos/EntitySystems/FlammableSystem.cs
Content.Server/Body/Components/InternalsComponent.cs
Content.Server/Body/Systems/InternalsSystem.cs
Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs
Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs
Content.Shared/Abilities/Mime/MimePowers.cs [new file with mode: 0644]
Content.Shared/Alert/AlertPrototype.cs
Content.Shared/Alert/AlertsSystem.cs
Content.Shared/Alert/IAlertClick.cs [deleted file]
Content.Shared/Atmos/Components/ExtinguishOnInteractComponent.cs
Content.Shared/Buckle/Components/BuckleComponent.cs
Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs
Content.Shared/Cuffs/Components/CuffableComponent.cs
Content.Shared/Cuffs/SharedCuffableSystem.cs
Content.Shared/Ensnaring/Components/EnsnareableComponent.cs
Content.Shared/Internals/InternalsDoAfterEvent.cs
Content.Shared/Movement/Pulling/Components/PullableComponent.cs
Content.Shared/Movement/Pulling/Components/PullerComponent.cs
Content.Shared/Movement/Pulling/Systems/PullingSystem.cs
Content.Shared/Shuttles/Components/PilotComponent.cs
Resources/Prototypes/Alerts/alerts.yml

index 359c8957f9d772e025eef2eba3d67de531390749..525ef1f018fc9c4b1bd0eda9b12e9229c312ff61 100644 (file)
@@ -93,6 +93,6 @@ public sealed class ClientAlertsSystem : AlertsSystem
 
     public void AlertClicked(ProtoId<AlertPrototype> alertType)
     {
-        RaiseNetworkEvent(new ClickAlertEvent(alertType));
+        RaisePredictiveEvent(new ClickAlertEvent(alertType));
     }
 }
index f3bf6e703f52efa7b74086140b1a71e35f766c0d..85230faab0f646f8afde0f31f6c6ac174cccc1d7 100644 (file)
@@ -1,4 +1,5 @@
 using Content.Server.Popups;
+using Content.Shared.Abilities.Mime;
 using Content.Shared.Actions;
 using Content.Shared.Actions.Events;
 using Content.Shared.Alert;
@@ -29,6 +30,9 @@ namespace Content.Server.Abilities.Mime
             base.Initialize();
             SubscribeLocalEvent<MimePowersComponent, ComponentInit>(OnComponentInit);
             SubscribeLocalEvent<MimePowersComponent, InvisibleWallActionEvent>(OnInvisibleWall);
+
+            SubscribeLocalEvent<MimePowersComponent, BreakVowAlertEvent>(OnBreakVowAlert);
+            SubscribeLocalEvent<MimePowersComponent, RetakeVowAlertEvent>(OnRetakeVowAlert);
         }
 
         public override void Update(float frameTime)
@@ -99,6 +103,22 @@ namespace Content.Server.Abilities.Mime
             args.Handled = true;
         }
 
+        private void OnBreakVowAlert(Entity<MimePowersComponent> ent, ref BreakVowAlertEvent args)
+        {
+            if (args.Handled)
+                return;
+            BreakVow(ent, ent);
+            args.Handled = true;
+        }
+
+        private void OnRetakeVowAlert(Entity<MimePowersComponent> ent, ref RetakeVowAlertEvent args)
+        {
+            if (args.Handled)
+                return;
+            RetakeVow(ent, ent);
+            args.Handled = true;
+        }
+
         /// <summary>
         /// Break this mime's vow to not speak.
         /// </summary>
diff --git a/Content.Server/Alert/Click/BreakVow.cs b/Content.Server/Alert/Click/BreakVow.cs
deleted file mode 100644 (file)
index 400dabb..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-using Content.Shared.Alert;
-using Content.Server.Abilities.Mime;
-
-namespace Content.Server.Alert.Click
-{
-    ///<summary>
-    /// Break your mime vows
-    ///</summary>
-    [DataDefinition]
-    public sealed partial class BreakVow : IAlertClick
-    {
-        public void AlertClicked(EntityUid player)
-        {
-            var entManager = IoCManager.Resolve<IEntityManager>();
-
-           if (entManager.TryGetComponent(player, out MimePowersComponent? mimePowers))
-           {
-                entManager.System<MimePowersSystem>().BreakVow(player, mimePowers);
-           }
-        }
-    }
-}
diff --git a/Content.Server/Alert/Click/RemoveCuffs.cs b/Content.Server/Alert/Click/RemoveCuffs.cs
deleted file mode 100644 (file)
index b554842..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-using Content.Server.Cuffs;
-using Content.Shared.Alert;
-using JetBrains.Annotations;
-
-namespace Content.Server.Alert.Click
-{
-    /// <summary>
-    ///     Try to remove handcuffs from yourself
-    /// </summary>
-    [UsedImplicitly]
-    [DataDefinition]
-    public sealed partial class RemoveCuffs : IAlertClick
-    {
-        public void AlertClicked(EntityUid player)
-        {
-            var entityManager = IoCManager.Resolve<IEntityManager>();
-            var cuffableSys = entityManager.System<CuffableSystem>();
-            cuffableSys.TryUncuff(player, player);
-        }
-    }
-}
diff --git a/Content.Server/Alert/Click/RemoveEnsnare.cs b/Content.Server/Alert/Click/RemoveEnsnare.cs
deleted file mode 100644 (file)
index c33f4ae..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-using Content.Server.Ensnaring;
-using Content.Shared.Alert;
-using Content.Shared.Ensnaring.Components;
-using JetBrains.Annotations;
-
-namespace Content.Server.Alert.Click;
-[UsedImplicitly]
-[DataDefinition]
-public sealed partial class RemoveEnsnare : IAlertClick
-{
-    public void AlertClicked(EntityUid player)
-    {
-        var entManager = IoCManager.Resolve<IEntityManager>();
-        if (entManager.TryGetComponent(player, out EnsnareableComponent? ensnareableComponent))
-        {
-            foreach (var ensnare in ensnareableComponent.Container.ContainedEntities)
-            {
-                if (!entManager.TryGetComponent(ensnare, out EnsnaringComponent? ensnaringComponent))
-                    return;
-
-                entManager.EntitySysManager.GetEntitySystem<EnsnareableSystem>().TryFree(player, player, ensnare, ensnaringComponent);
-
-                // Only one snare at a time.
-                break;
-            }
-        }
-    }
-}
diff --git a/Content.Server/Alert/Click/ResistFire.cs b/Content.Server/Alert/Click/ResistFire.cs
deleted file mode 100644 (file)
index 9ae49c3..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-using Content.Server.Atmos.Components;
-using Content.Server.Atmos.EntitySystems;
-using Content.Shared.Alert;
-using JetBrains.Annotations;
-
-namespace Content.Server.Alert.Click
-{
-    /// <summary>
-    /// Resist fire
-    /// </summary>
-    [UsedImplicitly]
-    [DataDefinition]
-    public sealed partial class ResistFire : IAlertClick
-    {
-        public void AlertClicked(EntityUid player)
-        {
-            var entManager = IoCManager.Resolve<IEntityManager>();
-
-            if (entManager.TryGetComponent(player, out FlammableComponent? flammable))
-            {
-                entManager.System<FlammableSystem>().Resist(player, flammable);
-            }
-        }
-    }
-}
diff --git a/Content.Server/Alert/Click/RetakeVow.cs b/Content.Server/Alert/Click/RetakeVow.cs
deleted file mode 100644 (file)
index 1b7a15e..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-using Content.Shared.Alert;
-using Content.Server.Abilities.Mime;
-
-namespace Content.Server.Alert.Click
-{
-    ///<summary>
-    /// Retake your mime vows
-    ///</summary>
-    [DataDefinition]
-    public sealed partial class RetakeVow : IAlertClick
-    {
-        public void AlertClicked(EntityUid player)
-        {
-            var entManager = IoCManager.Resolve<IEntityManager>();
-
-           if (entManager.TryGetComponent(player, out MimePowersComponent? mimePowers))
-           {
-                entManager.System<MimePowersSystem>().RetakeVow(player, mimePowers);
-           }
-        }
-    }
-}
diff --git a/Content.Server/Alert/Click/StopBeingPulled.cs b/Content.Server/Alert/Click/StopBeingPulled.cs
deleted file mode 100644 (file)
index b02da38..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-using Content.Shared.ActionBlocker;
-using Content.Shared.Alert;
-using Content.Shared.Movement.Pulling.Components;
-using Content.Shared.Movement.Pulling.Systems;
-using JetBrains.Annotations;
-
-namespace Content.Server.Alert.Click
-{
-    /// <summary>
-    /// Stop pulling something
-    /// </summary>
-    [UsedImplicitly]
-    [DataDefinition]
-    public sealed partial class StopBeingPulled : IAlertClick
-    {
-        public void AlertClicked(EntityUid player)
-        {
-            var entityManager = IoCManager.Resolve<IEntityManager>();
-
-            if (!entityManager.System<ActionBlockerSystem>().CanInteract(player, null))
-                return;
-
-            if (entityManager.TryGetComponent(player, out PullableComponent? playerPullable))
-            {
-                entityManager.System<PullingSystem>().TryStopPull(player, playerPullable, user: player);
-            }
-        }
-    }
-}
diff --git a/Content.Server/Alert/Click/StopPiloting.cs b/Content.Server/Alert/Click/StopPiloting.cs
deleted file mode 100644 (file)
index cd4e333..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-using Content.Server.Shuttles.Systems;
-using Content.Shared.Alert;
-using Content.Shared.Shuttles.Components;
-using JetBrains.Annotations;
-
-namespace Content.Server.Alert.Click
-{
-    /// <summary>
-    /// Stop piloting shuttle
-    /// </summary>
-    [UsedImplicitly]
-    [DataDefinition]
-    public sealed partial class StopPiloting : IAlertClick
-    {
-        public void AlertClicked(EntityUid player)
-        {
-            var entManager = IoCManager.Resolve<IEntityManager>();
-
-            if (entManager.TryGetComponent(player, out PilotComponent? pilotComponent)
-            && pilotComponent.Console != null)
-            {
-                entManager.System<ShuttleConsoleSystem>().RemovePilot(player, pilotComponent);
-            }
-        }
-    }
-}
diff --git a/Content.Server/Alert/Click/StopPulling.cs b/Content.Server/Alert/Click/StopPulling.cs
deleted file mode 100644 (file)
index 76f9569..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-using Content.Shared.Alert;
-using Content.Shared.Movement.Pulling.Components;
-using Content.Shared.Movement.Pulling.Systems;
-using JetBrains.Annotations;
-
-namespace Content.Server.Alert.Click
-{
-    /// <summary>
-    /// Stop pulling something
-    /// </summary>
-    [UsedImplicitly]
-    [DataDefinition]
-    public sealed partial class StopPulling : IAlertClick
-    {
-        public void AlertClicked(EntityUid player)
-        {
-            var entManager = IoCManager.Resolve<IEntityManager>();
-            var ps = entManager.System<PullingSystem>();
-
-            if (entManager.TryGetComponent(player, out PullerComponent? puller) &&
-                entManager.TryGetComponent(puller.Pulling, out PullableComponent? pullableComp))
-            {
-                ps.TryStopPull(puller.Pulling.Value, pullableComp, user: player);
-            }
-        }
-    }
-}
diff --git a/Content.Server/Alert/Click/ToggleInternals.cs b/Content.Server/Alert/Click/ToggleInternals.cs
deleted file mode 100644 (file)
index 523db04..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-using Content.Server.Body.Systems;
-using Content.Shared.Alert;
-using JetBrains.Annotations;
-
-namespace Content.Server.Alert.Click;
-
-/// <summary>
-/// Attempts to toggle the internals for a particular entity
-/// </summary>
-[UsedImplicitly]
-[DataDefinition]
-public sealed partial class ToggleInternals : IAlertClick
-{
-    public void AlertClicked(EntityUid player)
-    {
-        var internalsSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<InternalsSystem>();
-        internalsSystem.ToggleInternals(player, player, false);
-    }
-}
diff --git a/Content.Server/Alert/Click/Unbuckle.cs b/Content.Server/Alert/Click/Unbuckle.cs
deleted file mode 100644 (file)
index 3e53955..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-using Content.Shared.Alert;
-using Content.Shared.Buckle;
-using JetBrains.Annotations;
-
-namespace Content.Server.Alert.Click
-{
-    /// <summary>
-    /// Unbuckles if player is currently buckled.
-    /// </summary>
-       [UsedImplicitly]
-    [DataDefinition]
-    public sealed partial class Unbuckle : IAlertClick
-    {
-        public void AlertClicked(EntityUid player)
-        {
-            IoCManager.Resolve<IEntityManager>().System<SharedBuckleSystem>().TryUnbuckle(player, player);
-        }
-    }
-}
index dd0ac25d703b78933d074d6e0c2346fe3137454a..cc816a3f10efaed95de454ca1e6c2ee631ed7e99 100644 (file)
@@ -72,6 +72,7 @@ namespace Content.Server.Atmos.EntitySystems
             SubscribeLocalEvent<FlammableComponent, IsHotEvent>(OnIsHot);
             SubscribeLocalEvent<FlammableComponent, TileFireEvent>(OnTileFire);
             SubscribeLocalEvent<FlammableComponent, RejuvenateEvent>(OnRejuvenate);
+            SubscribeLocalEvent<FlammableComponent, ResistFireAlertEvent>(OnResistFireAlert);
 
             SubscribeLocalEvent<IgniteOnCollideComponent, StartCollideEvent>(IgniteOnCollide);
             SubscribeLocalEvent<IgniteOnCollideComponent, LandEvent>(OnIgniteLand);
@@ -250,6 +251,15 @@ namespace Content.Server.Atmos.EntitySystems
             Extinguish(uid, component);
         }
 
+        private void OnResistFireAlert(Entity<FlammableComponent> ent, ref ResistFireAlertEvent args)
+        {
+            if (args.Handled)
+                return;
+
+            Resist(ent, ent);
+            args.Handled = true;
+        }
+
         public void UpdateAppearance(EntityUid uid, FlammableComponent? flammable = null, AppearanceComponent? appearance = null)
         {
             if (!Resolve(uid, ref flammable, ref appearance))
index ef908f96553cd0b905981765caa75e861f60fee9..a7edab4a6b083b8f8f7e13b1ea6f9e945abf3885 100644 (file)
@@ -25,4 +25,5 @@ namespace Content.Server.Body.Components
         [DataField]
         public ProtoId<AlertPrototype> InternalsAlert = "Internals";
     }
+
 }
index e352b0a58a17a169693d6478e440c58c1b24d7d7..7e86cb6f07ea8962a391a42661d8be02fcd418c2 100644 (file)
@@ -38,6 +38,7 @@ public sealed class InternalsSystem : EntitySystem
         SubscribeLocalEvent<InternalsComponent, ComponentShutdown>(OnInternalsShutdown);
         SubscribeLocalEvent<InternalsComponent, GetVerbsEvent<InteractionVerb>>(OnGetInteractionVerbs);
         SubscribeLocalEvent<InternalsComponent, InternalsDoAfterEvent>(OnDoAfter);
+        SubscribeLocalEvent<InternalsComponent, ToggleInternalsAlertEvent>(OnToggleInternalsAlert);
 
         SubscribeLocalEvent<InternalsComponent, StartingGearEquippedEvent>(OnStartingGear);
     }
@@ -161,6 +162,14 @@ public sealed class InternalsSystem : EntitySystem
         args.Handled = true;
     }
 
+    private void OnToggleInternalsAlert(Entity<InternalsComponent> ent, ref ToggleInternalsAlertEvent args)
+    {
+        if (args.Handled)
+            return;
+        ToggleInternals(ent, ent, false, internals: ent.Comp);
+        args.Handled = true;
+    }
+
     private void OnInternalsStartup(Entity<InternalsComponent> ent, ref ComponentStartup args)
     {
         _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent));
index 51d3242ce4f2f111c70a2cce23008dba5a9619fb..c9dec3782ff2a3b09d19a5b7f189919253452fca 100644 (file)
@@ -28,6 +28,7 @@ public sealed partial class EnsnareableSystem
         SubscribeLocalEvent<EnsnaringComponent, StepTriggeredOffEvent>(OnStepTrigger);
         SubscribeLocalEvent<EnsnaringComponent, ThrowDoHitEvent>(OnThrowHit);
         SubscribeLocalEvent<EnsnaringComponent, AttemptPacifiedThrowEvent>(OnAttemptPacifiedThrow);
+        SubscribeLocalEvent<EnsnareableComponent, RemoveEnsnareAlertEvent>(OnRemoveEnsnareAlert);
     }
 
     private void OnAttemptPacifiedThrow(Entity<EnsnaringComponent> ent, ref AttemptPacifiedThrowEvent args)
@@ -35,6 +36,24 @@ public sealed partial class EnsnareableSystem
         args.Cancel("pacified-cannot-throw-snare");
     }
 
+    private void OnRemoveEnsnareAlert(Entity<EnsnareableComponent> ent, ref RemoveEnsnareAlertEvent args)
+    {
+        if (args.Handled)
+            return;
+
+        foreach (var ensnare in ent.Comp.Container.ContainedEntities)
+        {
+            if (!TryComp<EnsnaringComponent>(ensnare, out var ensnaringComponent))
+                return;
+
+            TryFree(ent, ent, ensnare, ensnaringComponent);
+
+            args.Handled = true;
+            // Only one snare at a time.
+            break;
+        }
+    }
+
     private void OnComponentRemove(EntityUid uid, EnsnaringComponent component, ComponentRemove args)
     {
         if (!TryComp<EnsnareableComponent>(component.Ensnared, out var ensnared))
index 7a19fd13b2e9dbc16ebd1f21035d57edfd7907f8..00a913aad867c67e6466464b8543dc6d79270241 100644 (file)
@@ -71,6 +71,7 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem
         SubscribeLocalEvent<UndockEvent>(OnUndock);
 
         SubscribeLocalEvent<PilotComponent, ComponentGetState>(OnGetState);
+        SubscribeLocalEvent<PilotComponent, StopPilotingAlertEvent>(OnStopPilotingAlert);
 
         SubscribeLocalEvent<FTLDestinationComponent, ComponentStartup>(OnFtlDestStartup);
         SubscribeLocalEvent<FTLDestinationComponent, ComponentShutdown>(OnFtlDestShutdown);
@@ -196,6 +197,14 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem
         args.State = new PilotComponentState(GetNetEntity(component.Console));
     }
 
+    private void OnStopPilotingAlert(Entity<PilotComponent> ent, ref StopPilotingAlertEvent args)
+    {
+        if (ent.Comp.Console != null)
+        {
+            RemovePilot(ent, ent);
+        }
+    }
+
     /// <summary>
     /// Returns the position and angle of all dockingcomponents.
     /// </summary>
diff --git a/Content.Shared/Abilities/Mime/MimePowers.cs b/Content.Shared/Abilities/Mime/MimePowers.cs
new file mode 100644 (file)
index 0000000..969d7a1
--- /dev/null
@@ -0,0 +1,7 @@
+using Content.Shared.Alert;
+
+namespace Content.Shared.Abilities.Mime;
+
+public sealed partial class BreakVowAlertEvent : BaseAlertEvent;
+
+public sealed partial class RetakeVowAlertEvent : BaseAlertEvent;
index f53da27c0dea15d50fec0c4ecd3cdcb347b1ea25..a82cbd3daf6b59adcd713535d8f953ad0c2e3291 100644 (file)
@@ -76,11 +76,11 @@ public sealed partial class AlertPrototype : IPrototype
     public bool SupportsSeverity => MaxSeverity != -1;
 
     /// <summary>
-    /// Defines what to do when the alert is clicked.
-    /// This will always be null on clientside.
+    /// Event raised on the user when they click on this alert.
+    /// Can be null.
     /// </summary>
-    [DataField(serverOnly: true)]
-    public IAlertClick? OnClick { get; private set; }
+    [DataField]
+    public BaseAlertEvent? ClickEvent;
 
     /// <param name="severity">severity level, if supported by this alert</param>
     /// <returns>the icon path to the texture for the provided severity level</returns>
@@ -114,3 +114,17 @@ public sealed partial class AlertPrototype : IPrototype
         return Icons[severity.Value - _minSeverity];
     }
 }
+
+[ImplicitDataDefinitionForInheritors]
+public abstract partial class BaseAlertEvent : HandledEntityEventArgs
+{
+    public EntityUid User;
+
+    public ProtoId<AlertPrototype> AlertId;
+
+    protected BaseAlertEvent(EntityUid user, ProtoId<AlertPrototype> alertId)
+    {
+        User = user;
+        AlertId = alertId;
+    }
+}
index 83c6fcd0dd74f015d6829092ff9564de895f5107..c8f2a8e6bcacd09a3bb9c78c2b4ec31150bbe480 100644 (file)
@@ -195,7 +195,7 @@ public abstract class AlertsSystem : EntitySystem
 
         SubscribeLocalEvent<AlertAutoRemoveComponent, EntityUnpausedEvent>(OnAutoRemoveUnPaused);
 
-        SubscribeNetworkEvent<ClickAlertEvent>(HandleClickAlert);
+        SubscribeAllEvent<ClickAlertEvent>(HandleClickAlert);
         SubscribeLocalEvent<PrototypesReloadedEventArgs>(HandlePrototypesReloaded);
         LoadPrototypes();
     }
@@ -328,7 +328,20 @@ public abstract class AlertsSystem : EntitySystem
             return;
         }
 
-        alert.OnClick?.AlertClicked(player.Value);
+        ActivateAlert(player.Value, alert);
+    }
+
+    public bool ActivateAlert(EntityUid user, AlertPrototype alert)
+    {
+        if (alert.ClickEvent is not { } clickEvent)
+            return false;
+
+        clickEvent.Handled = false;
+        clickEvent.User = user;
+        clickEvent.AlertId = alert.ID;
+
+        RaiseLocalEvent(user, (object) clickEvent, true);
+        return clickEvent.Handled;
     }
 
     private void OnPlayerAttached(EntityUid uid, AlertsComponent component, PlayerAttachedEvent args)
diff --git a/Content.Shared/Alert/IAlertClick.cs b/Content.Shared/Alert/IAlertClick.cs
deleted file mode 100644 (file)
index c11fc10..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-namespace Content.Shared.Alert
-{
-    /// <summary>
-    /// Defines what should happen when an alert is clicked.
-    /// </summary>
-    public interface IAlertClick
-    {
-        /// <summary>
-        /// Invoked on server side when user clicks an alert.
-        /// </summary>
-        /// <param name="player"></param>
-        void AlertClicked(EntityUid player);
-    }
-}
index 02c1e3eb2642a8aa7377acfce46f1ece33c9492d..cd3ecdd1c49b0f20646affae9672f9734e0efc64 100644 (file)
@@ -1,3 +1,4 @@
+using Content.Shared.Alert;
 using Robust.Shared.Audio;
 
 namespace Content.Shared.Atmos.Components;
@@ -27,3 +28,5 @@ public sealed partial class ExtinguishOnInteractComponent : Component
     [DataField]
     public LocId ExtinguishFailed = "candle-extinguish-failed";
 }
+
+public sealed partial class ResistFireAlertEvent : BaseAlertEvent;
index ee86e6d4de0f4e51d031c33bc0de4f0bf443e515..c4810e8af085bc88b9faa6eb9ffa143d374c5be0 100644 (file)
@@ -1,4 +1,5 @@
 using System.Diagnostics.CodeAnalysis;
+using Content.Shared.Alert;
 using Content.Shared.Interaction;
 using Robust.Shared.GameStates;
 using Robust.Shared.Serialization;
@@ -79,6 +80,7 @@ public sealed class BuckleState(NetEntity? buckledTo, bool dontCollide, TimeSpan
     public readonly TimeSpan? BuckleTime = buckleTime;
 }
 
+public sealed partial class UnbuckleAlertEvent : BaseAlertEvent;
 
 /// <summary>
 /// Event raised directed at a strap entity before some entity gets buckled to it.
index 0fbfd51d6985f45dad37b43851f220e74fe7b89e..4f91a29ebea1863cb10ba54f3a967f8eedcd1b07 100644 (file)
@@ -41,6 +41,7 @@ public abstract partial class SharedBuckleSystem
         SubscribeLocalEvent<BuckleComponent, StartPullAttemptEvent>(OnPullAttempt);
         SubscribeLocalEvent<BuckleComponent, BeingPulledAttemptEvent>(OnBeingPulledAttempt);
         SubscribeLocalEvent<BuckleComponent, PullStartedMessage>(OnPullStarted);
+        SubscribeLocalEvent<BuckleComponent, UnbuckleAlertEvent>(OnUnbuckleAlert);
 
         SubscribeLocalEvent<BuckleComponent, InsertIntoEntityStorageAttemptEvent>(OnBuckleInsertIntoEntityStorageAttempt);
 
@@ -86,6 +87,13 @@ public abstract partial class SharedBuckleSystem
         Unbuckle(ent!, args.PullerUid);
     }
 
+    private void OnUnbuckleAlert(Entity<BuckleComponent> ent, ref UnbuckleAlertEvent args)
+    {
+        if (args.Handled)
+            return;
+        args.Handled = TryUnbuckle(ent, ent, ent);
+    }
+
     #endregion
 
     #region Transform
index 4ddfe1b53ee12f8b1165022adf9e780387d509db..a7eba34d8ce9b05458df120382e8ced985e7d81e 100644 (file)
@@ -46,6 +46,8 @@ public sealed partial class CuffableComponent : Component
     public ProtoId<AlertPrototype> CuffedAlert = "Handcuffed";
 }
 
+public sealed partial class RemoveCuffsAlertEvent : BaseAlertEvent;
+
 [Serializable, NetSerializable]
 public sealed class CuffableComponentState : ComponentState
 {
index 8889e0c9710a20fbf55f37850131dd32b46474ca..d4cadcdbb84ec5c5e796e852f695d268bcc51fbf 100644 (file)
@@ -66,6 +66,7 @@ namespace Content.Shared.Cuffs
             SubscribeLocalEvent<CuffableComponent, RejuvenateEvent>(OnRejuvenate);
             SubscribeLocalEvent<CuffableComponent, ComponentInit>(OnStartup);
             SubscribeLocalEvent<CuffableComponent, AttemptStopPullingEvent>(HandleStopPull);
+            SubscribeLocalEvent<CuffableComponent, RemoveCuffsAlertEvent>(OnRemoveCuffsAlert);
             SubscribeLocalEvent<CuffableComponent, UpdateCanMoveEvent>(HandleMoveAttempt);
             SubscribeLocalEvent<CuffableComponent, IsEquippingAttemptEvent>(OnEquipAttempt);
             SubscribeLocalEvent<CuffableComponent, IsUnequippingAttemptEvent>(OnUnequipAttempt);
@@ -248,6 +249,14 @@ namespace Content.Shared.Cuffs
                 args.Cancelled = true;
         }
 
+        private void OnRemoveCuffsAlert(Entity<CuffableComponent> ent, ref RemoveCuffsAlertEvent args)
+        {
+            if (args.Handled)
+                return;
+            TryUncuff(ent, ent, cuffable: ent.Comp);
+            args.Handled = true;
+        }
+
         private void AddUncuffVerb(EntityUid uid, CuffableComponent component, GetVerbsEvent<Verb> args)
         {
             // Can the user access the cuffs, and is there even anything to uncuff?
index 2536fac4edcc561a5b61467f26a63ad98cee1b60..cd7824bb960b7c1a612d362f5151965919f6b2f3 100644 (file)
@@ -47,6 +47,8 @@ public sealed partial class EnsnareableComponent : Component
     public ProtoId<AlertPrototype> EnsnaredAlert = "Ensnared";
 }
 
+public sealed partial class RemoveEnsnareAlertEvent : BaseAlertEvent;
+
 [Serializable, NetSerializable]
 public sealed class EnsnareableComponentState : ComponentState
 {
index 13b6087ec0ee10e1d94dd97019650cc98962c602..9c0174b4fd20ea9b7999af88c9f5005c42779ee7 100644 (file)
@@ -1,4 +1,5 @@
-using Content.Shared.DoAfter;
+using Content.Shared.Alert;
+using Content.Shared.DoAfter;
 using Robust.Shared.Serialization;
 
 namespace Content.Shared.Internals;
@@ -7,3 +8,5 @@ namespace Content.Shared.Internals;
 public sealed partial class InternalsDoAfterEvent : SimpleDoAfterEvent
 {
 }
+
+public sealed partial class ToggleInternalsAlertEvent : BaseAlertEvent;
index 100cd9d6d3e6db70454f6b5ded5ee8b03c7ea6e9..aa44669fd14dc9aef9119b610ec49310a84ee7e0 100644 (file)
@@ -42,3 +42,5 @@ public sealed partial class PullableComponent : Component
     [DataField]
     public ProtoId<AlertPrototype> PulledAlert = "Pulled";
 }
+
+public sealed partial class StopBeingPulledAlertEvent : BaseAlertEvent;
index 32e4d9b1f31677abb54c0bbea872096f38d0a5b4..197d7cfd7c899ed5bd1253e8ec8c7bd98cb18762 100644 (file)
@@ -44,3 +44,5 @@ public sealed partial class PullerComponent : Component
     [DataField]
     public ProtoId<AlertPrototype> PullingAlert = "Pulling";
 }
+
+public sealed partial class StopPullingAlertEvent : BaseAlertEvent;
index 557c316e26de6bb64afd94d88134c531ec0b0a24..b5fc6948334aadab5241fc43184c77c1677678f8 100644 (file)
@@ -58,6 +58,7 @@ public sealed class PullingSystem : EntitySystem
         SubscribeLocalEvent<PullableComponent, GetVerbsEvent<Verb>>(AddPullVerbs);
         SubscribeLocalEvent<PullableComponent, EntGotInsertedIntoContainerMessage>(OnPullableContainerInsert);
         SubscribeLocalEvent<PullableComponent, ModifyUncuffDurationEvent>(OnModifyUncuffDuration);
+        SubscribeLocalEvent<PullableComponent, StopBeingPulledAlertEvent>(OnStopBeingPulledAlert);
 
         SubscribeLocalEvent<PullerComponent, AfterAutoHandleStateEvent>(OnAfterState);
         SubscribeLocalEvent<PullerComponent, EntGotInsertedIntoContainerMessage>(OnPullerContainerInsert);
@@ -65,6 +66,7 @@ public sealed class PullingSystem : EntitySystem
         SubscribeLocalEvent<PullerComponent, VirtualItemDeletedEvent>(OnVirtualItemDeleted);
         SubscribeLocalEvent<PullerComponent, RefreshMovementSpeedModifiersEvent>(OnRefreshMovespeed);
         SubscribeLocalEvent<PullerComponent, DropHandItemsEvent>(OnDropHandItems);
+        SubscribeLocalEvent<PullerComponent, StopPullingAlertEvent>(OnStopPullingAlert);
 
         SubscribeLocalEvent<PullableComponent, StrappedEvent>(OnBuckled);
         SubscribeLocalEvent<PullableComponent, BuckledEvent>(OnGotBuckled);
@@ -105,6 +107,15 @@ public sealed class PullingSystem : EntitySystem
         TryStopPull(pullerComp.Pulling.Value, pullableComp, uid);
     }
 
+    private void OnStopPullingAlert(Entity<PullerComponent> ent, ref StopPullingAlertEvent args)
+    {
+        if (args.Handled)
+            return;
+        if (!TryComp<PullableComponent>(ent.Comp.Pulling, out var pullable))
+            return;
+        args.Handled = TryStopPull(ent.Comp.Pulling.Value, pullable, ent);
+    }
+
     private void OnPullerContainerInsert(Entity<PullerComponent> ent, ref EntGotInsertedIntoContainerMessage args)
     {
         if (ent.Comp.Pulling == null)
@@ -133,6 +144,14 @@ public sealed class PullingSystem : EntitySystem
         args.Duration *= 2;
     }
 
+    private void OnStopBeingPulledAlert(Entity<PullableComponent> ent, ref StopBeingPulledAlertEvent args)
+    {
+        if (args.Handled)
+            return;
+
+        args.Handled = TryStopPull(ent, ent, ent);
+    }
+
     public override void Shutdown()
     {
         base.Shutdown();
@@ -491,6 +510,9 @@ public sealed class PullingSystem : EntitySystem
         if (pullerUidNull == null)
             return true;
 
+        if (user != null && !_blocker.CanInteract(user.Value, pullableUid))
+            return false;
+
         var msg = new AttemptStopPullingEvent(user);
         RaiseLocalEvent(pullableUid, msg, true);
 
index cb42db4436fc1abe3fed92672d50af155a6f46d1..8823d309c3f56e1125cbe0fc940db6a911c78916 100644 (file)
@@ -39,4 +39,6 @@ namespace Content.Shared.Shuttles.Components
 
         public override bool SendOnlyToOwner => true;
     }
+
+    public sealed partial class StopPilotingAlertEvent : BaseAlertEvent;
 }
index c08453460f4fdd01ecc2803b21c9105479725e76..ff66f2586b07ce03428dedaae5910ee00f528832 100644 (file)
@@ -87,7 +87,7 @@
 - type: alert
   id: Fire
   icons: [ /Textures/Interface/Alerts/Fire/fire.png ]
-  onClick: !type:ResistFire  { }
+  clickEvent: !type:ResistFireAlertEvent
   name: alerts-on-fire-name
   description: alerts-on-fire-desc
 
 
 - type: alert
   id: Handcuffed
-  onClick: !type:RemoveCuffs  { }
+  clickEvent: !type:RemoveCuffsAlertEvent
   icons: [ /Textures/Interface/Alerts/Handcuffed/Handcuffed.png ]
   name: alerts-handcuffed-name
   description: alerts-handcuffed-desc
 
 - type: alert
   id: Ensnared
-  onClick: !type:RemoveEnsnare  { }
+  clickEvent: !type:RemoveEnsnareAlertEvent
   icons:
   - sprite: /Textures/Interface/Alerts/ensnared.rsi
     state: ensnared
 - type: alert
   id: Buckled
   category: Buckled
-  onClick: !type:Unbuckle  { }
+  clickEvent: !type:UnbuckleAlertEvent
   icons: [ /Textures/Interface/Alerts/Buckle/buckled.png ]
   name: alerts-buckled-name
   description: alerts-buckled-desc
 - type: alert
   id: Internals
   category: Internals
-  onClick: !type:ToggleInternals {}
+  clickEvent: !type:ToggleInternalsAlertEvent
   icons:
   - sprite: /Textures/Interface/Alerts/internals.rsi
     state: internal0
 - type: alert
   id: PilotingShuttle
   category: Piloting
-  onClick: !type:StopPiloting { }
+  clickEvent: !type:StopPilotingAlertEvent
   icons: [ /Textures/Interface/Alerts/piloting.png ]
   name: alerts-piloting-name
   description: alerts-piloting-desc
   id: VowOfSilence
   icons: [ /Textures/Interface/Alerts/Abilities/silenced.png ]
   name: alerts-vow-silence-name
-  onClick: !type:BreakVow  { }
+  clickEvent: !type:BreakVowAlertEvent
   description: alerts-vow-silence-desc
 
 - type: alert
   id: VowBroken
   icons: [ /Textures/Interface/Actions/scream.png ]
   name: alerts-vow-broken-name
-  onClick: !type:RetakeVow  { }
+  clickEvent: !type:RetakeVowAlertEvent
   description: alerts-vow-broken-desc
 
 - type: alert
   id: Pulled
   icons: [ /Textures/Interface/Alerts/Pull/pulled.png ]
-  onClick: !type:StopBeingPulled  { }
+  clickEvent: !type:StopBeingPulledAlertEvent
   name: alerts-pulled-name
   description: alerts-pulled-desc
 
 - type: alert
   id: Pulling
   icons: [ /Textures/Interface/Alerts/Pull/pulling.png ]
-  onClick: !type:StopPulling  { }
+  clickEvent: !type:StopPullingAlertEvent
   name: alerts-pulling-name
   description: alerts-pulling-desc