public void Tick(OsuStatus status, IOsuMemoryReader reader) { lock (_lockingObject) { _tokenCallbackTick.WaitOne(); if (!ReferenceEquals(_reader, reader)) { _reader = reader; } liveTokens["status"].Value = _lastStatus; if (status != OsuStatus.Playing) { if (_clearLiveTokensAfterResultScreenExit && !_clearedLiveTokens && (status & OsuStatus.ResultsScreen) == 0) {//we're not playing or we haven't just finished playing - clear ResetOutput(); ResetTokens(); _lastStatus = status; _clearedLiveTokens = true; } _rawData.PlayTime = reader.ReadPlayTime(); PrepareTimeToken(); return; } if (_lastStatus != OsuStatus.Playing) { Thread.Sleep(500);//Initial play delay } _clearedLiveTokens = false; _lastStatus = status; reader.GetPlayData(_rawData.Play); _rawData.HitErrors = reader.HitErrors() ?? new List <int>(); _rawData.PlayTime = reader.ReadPlayTime(); PrepareTimeToken(); _tokenTick?.Set(); } }
public void Tick(OsuStatus status, IOsuMemoryReader reader) { _notUpdatingTokens.WaitOne(); _notUpdatingMemoryValues.Reset(); lock (_lockingObject) { if (!ReferenceEquals(_reader, reader)) { _reader = reader; } if ((OsuStatus)_liveTokens["status"].Token.Value != status) { _liveTokens["status"].Token.Value = status; } if (status != OsuStatus.Playing && status != OsuStatus.Watching) { _rawData.PlayTime = reader.ReadPlayTime(); UpdateLiveTokens(status); _lastStatus = status; _notUpdatingMemoryValues.Set(); return; } if (_lastStatus != OsuStatus.Playing && _lastStatus != OsuStatus.Watching) { _newPlayStarted.Set(); Thread.Sleep(500);//Initial play delay } reader.GetPlayData(_rawData.Play); //TODO: change this on OsuMemoryReader side (read v2 in getPlayData & return 0 as default instead of -1) _rawData.Play.Score = Math.Max(0, _reader.ReadScoreV2()); _rawData.HitErrors = reader.HitErrors() ?? new List <int>(); _rawData.PlayTime = reader.ReadPlayTime(); _liveTokens["time"].Update(); _lastStatus = status; } _notUpdatingMemoryValues.Set(); }
public void Tick(OsuStatus status, IOsuMemoryReader reader) { lock (_lockingObject) { _tokenCallbackTick.WaitOne(); if (!ReferenceEquals(_reader, reader)) { _reader = reader; } if ((OsuStatus)_liveTokens["status"].Token.Value != status) { _liveTokens["status"].Token.Value = status; } if (status != OsuStatus.Playing) { _rawData.PlayTime = reader.ReadPlayTime(); UpdateLiveTokens(status); _lastStatus = status; return; } if (_lastStatus != OsuStatus.Playing) { Thread.Sleep(500);//Initial play delay } reader.GetPlayData(_rawData.Play); _rawData.HitErrors = reader.HitErrors() ?? new List <int>(); _rawData.PlayTime = reader.ReadPlayTime(); _liveTokens["time"].Update(); _tokenTick?.Set(); _lastStatus = status; } }
private void OnShown(object sender, EventArgs eventArgs) { if (!string.IsNullOrEmpty(_osuWindowTitleHint)) { Text += $": {_osuWindowTitleHint}"; } _ = Task.Run(async() => { try { var playContainer = new PlayContainerEx(); var playReseted = false; while (true) { if (cts.IsCancellationRequested) { return; } var patternsToRead = GetPatternsToRead(); var stopwatch = Stopwatch.StartNew(); #region OsuBase var mapId = -1; var songString = string.Empty; var mapMd5 = string.Empty; var mapFolderName = string.Empty; var osuFileName = string.Empty; var retrys = -1; var gameMode = -1; var mapData = string.Empty; var status = OsuMemoryStatus.Unknown; var statusNum = -1; var playTime = -1; if (patternsToRead.OsuBase) { mapId = _reader.GetMapId(); songString = _reader.GetSongString(); mapMd5 = _reader.GetMapMd5(); mapFolderName = _reader.GetMapFolderName(); osuFileName = _reader.GetOsuFileName(); retrys = _reader.GetRetrys(); gameMode = _reader.ReadSongSelectGameMode(); mapData = $"HP:{_reader.GetMapHp()} OD:{_reader.GetMapOd()}, CS:{_reader.GetMapCs()}, AR:{_reader.GetMapAr()}, setId:{_reader.GetMapSetId()}"; status = _reader.GetCurrentStatus(out statusNum); playTime = _reader.ReadPlayTime(); } #endregion #region Mods var mods = -1; if (patternsToRead.Mods) { mods = _reader.GetMods(); } #endregion #region CurrentSkinData var skinFolderName = string.Empty; if (patternsToRead.CurrentSkinData) { skinFolderName = _reader.GetSkinFolderName(); } #endregion #region PlayContainer double hp = 0; var playerName = string.Empty; var hitErrorCount = -1; var playingMods = -1; double displayedPlayerHp = 0; if (status == OsuMemoryStatus.Playing && patternsToRead.PlayContainer) { playReseted = false; _reader.GetPlayData(playContainer); hp = _reader.ReadPlayerHp(); playerName = _reader.PlayerName(); hitErrorCount = _reader.HitErrors()?.Count ?? -2; playingMods = _reader.GetPlayingMods(); displayedPlayerHp = _reader.ReadDisplayedPlayerHp(); } else if (!playReseted) { playReseted = true; playContainer.Reset(); } #endregion #region TourneyBase // TourneyBase var tourneyIpcState = TourneyIpcState.Unknown; var tourneyIpcStateNumber = -1; var tourneyLeftStars = -1; var tourneyRightStars = -1; var tourneyBO = -1; var tourneyStarsVisible = false; var tourneyScoreVisible = false; if (status == OsuMemoryStatus.Tourney && patternsToRead.TourneyBase) { tourneyIpcState = _reader.GetTourneyIpcState(out tourneyIpcStateNumber); tourneyLeftStars = _reader.ReadTourneyLeftStars(); tourneyRightStars = _reader.ReadTourneyRightStars(); tourneyBO = _reader.ReadTourneyBO(); tourneyStarsVisible = _reader.ReadTourneyStarsVisible(); tourneyScoreVisible = _reader.ReadTourneyScoreVisible(); } #endregion stopwatch.Stop(); var readTimeMs = stopwatch.ElapsedTicks / (double)TimeSpan.TicksPerMillisecond; double readTimeMsMin; double readTimeMsMax; lock (_minMaxLock) { if (readTimeMs < _memoryReadTimeMin) { _memoryReadTimeMin = readTimeMs; } if (readTimeMs > _memoryReadTimeMax) { _memoryReadTimeMax = readTimeMs; } // copy value since we're inside lock readTimeMsMin = _memoryReadTimeMin; readTimeMsMax = _memoryReadTimeMax; } Invoke((MethodInvoker)(() => { textBox_readTime.Text = $" ReadTimeMS: {readTimeMs}{Environment.NewLine}" + $" Min ReadTimeMS: {readTimeMsMin}{Environment.NewLine}" + $"Max ReadTimeMS: {readTimeMsMax}{Environment.NewLine}"; textBox_mapId.Text = mapId.ToString(); textBox_strings.Text = $"songString: \"{songString}\" {Environment.NewLine}" + $"md5: \"{mapMd5}\" {Environment.NewLine}" + $"mapFolder: \"{mapFolderName}\" {Environment.NewLine}" + $"fileName: \"{osuFileName}\" {Environment.NewLine}" + $"Retrys:{retrys} {Environment.NewLine}" + $"mods:{(Mods)mods}({mods}) {Environment.NewLine}" + $"SkinName: \"{skinFolderName}\""; textBox_time.Text = playTime.ToString(); textBox_mapData.Text = mapData; textBox_Status.Text = status + " " + statusNum + " " + gameMode; textBox_CurrentPlayData.Text = playContainer + Environment.NewLine + $"hp________: {hp:00.##} {Environment.NewLine}" + $"displayedHp: {displayedPlayerHp:00.##} {Environment.NewLine}" + $"playingMods:{(Mods)playingMods} ({playingMods}) " + $"PlayerName: {playerName}{Environment.NewLine}" + $"HitErrorCount: {hitErrorCount} "; if (status == OsuMemoryStatus.Tourney) { textBox_TourneyStuff.Text = $"IPC-State: {tourneyIpcState} ({tourneyIpcStateNumber}) | BO {tourneyBO}{Environment.NewLine}" + $"Stars: {tourneyLeftStars} | {tourneyRightStars}{Environment.NewLine}" + $"Warmup/Stars State: {(tourneyStarsVisible ? "stars visible, warmup disabled" : "stars hidden, warmup enabled")}{Environment.NewLine}" + $"Score/Chat state: {(tourneyScoreVisible ? "chat hidden, score visible or no lobby joined" : "chat visible, score hidden")}{Environment.NewLine}"; } else { textBox_TourneyStuff.Text = "no data since not in tourney mode"; } })); await Task.Delay(_readDelay); } } catch (ThreadAbortException) { } }); }