private void StartPersistentScanning() { PersistentScanningTask = new Task(() => { try { GameOverScan gameOverData = new GameOverScan(); RoundOverScan roundOverData = new RoundOverScan(); while (PersistentScan) { SpinWait.SpinUntil(() => { return(OnGameOver != null || OnRoundOver != null || OnDisconnect != null); }); using (LockHandler.Passive) { UpdateScreen(); ScanGameOver(gameOverData); ScanRoundOver(roundOverData); InvokeOnDisconnect(); } Thread.Sleep(10); // End } } catch (OverwatchClosedException) { } }); PersistentScanningTask.Start(); }
private void ScanRoundOver(RoundOverScan roundOverScan) { if (OnRoundOver != null) { const int startX = 464; const int length = 100; const int y = 105; bool isOver = false; // Check for the KOTH round over animation. Parallel.For(startX, startX + length, (x, loop) => { if (Capture.CompareTo(new Point(x, y), Markups.KOTH_ROUND_OVER, new int[] { 190, 185, 188 }, 70, 90)) { isOver = true; loop.Break(); } }); // Check for the elimination round over animation. // Team wins if (!isOver) { isOver = Capture.CompareTo(Points.LOBBY_ELIMINATION_ROUND_OVER, Markups.ELIM_ROUND_OVER, 30, 95, DBCompareFlags.IgnoreBlack); } // Draw if (!isOver) { isOver = Capture.CompareTo(Points.LOBBY_ELIMINATION_ROUND_OVER_DRAW, Markups.ELIM_ROUND_OVER_DRAW, 30, 95, DBCompareFlags.IgnoreBlack); } if (isOver && !roundOverScan.Executed) { OnRoundOver.Invoke(this, new EventArgs()); roundOverScan.Executed = true; } else if (!isOver && roundOverScan.Executed) { roundOverScan.Executed = false; } } }