]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
RemoveComponentsOnTrigger, ToggleComponentsOnTrigger (#39639)
authorslarticodefast <161409025+slarticodefast@users.noreply.github.com>
Thu, 14 Aug 2025 14:18:56 +0000 (16:18 +0200)
committerGitHub <noreply@github.com>
Thu, 14 Aug 2025 14:18:56 +0000 (16:18 +0200)
Content.Shared/Trigger/Components/Effects/RemoveComponentsOnTriggerComponent.cs [new file with mode: 0644]
Content.Shared/Trigger/Components/Effects/ToggleComponentsOnTriggerComponent.cs [new file with mode: 0644]
Content.Shared/Trigger/Systems/AddComponentsOnTriggerSystem.cs [deleted file]
Content.Shared/Trigger/Systems/ComponentsOnTriggerSystem.cs [new file with mode: 0644]

diff --git a/Content.Shared/Trigger/Components/Effects/RemoveComponentsOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/RemoveComponentsOnTriggerComponent.cs
new file mode 100644 (file)
index 0000000..e69bf42
--- /dev/null
@@ -0,0 +1,35 @@
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Trigger.Components.Effects;
+
+/// <summary>
+/// Removes the specified components when triggered.
+/// If TargetUser is true they will be from the user instead.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class RemoveComponentsOnTriggerComponent : BaseXOnTriggerComponent
+{
+    /// <summary>
+    /// The list of components that will be removed.
+    /// </summary>
+    /// <summary>
+    /// TODO: Using a ComponentRegistry for this is cursed because it stores all the datafields along with it,
+    /// but ComponentNameSerializer will complain if you have components that are not in shared.
+    /// </summary>
+    [DataField(required: true)]
+    public ComponentRegistry Components = new();
+
+    /// <summary>
+    /// If this component has been triggered at least once already.
+    /// If this is true the components have been removed.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public bool Triggered = false;
+
+    /// <summary>
+    /// If this effect can only be triggered once.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public bool TriggerOnce = false;
+}
diff --git a/Content.Shared/Trigger/Components/Effects/ToggleComponentsOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/ToggleComponentsOnTriggerComponent.cs
new file mode 100644 (file)
index 0000000..4ce5652
--- /dev/null
@@ -0,0 +1,31 @@
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Trigger.Components.Effects;
+
+/// <summary>
+/// Adds or removes the specified components when triggered.
+/// If TargetUser is true they will be added to or removed from the user instead.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class ToggleComponentsOnTriggerComponent : BaseXOnTriggerComponent
+{
+    /// <summary>
+    /// The list of components that will be added/removed.
+    /// </summary>
+    [DataField(required: true)]
+    public ComponentRegistry Components = new();
+
+    /// <summary>
+    /// Are the components currently added?
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public bool ComponentsAdded;
+
+    /// <summary>
+    /// Should components that already exist on the entity be overwritten?
+    /// (They will still be removed when toggling again).
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public bool RemoveExisting = false;
+}
diff --git a/Content.Shared/Trigger/Systems/AddComponentsOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/AddComponentsOnTriggerSystem.cs
deleted file mode 100644 (file)
index 908307d..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-using Content.Shared.Trigger.Components.Effects;
-
-namespace Content.Shared.Trigger.Systems;
-
-public sealed partial class AddComponentsOnTriggerSystem : EntitySystem
-{
-    public override void Initialize()
-    {
-        base.Initialize();
-
-        SubscribeLocalEvent<AddComponentsOnTriggerComponent, TriggerEvent>(OnTrigger);
-    }
-
-    private void OnTrigger(Entity<AddComponentsOnTriggerComponent> ent, ref TriggerEvent args)
-    {
-        if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
-            return;
-
-        var target = ent.Comp.TargetUser ? args.User : ent.Owner;
-
-        if (target == null)
-            return;
-
-        if (ent.Comp.TriggerOnce && ent.Comp.Triggered)
-            return;
-
-        EntityManager.AddComponents(target.Value, ent.Comp.Components, ent.Comp.RemoveExisting);
-        ent.Comp.Triggered = true;
-        Dirty(ent);
-
-        args.Handled = true;
-    }
-}
diff --git a/Content.Shared/Trigger/Systems/ComponentsOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/ComponentsOnTriggerSystem.cs
new file mode 100644 (file)
index 0000000..f4e144b
--- /dev/null
@@ -0,0 +1,76 @@
+using Content.Shared.Trigger.Components.Effects;
+
+namespace Content.Shared.Trigger.Systems;
+
+public sealed partial class ComponentsOnTriggerSystem : EntitySystem
+{
+    public override void Initialize()
+    {
+        base.Initialize();
+
+        SubscribeLocalEvent<AddComponentsOnTriggerComponent, TriggerEvent>(HandleAddTrigger);
+        SubscribeLocalEvent<RemoveComponentsOnTriggerComponent, TriggerEvent>(HandleRemoveTrigger);
+        SubscribeLocalEvent<ToggleComponentsOnTriggerComponent, TriggerEvent>(HandleToggleTrigger);
+    }
+
+    private void HandleAddTrigger(Entity<AddComponentsOnTriggerComponent> ent, ref TriggerEvent args)
+    {
+        if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
+            return;
+
+        var target = ent.Comp.TargetUser ? args.User : ent.Owner;
+
+        if (target == null)
+            return;
+
+        if (ent.Comp.TriggerOnce && ent.Comp.Triggered)
+            return;
+
+        EntityManager.AddComponents(target.Value, ent.Comp.Components, ent.Comp.RemoveExisting);
+        ent.Comp.Triggered = true;
+        Dirty(ent);
+
+        args.Handled = true;
+    }
+
+    private void HandleRemoveTrigger(Entity<RemoveComponentsOnTriggerComponent> ent, ref TriggerEvent args)
+    {
+        if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
+            return;
+
+        var target = ent.Comp.TargetUser ? args.User : ent.Owner;
+
+        if (target == null)
+            return;
+
+        if (ent.Comp.TriggerOnce && ent.Comp.Triggered)
+            return;
+
+        EntityManager.RemoveComponents(target.Value, ent.Comp.Components);
+        ent.Comp.Triggered = true;
+        Dirty(ent);
+
+        args.Handled = true;
+    }
+
+    private void HandleToggleTrigger(Entity<ToggleComponentsOnTriggerComponent> ent, ref TriggerEvent args)
+    {
+        if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
+            return;
+
+        var target = ent.Comp.TargetUser ? args.User : ent.Owner;
+
+        if (target == null)
+            return;
+
+        if (!ent.Comp.ComponentsAdded)
+            EntityManager.AddComponents(target.Value, ent.Comp.Components, ent.Comp.RemoveExisting);
+        else
+            EntityManager.RemoveComponents(target.Value, ent.Comp.Components);
+
+        ent.Comp.ComponentsAdded = !ent.Comp.ComponentsAdded;
+        Dirty(ent);
+
+        args.Handled = true;
+    }
+}