diff --git a/Content.IntegrationTests/Tests/Commands/RejuvenateTest.cs b/Content.IntegrationTests/Tests/Commands/RejuvenateTest.cs index e4ec7e907a..53604b2c1e 100644 --- a/Content.IntegrationTests/Tests/Commands/RejuvenateTest.cs +++ b/Content.IntegrationTests/Tests/Commands/RejuvenateTest.cs @@ -1,5 +1,4 @@ -using Content.Server.Administration.Commands; -using Content.Server.Administration.Systems; +using Content.Shared.Administration.Systems; using Content.Shared.Damage; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; diff --git a/Content.Server/Administration/PlayerPanelEui.cs b/Content.Server/Administration/PlayerPanelEui.cs index 31acd33bf1..7de62ac743 100644 --- a/Content.Server/Administration/PlayerPanelEui.cs +++ b/Content.Server/Administration/PlayerPanelEui.cs @@ -2,10 +2,10 @@ using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Administration.Managers; using Content.Server.Administration.Notes; -using Content.Server.Administration.Systems; using Content.Server.Database; using Content.Server.EUI; using Content.Shared.Administration; +using Content.Shared.Administration.Systems; using Content.Shared.Database; using Content.Shared.Eui; using Content.Shared.Follower; diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index 61e3013bd9..4232b034f3 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -9,6 +9,7 @@ using Content.Server.Prayer; using Content.Server.Silicons.Laws; using Content.Server.Station.Systems; using Content.Shared.Administration; +using Content.Shared.Administration.Systems; using Content.Shared.Chemistry.Components.SolutionManager; using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Configurable; diff --git a/Content.Server/Administration/Toolshed/RejuvenateCommand.cs b/Content.Server/Administration/Toolshed/RejuvenateCommand.cs index 3925badc58..b503e9cb96 100644 --- a/Content.Server/Administration/Toolshed/RejuvenateCommand.cs +++ b/Content.Server/Administration/Toolshed/RejuvenateCommand.cs @@ -1,5 +1,5 @@ -using Content.Server.Administration.Systems; -using Content.Shared.Administration; +using Content.Shared.Administration; +using Content.Shared.Administration.Systems; using Robust.Shared.Toolshed; using Robust.Shared.Toolshed.Errors; diff --git a/Content.Server/Administration/Systems/RejuvenateSystem.cs b/Content.Shared/Administration/Systems/RejuvenateSystem.cs similarity index 54% rename from Content.Server/Administration/Systems/RejuvenateSystem.cs rename to Content.Shared/Administration/Systems/RejuvenateSystem.cs index d25db20bd9..d27ea63ace 100644 --- a/Content.Server/Administration/Systems/RejuvenateSystem.cs +++ b/Content.Shared/Administration/Systems/RejuvenateSystem.cs @@ -1,9 +1,12 @@ using Content.Shared.Rejuvenate; -namespace Content.Server.Administration.Systems; +namespace Content.Shared.Administration.Systems; public sealed class RejuvenateSystem : EntitySystem { + /// + /// Fully heals the target, removing all damage, debuffs or other negative status effects. + /// public void PerformRejuvenate(EntityUid target) { RaiseLocalEvent(target, new RejuvenateEvent()); diff --git a/Content.Shared/Rejuvenate/RejuvenateEvent.cs b/Content.Shared/Rejuvenate/RejuvenateEvent.cs index a6649c6cda..cead1f6507 100644 --- a/Content.Shared/Rejuvenate/RejuvenateEvent.cs +++ b/Content.Shared/Rejuvenate/RejuvenateEvent.cs @@ -1,5 +1,9 @@ namespace Content.Shared.Rejuvenate; -public sealed class RejuvenateEvent : EntityEventArgs -{ -} +/// +/// Raised when an entity is supposed to be rejuvenated, +/// meaning it should heal all damage, debuffs or other negative status effects. +/// Systems should handle healing the entity in a subscription to this event. +/// Used for the Rejuvenate admin verb. +/// +public sealed class RejuvenateEvent : EntityEventArgs; diff --git a/Content.Shared/Trigger/Components/Effects/EntityEffectOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/EntityEffectOnTriggerComponent.cs new file mode 100644 index 0000000000..326312db65 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/EntityEffectOnTriggerComponent.cs @@ -0,0 +1,24 @@ +using Content.Shared.EntityEffects; +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Applies a list of entity effects to the owning entity when triggered. +/// If TargetUser is true then they will be applied to the user instead. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class EntityEffectOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The effects to apply. + /// + [DataField, AutoNetworkedField] + public EntityEffect[] Effects; + + /// + /// Optional scale multiplier for the effects. + /// + [DataField, AutoNetworkedField] + public float Scale = 1f; +} diff --git a/Content.Shared/Trigger/Components/Effects/RejuventateOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/RejuventateOnTriggerComponent.cs new file mode 100644 index 0000000000..5efc50c361 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/RejuventateOnTriggerComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Rejuvenates the entity when triggered, which fully heals them, removing all damage, debuffs or other negative status effects. +/// If TargetUser is true then the user will be rejuvenated instead. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class RejuvenateOnTriggerComponent : BaseXOnTriggerComponent; diff --git a/Content.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs new file mode 100644 index 0000000000..021b72d86f --- /dev/null +++ b/Content.Shared/Trigger/Systems/EntityEffectOnTriggerSystem.cs @@ -0,0 +1,30 @@ +using Content.Shared.EntityEffects; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class EntityEffectOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly SharedEntityEffectsSystem _effects = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTrigger); + } + + private void OnTrigger(Entity 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; + + _effects.ApplyEffects(target.Value, ent.Comp.Effects, ent.Comp.Scale); + args.Handled = true; + } +} diff --git a/Content.Shared/Trigger/Systems/RejuvenateOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/RejuvenateOnTriggerSystem.cs new file mode 100644 index 0000000000..f1c5fdc57e --- /dev/null +++ b/Content.Shared/Trigger/Systems/RejuvenateOnTriggerSystem.cs @@ -0,0 +1,30 @@ +using Content.Shared.Administration.Systems; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class RejuvenateOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly RejuvenateSystem _rejuvenate = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTrigger); + } + + private void OnTrigger(Entity 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; + + _rejuvenate.PerformRejuvenate(target.Value); + args.Handled = true; + } +}