--- /dev/null
+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;
+}
--- /dev/null
+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;
+}
+++ /dev/null
-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;
- }
-}
--- /dev/null
+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;
+ }
+}