Predict and cleanup RingerComponent (#35907)
* clean up most stuff * move to shared * works * shuffle shit around * oops! access * fixes * todo: everything * SUFFERING * curse you
This commit is contained in:
@@ -7,40 +7,21 @@ using Robust.Shared.Timing;
|
||||
namespace Content.Client.PDA.Ringer
|
||||
{
|
||||
[UsedImplicitly]
|
||||
public sealed class RingerBoundUserInterface : BoundUserInterface
|
||||
public sealed class RingerBoundUserInterface(EntityUid owner, Enum uiKey) : BoundUserInterface(owner, uiKey)
|
||||
{
|
||||
[ViewVariables]
|
||||
private RingtoneMenu? _menu;
|
||||
|
||||
public RingerBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void Open()
|
||||
{
|
||||
base.Open();
|
||||
_menu = this.CreateWindow<RingtoneMenu>();
|
||||
_menu.OpenToLeft();
|
||||
|
||||
_menu.TestRingerButton.OnPressed += _ =>
|
||||
{
|
||||
SendMessage(new RingerPlayRingtoneMessage());
|
||||
};
|
||||
_menu.TestRingtoneButtonPressed += OnTestRingtoneButtonPressed;
|
||||
_menu.SetRingtoneButtonPressed += OnSetRingtoneButtonPressed;
|
||||
|
||||
_menu.SetRingerButton.OnPressed += _ =>
|
||||
{
|
||||
if (!TryGetRingtone(out var ringtone))
|
||||
return;
|
||||
|
||||
SendMessage(new RingerSetRingtoneMessage(ringtone));
|
||||
_menu.SetRingerButton.Disabled = true;
|
||||
|
||||
Timer.Spawn(333, () =>
|
||||
{
|
||||
if (_menu is { Disposed: false, SetRingerButton: { Disposed: false } ringer})
|
||||
ringer.Disabled = false;
|
||||
});
|
||||
};
|
||||
Update();
|
||||
}
|
||||
|
||||
private bool TryGetRingtone(out Note[] ringtone)
|
||||
@@ -63,36 +44,59 @@ namespace Content.Client.PDA.Ringer
|
||||
return true;
|
||||
}
|
||||
|
||||
protected override void UpdateState(BoundUserInterfaceState state)
|
||||
public override void Update()
|
||||
{
|
||||
base.UpdateState(state);
|
||||
base.Update();
|
||||
|
||||
if (_menu == null || state is not RingerUpdateState msg)
|
||||
if (_menu == null)
|
||||
return;
|
||||
|
||||
for (int i = 0; i < _menu.RingerNoteInputs.Length; i++)
|
||||
if (!EntMan.TryGetComponent(Owner, out RingerComponent? ringer))
|
||||
return;
|
||||
|
||||
for (var i = 0; i < _menu.RingerNoteInputs.Length; i++)
|
||||
{
|
||||
var note = ringer.Ringtone[i].ToString();
|
||||
|
||||
var note = msg.Ringtone[i].ToString();
|
||||
if (RingtoneMenu.IsNote(note))
|
||||
{
|
||||
_menu.PreviousNoteInputs[i] = note.Replace("sharp", "#");
|
||||
_menu.RingerNoteInputs[i].Text = _menu.PreviousNoteInputs[i];
|
||||
}
|
||||
if (!RingtoneMenu.IsNote(note))
|
||||
continue;
|
||||
|
||||
_menu.PreviousNoteInputs[i] = note.Replace("sharp", "#");
|
||||
_menu.RingerNoteInputs[i].Text = _menu.PreviousNoteInputs[i];
|
||||
}
|
||||
|
||||
_menu.TestRingerButton.Disabled = msg.IsPlaying;
|
||||
_menu.TestRingerButton.Disabled = ringer.Active;
|
||||
}
|
||||
|
||||
|
||||
protected override void Dispose(bool disposing)
|
||||
private void OnTestRingtoneButtonPressed()
|
||||
{
|
||||
base.Dispose(disposing);
|
||||
if (!disposing)
|
||||
if (_menu is null)
|
||||
return;
|
||||
|
||||
_menu?.Dispose();
|
||||
SendPredictedMessage(new RingerPlayRingtoneMessage());
|
||||
|
||||
// We disable it instantly to remove the delay before the client receives the next compstate
|
||||
// Makes the UI feel responsive, will be re-enabled by ringer.Active once it gets an update.
|
||||
_menu.TestRingerButton.Disabled = true;
|
||||
}
|
||||
|
||||
private void OnSetRingtoneButtonPressed()
|
||||
{
|
||||
if (_menu is null)
|
||||
return;
|
||||
|
||||
if (!TryGetRingtone(out var ringtone))
|
||||
return;
|
||||
|
||||
SendPredictedMessage(new RingerSetRingtoneMessage(ringtone));
|
||||
_menu.SetRingerButton.Disabled = true;
|
||||
|
||||
Timer.Spawn(333,
|
||||
() =>
|
||||
{
|
||||
if (_menu is { Disposed: false, SetRingerButton: { Disposed: false } ringer} )
|
||||
ringer.Disabled = false;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user