* Add missing Dispose method to ForensicScannerBoundUserInterface. * Remove old code from ForensicScanner. * Prevent forensic scanner from being used on the floor and allow its window to stay open when active hand is swapped. * Use more standardized UI code for ForensicScanner. * Add a delay to ForensicScanner printing. * Show name of what was scanned on ForensicScanner UI. * Add a print sound for ForensicScanner. * Add more error reporting for ForensicScanner. * Centralize common logic in ForensicScannerSystem. * Allow ForensicScanner blank printouts. * Tweak ForensicScanner audio parameters.
83 lines
2.3 KiB
C#
83 lines
2.3 KiB
C#
using Robust.Client.GameObjects;
|
|
using Robust.Shared.Timing;
|
|
using Content.Shared.Forensics;
|
|
|
|
namespace Content.Client.Forensics
|
|
{
|
|
public sealed class ForensicScannerBoundUserInterface : BoundUserInterface
|
|
{
|
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
|
|
|
private ForensicScannerMenu? _window;
|
|
|
|
private TimeSpan _printCooldown;
|
|
|
|
public ForensicScannerBoundUserInterface(ClientUserInterfaceComponent owner, Enum uiKey) : base(owner, uiKey)
|
|
{
|
|
}
|
|
|
|
protected override void Open()
|
|
{
|
|
base.Open();
|
|
_window = new ForensicScannerMenu();
|
|
_window.OnClose += Close;
|
|
_window.Print.OnPressed += _ => Print();
|
|
_window.Clear.OnPressed += _ => Clear();
|
|
_window.OpenCentered();
|
|
}
|
|
|
|
private void Print()
|
|
{
|
|
SendMessage(new ForensicScannerPrintMessage());
|
|
|
|
if (_window != null)
|
|
_window.UpdatePrinterState(true);
|
|
|
|
// This UI does not require pinpoint accuracy as to when the Print
|
|
// button is available again, so spawning client-side timers is
|
|
// fine. The server will make sure the cooldown is honored.
|
|
Timer.Spawn(_printCooldown, () =>
|
|
{
|
|
if (_window != null)
|
|
_window.UpdatePrinterState(false);
|
|
});
|
|
}
|
|
|
|
private void Clear()
|
|
{
|
|
SendMessage(new ForensicScannerClearMessage());
|
|
}
|
|
|
|
protected override void UpdateState(BoundUserInterfaceState state)
|
|
{
|
|
base.UpdateState(state);
|
|
|
|
if (_window == null)
|
|
return;
|
|
|
|
if (state is not ForensicScannerBoundUserInterfaceState cast)
|
|
return;
|
|
|
|
_printCooldown = cast.PrintCooldown;
|
|
|
|
if (cast.PrintReadyAt > _gameTiming.CurTime)
|
|
Timer.Spawn(cast.PrintReadyAt - _gameTiming.CurTime, () =>
|
|
{
|
|
if (_window != null)
|
|
_window.UpdatePrinterState(false);
|
|
});
|
|
|
|
_window.UpdateState(cast);
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
base.Dispose(disposing);
|
|
if (!disposing)
|
|
return;
|
|
|
|
_window?.Dispose();
|
|
}
|
|
}
|
|
}
|