// For rendering the progress bar, updated from BUI state
private TimeSpan? _startTime;
private TimeSpan? _totalTime;
+ private TimeSpan? _accumulatedRunTime;
+
+ private bool _paused;
public AnalysisConsoleMenu()
{
{
base.FrameUpdate(args);
- if (_startTime is not { } start || _totalTime is not { } total)
+ if (_startTime is not { } start || _totalTime is not { } total || _accumulatedRunTime is not { } accumulated)
return;
- var remaining = start + total - _timing.CurTime;
+ var remaining = total - accumulated;
+ if (!_paused)
+ {
+ // If the analyzer is running, its remaining time is further discounted by the time it's been running for.
+ remaining += start - _timing.CurTime;
+ }
var secsText = Math.Max((int) remaining.TotalSeconds, 0);
ProgressLabel.Text = Loc.GetString("analysis-console-progress-text",
if (state.Scanning)
{
- message.AddMarkup(Loc.GetString("analysis-console-info-scanner"));
+ if (state.Paused)
+ {
+ message.AddMarkup(Loc.GetString("analysis-console-info-scanner-paused"));
+ }
+ else
+ {
+ message.AddMarkup(Loc.GetString("analysis-console-info-scanner"));
+ }
Information.SetMessage(message);
UpdateArtifactIcon(null); //set it to blank
return;
_startTime = state.StartTime;
_totalTime = state.TotalTime;
+ _accumulatedRunTime = state.AccumulatedRunTime;
+ _paused = state.Paused;
}
}
var query = EntityQueryEnumerator<ActiveArtifactAnalyzerComponent, ArtifactAnalyzerComponent>();
while (query.MoveNext(out var uid, out var active, out var scan))
{
- if (_timing.CurTime - active.StartTime < scan.AnalysisDuration * scan.AnalysisDurationMulitplier)
+ if (active.AnalysisPaused)
+ continue;
+
+ if (_timing.CurTime - active.StartTime < scan.AnalysisDuration * scan.AnalysisDurationMulitplier - active.AccumulatedRunTime)
continue;
FinishScan(uid, scan, active);
var serverConnected = TryComp<ResearchClientComponent>(uid, out var client) && client.ConnectedToServer;
var scanning = TryComp<ActiveArtifactAnalyzerComponent>(component.AnalyzerEntity, out var active);
+ var paused = active != null ? active.AnalysisPaused : false;
+
var state = new AnalysisConsoleScanUpdateState(GetNetEntity(artifact), analyzerConnected, serverConnected,
- canScan, canPrint, msg, scanning, active?.StartTime, totalTime, points);
+ canScan, canPrint, msg, scanning, paused, active?.StartTime, active?.AccumulatedRunTime, totalTime, points);
var bui = _ui.GetUi(uid, ArtifactAnalzyerUiKey.Key);
_ui.SetUiState(bui, state);
var activeComp = EnsureComp<ActiveArtifactAnalyzerComponent>(component.AnalyzerEntity.Value);
activeComp.StartTime = _timing.CurTime;
+ activeComp.AccumulatedRunTime = TimeSpan.Zero;
activeComp.Artifact = ent.Value;
+ if (TryComp<ApcPowerReceiverComponent>(component.AnalyzerEntity.Value, out var powa))
+ activeComp.AnalysisPaused = !powa.Powered;
+
var activeArtifact = EnsureComp<ActiveScannedArtifactComponent>(ent.Value);
activeArtifact.Scanner = component.AnalyzerEntity.Value;
UpdateUserInterface(uid, component);
UpdateUserInterface(component.Console.Value);
}
+ [PublicAPI]
+ public void PauseScan(EntityUid uid, ArtifactAnalyzerComponent? component = null, ActiveArtifactAnalyzerComponent? active = null)
+ {
+ if (!Resolve(uid, ref component, ref active) || active.AnalysisPaused)
+ return;
+
+ active.AnalysisPaused = true;
+ // As we pause, we store what was already completed.
+ active.AccumulatedRunTime = (_timing.CurTime - active.StartTime) + active.AccumulatedRunTime;
+
+ if (Exists(component.Console))
+ UpdateUserInterface(component.Console.Value);
+ }
+
+ [PublicAPI]
+ public void ResumeScan(EntityUid uid, ArtifactAnalyzerComponent? component = null, ActiveArtifactAnalyzerComponent? active = null)
+ {
+ if (!Resolve(uid, ref component, ref active) || !active.AnalysisPaused)
+ return;
+
+ active.StartTime = _timing.CurTime;
+ active.AnalysisPaused = false;
+
+ if (Exists(component.Console))
+ UpdateUserInterface(component.Console.Value);
+ }
+
private void OnRefreshParts(EntityUid uid, ArtifactAnalyzerComponent component, RefreshPartsEvent args)
{
var analysisRating = args.PartRatings[component.MachinePartAnalysisDuration];
_ambientSound.SetAmbience(uid, false);
}
- private void OnPowerChanged(EntityUid uid, ActiveArtifactAnalyzerComponent component, ref PowerChangedEvent args)
+ private void OnPowerChanged(EntityUid uid, ActiveArtifactAnalyzerComponent active, ref PowerChangedEvent args)
{
if (!args.Powered)
- CancelScan(component.Artifact);
+ {
+ PauseScan(uid, null, active);
+ }
+ else
+ {
+ ResumeScan(uid, null, active);
+ }
}
}
public bool Scanning;
+ public bool Paused;
+
public TimeSpan? StartTime;
+ public TimeSpan? AccumulatedRunTime;
+
public TimeSpan? TotalTime;
public int PointAmount;
public AnalysisConsoleScanUpdateState(NetEntity? artifact, bool analyzerConnected, bool serverConnected, bool canScan, bool canPrint,
- FormattedMessage? scanReport, bool scanning, TimeSpan? startTime, TimeSpan? totalTime, int pointAmount)
+ FormattedMessage? scanReport, bool scanning, bool paused, TimeSpan? startTime, TimeSpan? accumulatedRunTime, TimeSpan? totalTime, int pointAmount)
{
Artifact = artifact;
AnalyzerConnected = analyzerConnected;
ScanReport = scanReport;
Scanning = scanning;
+ Paused = paused;
+
StartTime = startTime;
+ AccumulatedRunTime = accumulatedRunTime;
TotalTime = totalTime;
PointAmount = pointAmount;