diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnHitscanFiredComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnHitscanFiredComponent.cs new file mode 100644 index 0000000000..f7a86c0ce3 --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnHitscanFiredComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Component put on the hitscan entity. +/// Triggers when a hitscan raycast is fired. +/// The user is the player shooting it. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnHitscanFiredComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnHitscanHitComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnHitscanHitComponent.cs new file mode 100644 index 0000000000..4520578a8f --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnHitscanHitComponent.cs @@ -0,0 +1,11 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Component put on the hitscan entity. +/// Triggers when a hitscan raycast is fired, but only if an entity got hit. +/// The user is the entity that got hit. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnHitscanHitComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Systems/TriggerOnHitscanSystem.cs b/Content.Shared/Trigger/Systems/TriggerOnHitscanSystem.cs new file mode 100644 index 0000000000..069b586055 --- /dev/null +++ b/Content.Shared/Trigger/Systems/TriggerOnHitscanSystem.cs @@ -0,0 +1,30 @@ +using Content.Shared.Trigger.Components.Triggers; +using Content.Shared.Weapons.Hitscan.Events; + +namespace Content.Shared.Trigger.Systems; + +public sealed class TriggerOnHitscanSystem : EntitySystem +{ + [Dependency] private readonly TriggerSystem _trigger = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnHit); + SubscribeLocalEvent(OnFired); + } + + private void OnHit(Entity ent, ref HitscanRaycastFiredEvent args) + { + if (args.Data.HitEntity == null) + return; + + _trigger.Trigger(ent.Owner, args.Data.HitEntity, ent.Comp.KeyOut); + } + + private void OnFired(Entity ent, ref HitscanRaycastFiredEvent args) + { + _trigger.Trigger(ent.Owner, args.Data.Shooter, ent.Comp.KeyOut); + } +}