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)