diff --git a/Content.Server/MachineLinking/System/SignallerSystem.cs b/Content.Server/MachineLinking/System/SignallerSystem.cs index 3637119958..e83253cb65 100644 --- a/Content.Server/MachineLinking/System/SignallerSystem.cs +++ b/Content.Server/MachineLinking/System/SignallerSystem.cs @@ -1,31 +1,49 @@ +using Content.Server.Explosion.EntitySystems; using Content.Server.MachineLinking.Components; -using JetBrains.Annotations; using Content.Shared.Interaction.Events; +using Content.Shared.Timing; -namespace Content.Server.MachineLinking.System +namespace Content.Server.MachineLinking.System; + +public sealed class SignallerSystem : EntitySystem { - [UsedImplicitly] - public sealed class SignallerSystem : EntitySystem + [Dependency] private readonly SignalLinkerSystem _signal = default!; + [Dependency] private readonly UseDelaySystem _useDelay = default!; + + public override void Initialize() { - [Dependency] private readonly SignalLinkerSystem _signalSystem = default!; - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnInit); - SubscribeLocalEvent(OnUseInHand); - } + base.Initialize(); - private void OnInit(EntityUid uid, SignallerComponent component, ComponentInit args) - { - _signalSystem.EnsureTransmitterPorts(uid, component.Port); - } + SubscribeLocalEvent(OnInit); + SubscribeLocalEvent(OnUseInHand); + SubscribeLocalEvent(OnTrigger); + } - private void OnUseInHand(EntityUid uid, SignallerComponent component, UseInHandEvent args) - { - if (args.Handled) - return; - _signalSystem.InvokePort(uid, component.Port); - args.Handled = true; - } + private void OnInit(EntityUid uid, SignallerComponent component, ComponentInit args) + { + _signal.EnsureTransmitterPorts(uid, component.Port); + } + + private void OnUseInHand(EntityUid uid, SignallerComponent component, UseInHandEvent args) + { + if (args.Handled) + return; + _signal.InvokePort(uid, component.Port); + args.Handled = true; + } + + private void OnTrigger(EntityUid uid, SignallerComponent component, TriggerEvent args) + { + // if on cooldown, do nothing + var hasUseDelay = TryComp(uid, out var useDelay); + if (hasUseDelay && _useDelay.ActiveDelay(uid, useDelay)) + return; + + // set cooldown to prevent clocks + if (hasUseDelay) + _useDelay.BeginDelay(uid, useDelay); + + _signal.InvokePort(uid, component.Port); + args.Handled = true; } } diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/signaller.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/signaller.yml index f37975c303..153e24818e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/signaller.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/signaller.yml @@ -16,3 +16,6 @@ - type: SignalTransmitter outputs: Pressed: [] + - type: Tag + tags: + - Payload