]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add input port of the network system in timer (#20026)
authorMrFippik <48425912+MrFippik@users.noreply.github.com>
Sat, 6 Jan 2024 06:41:56 +0000 (17:41 +1100)
committerGitHub <noreply@github.com>
Sat, 6 Jan 2024 06:41:56 +0000 (17:41 +1100)
* Add port link sink in timer

* Update SignalTimerSystem.cs

Moving the trigger so that everything works correctly and does not conflict. Correction of remarks.

* Update SignalTimerSystem.cs

* a

* review

---------

Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
Content.Server/DeviceLinking/Components/SignalTimerComponent.cs
Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs
Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml

index d40d7174abaa0f74fe42c906479944978e9f8a76..2e9b369b99a1db57e07f6b83eadc307cb9d8b74d 100644 (file)
@@ -1,5 +1,6 @@
 using Content.Shared.DeviceLinking;
 using Robust.Shared.Audio;
+using Robust.Shared.Prototypes;
 using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
 
 namespace Content.Server.DeviceLinking.Components;
@@ -7,36 +8,40 @@ namespace Content.Server.DeviceLinking.Components;
 [RegisterComponent]
 public sealed partial class SignalTimerComponent : Component
 {
-    [DataField("delay"), ViewVariables(VVAccess.ReadWrite)]
+    [DataField, ViewVariables(VVAccess.ReadWrite)]
     public double Delay = 5;
 
     /// <summary>
     ///     This shows the Label: text box in the UI.
     /// </summary>
-    [DataField("canEditLabel"), ViewVariables(VVAccess.ReadWrite)]
+    [DataField, ViewVariables(VVAccess.ReadWrite)]
     public bool CanEditLabel = true;
 
     /// <summary>
     ///     The label, used for TextScreen visuals currently.
     /// </summary>
-    [DataField("label"), ViewVariables(VVAccess.ReadWrite)]
+    [DataField, ViewVariables(VVAccess.ReadWrite)]
     public string Label = string.Empty;
 
     /// <summary>
     ///     The port that gets signaled when the timer triggers.
     /// </summary>
-    [DataField("triggerPort", customTypeSerializer: typeof(PrototypeIdSerializer<SourcePortPrototype>)), ViewVariables(VVAccess.ReadWrite)]
-    public string TriggerPort = "Timer";
+    [DataField, ViewVariables(VVAccess.ReadWrite)]
+    public ProtoId<SourcePortPrototype> TriggerPort = "Timer";
 
     /// <summary>
     ///     The port that gets signaled when the timer starts.
     /// </summary>
-    [DataField("startPort", customTypeSerializer: typeof(PrototypeIdSerializer<SourcePortPrototype>)), ViewVariables(VVAccess.ReadWrite)]
-    public string StartPort = "Start";
+    [DataField, ViewVariables(VVAccess.ReadWrite)]
+    public ProtoId<SourcePortPrototype> StartPort = "Start";
+
+    [DataField, ViewVariables(VVAccess.ReadWrite)]
+    public ProtoId<SinkPortPrototype> Trigger = "Trigger";
 
     /// <summary>
     ///     If not null, this timer will play this sound when done.
     /// </summary>
-    [DataField("doneSound"), ViewVariables(VVAccess.ReadWrite)]
+    [DataField, ViewVariables(VVAccess.ReadWrite)]
     public SoundSpecifier? DoneSound;
 }
+
index ff90679e289d1ca8f582acdf967ab62dfc1f699d..8cdeac3e8eb8e10fccb6b0d2c51d895648e637be 100644 (file)
@@ -1,4 +1,5 @@
 using Content.Server.DeviceLinking.Components;
+using Content.Server.DeviceLinking.Events;
 using Content.Server.UserInterface;
 using Content.Shared.Access.Systems;
 using Content.Shared.MachineLinking;
@@ -19,6 +20,11 @@ public sealed class SignalTimerSystem : EntitySystem
     [Dependency] private readonly UserInterfaceSystem _ui = default!;
     [Dependency] private readonly AccessReaderSystem _accessReader = default!;
 
+    /// <summary>
+    /// Per-tick timer cache.
+    /// </summary>
+    private List<Entity<SignalTimerComponent>> _timers = new();
+
     public override void Initialize()
     {
         base.Initialize();
@@ -29,11 +35,13 @@ public sealed class SignalTimerSystem : EntitySystem
         SubscribeLocalEvent<SignalTimerComponent, SignalTimerTextChangedMessage>(OnTextChangedMessage);
         SubscribeLocalEvent<SignalTimerComponent, SignalTimerDelayChangedMessage>(OnDelayChangedMessage);
         SubscribeLocalEvent<SignalTimerComponent, SignalTimerStartMessage>(OnTimerStartMessage);
+        SubscribeLocalEvent<SignalTimerComponent, SignalReceivedEvent>(OnSignalReceived);
     }
 
     private void OnInit(EntityUid uid, SignalTimerComponent component, ComponentInit args)
     {
         _appearanceSystem.SetData(uid, TextScreenVisuals.ScreenText, component.Label);
+        _signalSystem.EnsureSinkPorts(uid, component.Trigger);
     }
 
     private void OnAfterActivatableUIOpen(EntityUid uid, SignalTimerComponent component, AfterActivatableUIOpenEvent args)
@@ -58,11 +66,13 @@ public sealed class SignalTimerSystem : EntitySystem
     public void Trigger(EntityUid uid, SignalTimerComponent signalTimer)
     {
         RemComp<ActiveSignalTimerComponent>(uid);
+
         if (TryComp<AppearanceComponent>(uid, out var appearance))
         {
-            _appearanceSystem.SetData(uid, TextScreenVisuals.ScreenText, new string?[] { signalTimer.Label }, appearance);
+            _appearanceSystem.SetData(uid, TextScreenVisuals.ScreenText, new[] { signalTimer.Label }, appearance);
         }
 
+        _audio.PlayPvs(signalTimer.DoneSound, uid);
         _signalSystem.InvokePort(uid, signalTimer.TriggerPort);
 
         if (_ui.TryGetUi(uid, SignalTimerUiKey.Key, out var bui))
@@ -80,16 +90,29 @@ public sealed class SignalTimerSystem : EntitySystem
     public override void Update(float frameTime)
     {
         base.Update(frameTime);
+        UpdateTimer();
+    }
+
+    private void UpdateTimer()
+    {
+        _timers.Clear();
+
         var query = EntityQueryEnumerator<ActiveSignalTimerComponent, SignalTimerComponent>();
         while (query.MoveNext(out var uid, out var active, out var timer))
         {
             if (active.TriggerTime > _gameTiming.CurTime)
                 continue;
 
-            Trigger(uid, timer);
+            _timers.Add((uid, timer));
+        }
 
-            if (timer.DoneSound != null)
-                _audio.PlayPvs(timer.DoneSound, uid);
+        foreach (var timer in _timers)
+        {
+            // Exploded or the likes.
+            if (!Exists(timer.Owner))
+                continue;
+
+            Trigger(timer.Owner, timer.Comp);
         }
     }
 
@@ -144,7 +167,19 @@ public sealed class SignalTimerSystem : EntitySystem
     {
         if (!IsMessageValid(uid, args))
             return;
+        OnStartTimer(uid, component);
+    }
 
+    private void OnSignalReceived(EntityUid uid, SignalTimerComponent component, ref SignalReceivedEvent args)
+    {
+        if (args.Port == component.Trigger)
+        {
+            OnStartTimer(uid, component);
+        }
+    }
+
+    public void OnStartTimer(EntityUid uid, SignalTimerComponent component)
+    {
         TryComp<AppearanceComponent>(uid, out var appearance);
         var timer = EnsureComp<ActiveSignalTimerComponent>(uid);
         timer.TriggerTime = _gameTiming.CurTime + TimeSpan.FromSeconds(component.Delay);
index c0e40d3b75fac9ba35dc026d0b2e2152d2461196..fbb2b7fe5668b3d9f44bd2c46fb90642e52ac191 100644 (file)
@@ -25,6 +25,9 @@
     ports:
       - Start
       - Timer
+  - type: DeviceLinkSink
+    ports:
+      - Trigger
   - type: ActivatableUI
     key: enum.SignalTimerUiKey.Key
   - type: UserInterface