public void Tick(IOsuMemoryReader reader, bool sendEvents) { _currentStatus = reader.GetCurrentStatus(out _); if (_lastStatusLog != _currentStatus) { _lastStatusLog = _currentStatus; //Console.WriteLine("status: {0} {1}", _currentStatus, _currentStatus == OsuMemoryStatus.Unknown ? num.ToString() : ""); } if (_currentStatus != OsuMemoryStatus.NotRunning) { _currentMapId = reader.GetMapId(); _currentMapString = reader.GetSongString(); OsuStatus status = _currentStatus.Convert(); var gameMode = reader.ReadSongSelectGameMode(); var mapHash = reader.GetMapMd5Safe(); var mapSelectionMods = reader.GetMods(); var mapHashDiffers = mapHash != null && _lastMapHash != null && _lastMapHash != mapHash; if (sendEvents && (_lastMapId != _currentMapId || _lastStatus != _currentStatus || _currentMapString != _lastMapString || gameMode != _lastGameMode || mapSelectionMods != _lastMapSelectionMods || mapHashDiffers) ) { _lastMapId = _currentMapId; _lastStatus = _currentStatus; _lastMapString = _currentMapString; _lastGameMode = gameMode; _lastMapSelectionMods = mapSelectionMods; _lastMapHash = mapHash; NewOsuEvent?.Invoke(this, new MapSearchArgs("OsuMemory") { MapId = _currentMapId, Status = status, Raw = _currentMapString, MapHash = mapHash, PlayMode = (PlayMode)gameMode, }); } _memoryDataProcessor.Tick(status, reader); } }
public void Tick(IOsuMemoryReader reader, bool sendEvents) { _currentStatus = reader.GetCurrentStatus(out _); if (_lastStatusLog != _currentStatus) { _lastStatusLog = _currentStatus; //Console.WriteLine("status: {0} {1}", _currentStatus, _currentStatus == OsuMemoryStatus.Unknown ? num.ToString() : ""); } if (_currentStatus != OsuMemoryStatus.NotRunning) { _currentMapId = reader.GetMapId(); var isReplay = reader.IsReplay(); OsuStatus status = _currentStatus.Convert(); status = status == OsuStatus.Playing && isReplay ? OsuStatus.Watching : status; var gameMode = reader.ReadSongSelectGameMode(); var mapHash = reader.GetMapMd5Safe(); var mapSelectionMods = reader.GetMods(); var playingMods = status == OsuStatus.Playing || status == OsuStatus.Watching ? reader.GetPlayingMods() : -1; var retries = reader.GetRetrys(); var currentTime = reader.ReadPlayTime(); var mapHashDiffers = mapHash != null && _lastMapHash != null && _lastMapHash != mapHash; var mapIdDiffers = _lastMapId != _currentMapId; var memoryStatusDiffers = _lastStatus != _currentStatus; var gameModeDiffers = gameMode != _lastGameMode; var mapSelectionModsDiffer = mapSelectionMods != _lastMapSelectionMods; var playingModsDiffer = (status == OsuStatus.Watching || status == OsuStatus.Playing) && playingMods != _lastPlayingMods; OsuEventType?osuEventType = null; //"good enough" replay retry detection. if (isReplay && _currentStatus == OsuMemoryStatus.Playing && _lastTime > currentTime && DateTime.UtcNow > _nextReplayRetryAllowedAt) { osuEventType = OsuEventType.PlayChange; _nextReplayRetryAllowedAt = DateTime.UtcNow.AddMilliseconds(500); } _lastTime = currentTime; var playInitialized = (status != OsuStatus.Watching && status != OsuStatus.Playing) || playingMods != -1; if (sendEvents && playInitialized && ( osuEventType.HasValue || mapIdDiffers || memoryStatusDiffers || mapHashDiffers || gameModeDiffers || mapSelectionModsDiffer || retries != _lastRetries ) ) { if (!osuEventType.HasValue || playingModsDiffer) { osuEventType = mapIdDiffers || mapHashDiffers || gameModeDiffers || mapSelectionModsDiffer || playingModsDiffer ? OsuEventType.MapChange //different mapId/hash/mode/mods(changed stats) = different map : memoryStatusDiffers ? OsuEventType.SceneChange //memory scene(status) change = Scene change : _currentStatus == OsuMemoryStatus.Playing ? OsuEventType.PlayChange // map retry : OsuEventType.MapChange; //bail } _lastMapId = _currentMapId; _lastStatus = _currentStatus; _lastRetries = retries; _lastGameMode = gameMode; _lastMapSelectionMods = mapSelectionMods; _lastMapHash = mapHash; _lastPlayingMods = playingMods; NewOsuEvent?.Invoke(this, new MapSearchArgs("OsuMemory", osuEventType.Value) { MapId = _currentMapId, Status = status, Raw = reader.GetSongString(), MapHash = mapHash, PlayMode = (PlayMode)gameMode, }); } _memoryDataProcessor.Tick(status, reader); } }