Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
            }
        }