From 0123dc4c820ff681887447b3adf7fe3efcf2587d Mon Sep 17 00:00:00 2001 From: mirrorcult Date: Mon, 4 Apr 2022 22:06:31 -0700 Subject: [PATCH] Optimize ringer (#7423) --- Content.Server/PDA/Ringer/RingerComponent.cs | 6 +++--- Content.Server/PDA/Ringer/RingerSystem.cs | 19 +++++++++++-------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/Content.Server/PDA/Ringer/RingerComponent.cs b/Content.Server/PDA/Ringer/RingerComponent.cs index 1e84528aa5..1f4f8b72a7 100644 --- a/Content.Server/PDA/Ringer/RingerComponent.cs +++ b/Content.Server/PDA/Ringer/RingerComponent.cs @@ -18,9 +18,6 @@ namespace Content.Server.PDA.Ringer [DataField("noteCount")] public int NoteCount = 0; - [DataField("isPlaying")] - public bool IsPlaying = false; - /// /// How far the sound projects in metres. /// @@ -32,4 +29,7 @@ namespace Content.Server.PDA.Ringer [DataField("volume")] public float Volume = -4f; } + + [RegisterComponent] + public sealed class ActiveRingerComponent : Component {} } diff --git a/Content.Server/PDA/Ringer/RingerSystem.cs b/Content.Server/PDA/Ringer/RingerSystem.cs index 38767dceb1..320bd2d167 100644 --- a/Content.Server/PDA/Ringer/RingerSystem.cs +++ b/Content.Server/PDA/Ringer/RingerSystem.cs @@ -36,7 +36,7 @@ namespace Content.Server.PDA.Ringer private void RingerPlayRingtone(EntityUid uid, RingerComponent ringer, RingerPlayRingtoneMessage args) { - ringer.IsPlaying = true; + EnsureComp(uid); UpdateRingerUserInterface(ringer); } @@ -90,7 +90,7 @@ namespace Content.Server.PDA.Ringer private void UpdateRingerUserInterface(RingerComponent ringer) { var ui = ringer.Owner.GetUIOrNull(RingerUiKey.Key); - ui?.SetState(new RingerUpdateState(ringer.IsPlaying, ringer.Ringtone)); + ui?.SetState(new RingerUpdateState(HasComp(ringer.Owner), ringer.Ringtone)); } public bool ToggleRingerUI(RingerComponent ringer, IPlayerSession session) @@ -102,12 +102,10 @@ namespace Content.Server.PDA.Ringer public override void Update(float frameTime) //Responsible for actually playing the ringtone { - foreach(var ringer in EntityManager.EntityQuery()) - { - // If this is perf problem then something something custom tracking via hashset. - if (!ringer.IsPlaying) - continue; + var remove = new RemQueue(); + foreach(var (_, ringer) in EntityManager.EntityQuery()) + { ringer.TimeElapsed += frameTime; if (ringer.TimeElapsed < NoteDelay) continue; @@ -125,13 +123,18 @@ namespace Content.Server.PDA.Ringer if (ringer.NoteCount > 3) { - ringer.IsPlaying = false; + remove.Add(ringer.Owner); UpdateRingerUserInterface(ringer); ringer.TimeElapsed = 0; ringer.NoteCount = 0; break; } } + + foreach (var ent in remove) + { + RemComp(ent); + } } private string GetSound(Note note)