Optimize ringer (#7423)

This commit is contained in:
mirrorcult
2022-04-04 22:06:31 -07:00
committed by GitHub
parent 5cc1273681
commit 0123dc4c82
2 changed files with 14 additions and 11 deletions

View File

@@ -18,9 +18,6 @@ namespace Content.Server.PDA.Ringer
[DataField("noteCount")] [DataField("noteCount")]
public int NoteCount = 0; public int NoteCount = 0;
[DataField("isPlaying")]
public bool IsPlaying = false;
/// <summary> /// <summary>
/// How far the sound projects in metres. /// How far the sound projects in metres.
/// </summary> /// </summary>
@@ -32,4 +29,7 @@ namespace Content.Server.PDA.Ringer
[DataField("volume")] [DataField("volume")]
public float Volume = -4f; public float Volume = -4f;
} }
[RegisterComponent]
public sealed class ActiveRingerComponent : Component {}
} }

View File

@@ -36,7 +36,7 @@ namespace Content.Server.PDA.Ringer
private void RingerPlayRingtone(EntityUid uid, RingerComponent ringer, RingerPlayRingtoneMessage args) private void RingerPlayRingtone(EntityUid uid, RingerComponent ringer, RingerPlayRingtoneMessage args)
{ {
ringer.IsPlaying = true; EnsureComp<ActiveRingerComponent>(uid);
UpdateRingerUserInterface(ringer); UpdateRingerUserInterface(ringer);
} }
@@ -90,7 +90,7 @@ namespace Content.Server.PDA.Ringer
private void UpdateRingerUserInterface(RingerComponent ringer) private void UpdateRingerUserInterface(RingerComponent ringer)
{ {
var ui = ringer.Owner.GetUIOrNull(RingerUiKey.Key); var ui = ringer.Owner.GetUIOrNull(RingerUiKey.Key);
ui?.SetState(new RingerUpdateState(ringer.IsPlaying, ringer.Ringtone)); ui?.SetState(new RingerUpdateState(HasComp<ActiveRingerComponent>(ringer.Owner), ringer.Ringtone));
} }
public bool ToggleRingerUI(RingerComponent ringer, IPlayerSession session) 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 public override void Update(float frameTime) //Responsible for actually playing the ringtone
{ {
foreach(var ringer in EntityManager.EntityQuery<RingerComponent>()) var remove = new RemQueue<EntityUid>();
{
// If this is perf problem then something something custom tracking via hashset.
if (!ringer.IsPlaying)
continue;
foreach(var (_, ringer) in EntityManager.EntityQuery<ActiveRingerComponent, RingerComponent>())
{
ringer.TimeElapsed += frameTime; ringer.TimeElapsed += frameTime;
if (ringer.TimeElapsed < NoteDelay) continue; if (ringer.TimeElapsed < NoteDelay) continue;
@@ -125,13 +123,18 @@ namespace Content.Server.PDA.Ringer
if (ringer.NoteCount > 3) if (ringer.NoteCount > 3)
{ {
ringer.IsPlaying = false; remove.Add(ringer.Owner);
UpdateRingerUserInterface(ringer); UpdateRingerUserInterface(ringer);
ringer.TimeElapsed = 0; ringer.TimeElapsed = 0;
ringer.NoteCount = 0; ringer.NoteCount = 0;
break; break;
} }
} }
foreach (var ent in remove)
{
RemComp<ActiveRingerComponent>(ent);
}
} }
private string GetSound(Note note) private string GetSound(Note note)