From: Hannah Giovanna Dawson Date: Wed, 13 Aug 2025 16:50:34 +0000 (+0100) Subject: StaminaDamageOnTriggerComponent (#39607) X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=2cb4e01019e63992ed40a30399f220b665969549;p=space-station-14.git StaminaDamageOnTriggerComponent (#39607) * InflictStaminaOnTriggerSystem Surprised this wasn't done alongside the damage one. * Correct docstring * Moar docstring changes!!! * Resolve PR comment * a * Update Content.Shared/Trigger/Systems/StaminaDamageOnTriggerSystem.cs --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- diff --git a/Content.Shared/Trigger/Components/Effects/StaminaDamageOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/StaminaDamageOnTriggerComponent.cs new file mode 100644 index 0000000000..dd8136f1ba --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/StaminaDamageOnTriggerComponent.cs @@ -0,0 +1,25 @@ +using Content.Shared.Trigger.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Will inflict stamina to an entity when triggered. +/// If TargetUser is true it the user will have stamina inflicted instead. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class StaminaDamageOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Should the inflicted stamina ignore resistances? + /// + [DataField, AutoNetworkedField] + public bool IgnoreResistances; + + /// + /// The stamina amount that is inflicted to the target. + /// May be further modified by subscriptions. + /// + [DataField(required: true), AutoNetworkedField] + public float Stamina; +} diff --git a/Content.Shared/Trigger/Systems/StaminaDamageOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/StaminaDamageOnTriggerSystem.cs new file mode 100644 index 0000000000..0efa437275 --- /dev/null +++ b/Content.Shared/Trigger/Systems/StaminaDamageOnTriggerSystem.cs @@ -0,0 +1,42 @@ +using Content.Shared.Damage; +using Content.Shared.Damage.Systems; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class StaminaDamageOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly SharedStaminaSystem _stamina = 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; + + var ev = new BeforeStaminaDamageOnTriggerEvent(ent.Comp.Stamina, target.Value); + RaiseLocalEvent(ent.Owner, ref ev); + + _stamina.TakeStaminaDamage(target.Value, ev.Stamina, source: args.User, with: ent.Owner, ignoreResist: ent.Comp.IgnoreResistances); + + args.Handled = true; + } +} + +/// +/// Raised on an entity before it inflicts stamina due to StaminaDamageOnTriggerComponent. +/// Used to modify the stamina that will be inflicted. +/// +[ByRefEvent] +public record struct BeforeStaminaDamageOnTriggerEvent(float Stamina, EntityUid Tripper);