Exemple #1
0
        public Oppai.pp_calc GetIfFcPP(ModsInfo mods, int n300, int n100, int n50, OsuPlayMode mode)
        {
            bool need_update = false;

            need_update = need_update || _fc_n100 != n100;
            need_update = need_update || _fc_n50 != n50;


            if (need_update)
            {
                _fc_n100 = n100;
                _fc_n50  = n50;

                Oppai.rtpp_params args;
                args.combo = Oppai.FULL_COMBO;
                args.mods  = (uint)mods.Mod;
                args.n100  = n100;
                args.n50   = n50;
                args.nmiss = 0;
                args.mode  = (uint)mode;

                Oppai.get_ppv2(Beatmap.RawData, (uint)Beatmap.RawData.Length, ref args, true, m_cache, ref _fc_result);
            }

            return(_fc_result);
        }
        private PerformanceCalculatorBase GetCalculator(OsuPlayMode mode)
        {
            switch (mode)
            {
            case OsuPlayMode.Osu:
                _stdPpCalculator = _stdPpCalculator ?? new StdPerformanceCalculator();
                return(_stdPpCalculator);

            case OsuPlayMode.Taiko:
                _taikoPpCalculator = _taikoPpCalculator ?? new TaikoPerformanceCalculator();
                return(_taikoPpCalculator);

            case OsuPlayMode.Mania:
                _maniaPpCalculator = _maniaPpCalculator ?? new ManiaPerformanceCalculator();
                return(_maniaPpCalculator);

            case OsuPlayMode.CatchTheBeat:
                _ctbPpCalculator = _ctbPpCalculator ?? new CatchTheBeatPerformanceCalculator();
                return(_ctbPpCalculator);

            default:
                CurrentIO.WriteColor($"[RealTimePPDisplay]Unknown Mode! Mode:0x{(int)mode:X8}", ConsoleColor.Red);
                return(null);
            }
        }
        protected PPTuple GetPPFromOppai(ModsInfo mods, OsuPlayMode mode)
        {
            if (Beatmap == null)
            {
                return(PPTuple.Empty);
            }

            Oppai.Beatmap = Beatmap;

            PPTuple pp_tuple;
            var     result = Oppai.GetMaxPP(mods, mode);

            pp_tuple.MaxPP         = result.total;
            pp_tuple.MaxAimPP      = result.aim;
            pp_tuple.MaxSpeedPP    = result.speed;
            pp_tuple.MaxAccuracyPP = result.acc;

            AccuracyRound(Accuracy, Beatmap.ObjectsCount, CountMiss, out int n300, out int n100, out int n50);

            result = Oppai.GetIfFcPP(mods, n300, n100, n50, mode);
            pp_tuple.FullComboPP         = result.total;
            pp_tuple.FullComboAimPP      = result.aim;
            pp_tuple.FullComboSpeedPP    = result.speed;
            pp_tuple.FullComboAccuracyPP = result.acc;

            result = Oppai.GetRealTimePP(Time, mods, Count100, Count50, CountMiss, MaxCombo, mode);
            pp_tuple.RealTimePP         = result.total;
            pp_tuple.RealTimeAimPP      = result.aim;
            pp_tuple.RealTimeSpeedPP    = result.speed;
            pp_tuple.RealTimeAccuracyPP = result.acc;

            return(pp_tuple);
        }
Exemple #4
0
        public pp_calc GetIfFcPP(ModsInfo mods, int n300, int n100, int n50, OsuPlayMode mode)
        {
            var needUpdate = _fcN100 != n100;

            needUpdate = needUpdate || _fcN50 != n50;


            if (needUpdate)
            {
                _fcN100 = n100;
                _fcN50  = n50;

                rtpp_params args;
                args.combo = FULL_COMBO;
                args.mods  = (uint)mods.Mod;
                args.n100  = n100;
                args.n50   = n50;
                args.nmiss = 0;
                args.mode  = (uint)mode;

                get_ppv2(Beatmap.RawData, (uint)Beatmap.RawData.Length, ref args, true, _cache, ref _fcResult);
            }

            return(_fcResult);
        }
        public ExtraApis(Plugin ortdp, Plugin rtppd)
        {
            _ortdp = ortdp as OsuRTDataProviderPlugin;
            _rtppd = rtppd as RealTimePPDisplayerPlugin;

            _ortdp.ListenerManager.OnPlayModeChanged += (l, c) => _mode = c;
            _ortdp.ListenerManager.OnModsChanged     += (c) => _mods = (uint)c.Mod;
            _ortdp.ListenerManager.OnBeatmapChanged  += (b) => _beatmap = b;
        }
Exemple #6
0
        public BeatmapReader(OsuRTDataProvider.BeatmapInfo.Beatmap beatmap, OsuPlayMode mode = OsuPlayMode.Unknown)
        {
            m_beatmap_header_span.Offset = 0;
            m_beatmap_header_span.Length = 0;
            Mode = mode;

            using (var fs = File.OpenRead(beatmap.FilenameFull))
            {
                RawData = new byte[fs.Length];
                fs.Read(RawData, 0, (int)fs.Length);
            }
            Parse();
        }
Exemple #7
0
 internal GameNode(string json) : base(json)
 {
     StatusEnum = GetEnum <OsuStatus>("status");
     PlayMode   = GetEnum <OsuPlayMode>("playMode");
     HP         = GetFloat("hp");
     Accuracy   = GetFloat("accuracy");
     Combo      = GetInt("combo");
     Count50    = GetInt("count50");
     Count100   = GetInt("count100");
     Count200   = GetInt("count200");
     Count300   = GetInt("count300");
     CountKatu  = GetInt("countKatu");
     CountGeki  = GetInt("countGeki");
     CountMiss  = GetInt("countMiss");
 }
Exemple #8
0
        public BeatmapReader(OsuRTDataProvider.BeatmapInfo.Beatmap beatmap, OsuPlayMode mode = OsuPlayMode.Unknown)
        {
            OrtdpBeatmap = beatmap;
            _beatmapHeaderSpan.Offset = 0;
            _beatmapHeaderSpan.Length = 0;
            Mode = mode;

            StringBuilder sb = new StringBuilder();

            foreach (var line in File.ReadAllLines(beatmap.FilenameFull))
            {
                sb.Append($"{line}\r\n");
            }

            RawData = Encoding.UTF8.GetBytes(sb.ToString());
            Parse();
        }
        private void RtppOnPlayModeChanged(OsuPlayMode last, OsuPlayMode mode)
        {
            Task.Run(() =>
            {
                bool @lock = _time > _beatmapReader?.BeatmapDuration / 4;
                if (@lock)
                {
                    _playStatusLocker.WaitOne();
                }

                _mode = mode;

                if (@lock)
                {
                    _playStatusLocker.ReleaseMutex();
                }
            });
        }
Exemple #10
0
        public pp_calc GetMaxPP(ModsInfo mods, OsuPlayMode mode)
        {
            bool needUpdate = mods != _maxMods;

            if (needUpdate)
            {
                _maxMods = mods;

                rtpp_params args;
                args.combo = FULL_COMBO;
                args.mods  = (uint)mods.Mod;
                args.n100  = 0;
                args.n50   = 0;
                args.nmiss = 0;
                args.mode  = (uint)mode;

                //Cache Beatmap
                get_ppv2(Beatmap.RawData, (uint)Beatmap.RawData.Length, ref args, false, _cache, ref _maxResult);
            }
            return(_maxResult);
        }
Exemple #11
0
        private void ListenerManagerOnPlayModeChanged(OsuPlayMode last, OsuPlayMode mode)
        {
            GameMode.CurrentMode = Game.Modes.GameMode.FromLegacyMode((OsuGameMode)mode);
            GameMode.LastMode    = Game.Modes.GameMode.FromLegacyMode((OsuGameMode)last);
            if (Beatmap.Mode == OsuGameMode.Osu)
            {
                if (CurrentMode is IHasPerformanceCalculator has && CurrentStatus == OsuGameStatus.SelectSong)
                {
                    PreCalculatedPp = has.GetMaxPerformance(this);
                }
            }

            if (CurrentMode is ILegacyMode legacyMode)
            {
                var val = _osuBeatmap?.ModStarPair.GetStars(legacyMode.LegacyMode, Mods.ToIntMod());
                if (Beatmap.Mode == OsuGameMode.Osu)
                {
                    Beatmap.Stars = val.GetValueOrDefault();
                }
            }
        }
Exemple #12
0
        public pp_calc GetMaxPP(ModsInfo mods, OsuPlayMode mode)
        {
            bool need_update = false;

            need_update = need_update || mods != _max_mods;

            if (need_update)
            {
                _max_mods = mods;

                Oppai.rtpp_params args;
                args.combo = Oppai.FULL_COMBO;
                args.mods  = (uint)mods.Mod;
                args.n100  = 0;
                args.n50   = 0;
                args.nmiss = 0;
                args.mode  = (uint)mode;

                //Cache Beatmap
                Oppai.get_ppv2(Beatmap.RawData, (uint)Beatmap.RawData.Length, ref args, false, m_cache, ref _max_result);
            }
            return(_max_result);
        }
        private void RtppOnPlayModeChanged(OsuPlayMode last, OsuPlayMode mode)
        {
            if (_status == OsuStatus.Playing)
            {
                _tmpLastPpCalculator = _ppCalculator;
            }

            switch (mode)
            {
            case OsuPlayMode.Osu:
                _ppCalculator = new StdPerformanceCalculator(); break;

            case OsuPlayMode.Taiko:
                _ppCalculator = new TaikoPerformanceCalculator(); break;

            case OsuPlayMode.Mania:
                _ppCalculator = new ManiaPerformanceCalculator(); break;

            default:
                CurrentIO.WriteColor("[RealTimePPDisplayer]Unsupported Mode", ConsoleColor.Red);
                _ppCalculator = null; break;
            }
            _mode = mode;
        }
Exemple #14
0
        private PerformanceCalculatorBase GetCalculator(OsuPlayMode mode)
        {
            PerformanceCalculatorBase calculator;

            switch (mode)
            {
            case OsuPlayMode.Osu:
                _stdPpCalculator = _stdPpCalculator ?? new StdPerformanceCalculator();
                calculator       = _stdPpCalculator;
                break;

            case OsuPlayMode.Taiko:
                _taikoPpCalculator = _taikoPpCalculator ?? new TaikoPerformanceCalculator();
                calculator         = _taikoPpCalculator;
                break;

            case OsuPlayMode.Mania:
                _maniaPpCalculator = _maniaPpCalculator ?? new ManiaPerformanceCalculator();
                calculator         = _maniaPpCalculator;
                break;

            case OsuPlayMode.CatchTheBeat:
                _ctbPpCalculator = _ctbPpCalculator ?? new CatchTheBeatPerformanceCalculator();
                calculator       = _ctbPpCalculator;
                break;

            default:
                Sync.Tools.IO.CurrentIO.WriteColor($"[ReplayPPDisplay]Unknown Mode! Mode:0x{(int)mode:X8}", ConsoleColor.Red);
                calculator = null;
                break;
            }

            calculator?.ClearCache();

            return(calculator);
        }
Exemple #15
0
        public void Parse()
        {
            int bias = 2;

            int pos = Array.IndexOf(RawData, (byte)'\n');

            if (RawData[pos - 1] != '\r')
            {
                bias = 1;
            }

            pos = 0;

            using (var ms = new MemoryStream(RawData))
            {
                using (var sr = new StreamReader(ms))
                {
                    string block_name = "";
                    while (!sr.EndOfStream)
                    {
                        string raw_line     = sr.ReadLine();
                        int    raw_line_len = Encoding.UTF8.GetByteCount(raw_line) + bias;

                        string line = raw_line.Trim();

                        if (line.StartsWith("["))
                        {
                            block_name = line.Substring(1, line.Length - 2).Trim();
                            if (block_name == "HitObjects")
                            {
                                m_beatmap_header_span.Length = pos + raw_line_len;
                            }
                        }
                        else if (!string.IsNullOrEmpty(line) && (block_name == "General" || block_name == "Difficulty"))
                        {
                            GetPropertyString(line, out var prop, out var val);

                            switch (prop)
                            {
                            case "Mode":
                                OsuPlayMode mode = (OsuPlayMode)int.Parse(val);
                                if (mode != OsuPlayMode.Mania && Mode == OsuPlayMode.Mania)
                                {
                                    Sync.Tools.IO.CurrentIO.WriteColor($"[RTPPD::Beatmap]Only support mania beatmap.", ConsoleColor.Yellow);
                                    Mode = mode;
                                }
                                else if (mode == OsuPlayMode.Mania && Mode != OsuPlayMode.Mania)
                                {
                                    Mode = mode;
                                }
                                break;

                            case "OverallDifficulty":
                                OverallDifficulty = double.Parse(val, CultureInfo.InvariantCulture);
                                break;

                            case "HPDrainRate":
                                HPDrainRate = double.Parse(val, CultureInfo.InvariantCulture);
                                break;

                            case "CircleSize":
                                CircleSize = double.Parse(val, CultureInfo.InvariantCulture);
                                if (Mode == OsuPlayMode.Mania)
                                {
                                    KeyCount = int.Parse(val);
                                }
                                break;
                            }
                        }
                        else if (!string.IsNullOrEmpty(line) && block_name == "HitObjects")
                        {
                            BeatmapObject obj;
                            if (Mode != OsuPlayMode.Mania)
                            {
                                obj = new BeatmapObject(line, pos, raw_line_len, this);
                            }
                            else
                            {
                                obj = new ManiaBeatmapObject(line, pos, raw_line_len, this);
                            }

                            Objects.Add(obj);
                        }

                        pos += raw_line_len;
                    }
                }
            }

            if (Mode == OsuPlayMode.Mania)
            {
                Objects.Sort((a, b) => a.StartTime - b.StartTime);
            }
        }
Exemple #16
0
        public pp_calc GetRealTimePP(int endTime, ModsInfo mods, int n100, int n50, int nmiss, int maxCombo, OsuPlayMode mode)
        {
            int pos = GetPosition(endTime, out int nobject);

            var needUpdate = false;

            needUpdate = _pos != pos;
            needUpdate = needUpdate || _n100 != n100;
            needUpdate = needUpdate || _n50 != n50;
            needUpdate = needUpdate || _nmiss != nmiss;
            needUpdate = needUpdate || _maxCombo != maxCombo;

            if (needUpdate)
            {
                _pos      = pos;
                _n100     = n100;
                _n50      = n50;
                _nmiss    = nmiss;
                _maxCombo = maxCombo;

                rtpp_params args;
                args.combo = maxCombo;
                args.mods  = (uint)mods.Mod;
                args.n100  = n100;
                args.n50   = n50;
                args.nmiss = nmiss;
                args.mode  = (uint)mode;

                if (!get_ppv2(Beatmap.RawData, (uint)pos, ref args, false, _realTimeData, ref _rtppResult))
                {
                    return(pp_calc.Empty);
                }
            }

            return(_rtppResult);
        }
Exemple #17
0
        public Oppai.pp_calc GetRealTimePP(int end_time, ModsInfo mods, int n100, int n50, int nmiss, int max_combo, OsuPlayMode mode)
        {
            int pos = GetPosition(end_time, out int nobject);

            bool need_update = false;

            need_update = need_update || _pos != pos;
            need_update = need_update || _n100 != n100;
            need_update = need_update || _n50 != n50;
            need_update = need_update || _nmiss != nmiss;
            need_update = need_update || _max_combo != max_combo;

            if (need_update)
            {
                _pos       = pos;
                _n100      = n100;
                _n50       = n50;
                _nmiss     = nmiss;
                _max_combo = max_combo;

                Oppai.rtpp_params args;
                args.combo = max_combo;
                args.mods  = (uint)mods.Mod;
                args.n100  = n100;
                args.n50   = n50;
                args.nmiss = nmiss;
                args.mode  = (uint)mode;

                if (!Oppai.get_ppv2(Beatmap.RawData, (uint)pos, ref args, false, m_real_time_data, ref _rtpp_result))
                {
                    return(Oppai.pp_calc.Empty);
                }
            }

            return(_rtpp_result);
        }
Exemple #18
0
        public void Parse()
        {
            int bias = 1;
            int pos  = 0;

            using (var ms = new MemoryStream(RawData))
            {
                using (var sr = new StreamReader(ms))
                {
                    string blockName = "";
                    while (!sr.EndOfStream)
                    {
                        string rawLine = sr.ReadLine();
                        Debug.Assert(rawLine != null, nameof(rawLine) + " != null");
                        int rawLineLen = Encoding.UTF8.GetByteCount(rawLine) + bias;

                        string line = rawLine.Trim();

                        if (line.StartsWith("["))
                        {
                            blockName = line.Substring(1, line.Length - 2).Trim();
                            if (blockName == "HitObjects")
                            {
                                _beatmapHeaderSpan.Length = pos + rawLineLen;
                            }
                        }
                        else if (!string.IsNullOrEmpty(line) && (blockName == "General" || blockName == "Difficulty"))
                        {
                            GetPropertyString(line, out var prop, out var val);

                            switch (prop)
                            {
                            case "Mode":
                                OsuPlayMode mode = (OsuPlayMode)int.Parse(val);
                                if (mode != OsuPlayMode.Mania && Mode == (int)OsuPlayMode.Mania)
                                {
                                    Sync.Tools.IO.CurrentIO.WriteColor("[RTPPD::Beatmap]Only support mania beatmap.", ConsoleColor.Yellow);
                                    Mode = (int)mode;
                                }
                                else if (mode == OsuPlayMode.Mania && Mode != (int)OsuPlayMode.Mania)
                                {
                                    Mode = (int)mode;
                                }
                                break;

                            case "ApproachRate":
                                ApproachRate = double.Parse(val, CultureInfo.InvariantCulture);
                                break;

                            case "OverallDifficulty":
                                OverallDifficulty = double.Parse(val, CultureInfo.InvariantCulture);
                                break;

                            case "HPDrainRate":
                                HpDrainRate = double.Parse(val, CultureInfo.InvariantCulture);
                                break;

                            case "CircleSize":
                                CircleSize = double.Parse(val, CultureInfo.InvariantCulture);
                                if (Mode == (int)OsuPlayMode.Mania)
                                {
                                    KeyCount = int.Parse(val);
                                }
                                break;
                            }
                        }
                        else if (!string.IsNullOrEmpty(line) && blockName == "HitObjects")
                        {
                            BeatmapObject obj;

                            switch (Mode)
                            {
                            case (int)OsuPlayMode.Mania:
                                obj = new ManiaBeatmapObject(line, pos, rawLineLen, this);
                                break;

                            case (int)OsuPlayMode.CatchTheBeat:
                            case (int)OsuPlayMode.Osu:
                            case (int)OsuPlayMode.Taiko:
                                obj = new BeatmapObject(line, pos, rawLineLen, this);
                                break;

                            default:
                                obj = null;
                                break;
                            }

                            Objects.Add(obj);
                        }

                        pos += rawLineLen;
                    }
                }
            }

            if (Mode == (int)OsuPlayMode.Mania)
            {
                Objects.Sort((a, b) => a.StartTime - b.StartTime);
            }
        }
Exemple #19
0
        private void ListenLoopUpdate()
        {
            OsuStatus status = GetCurrentOsuStatus();

            if (status == OsuStatus.NoFoundProcess)
            {
                m_osu_process      = null;
                m_play_finder      = null;
                m_status_finder    = null;
                m_beatmap_finder   = null;
                m_mode_finder      = null;
                m_hit_event_finder = null;

                FindOsuProcess();
            }

            //Waiting for osu to start
            if (status != OsuStatus.NoFoundProcess && status != OsuStatus.Unkonwn)
            {
                //Wait for player to playing
                if (status == OsuStatus.Playing)
                {
                    if (m_play_finder == null)
                    {
                        m_play_finder = InitFinder <OsuPlayFinder>(LANG_INIT_PLAY_FINDER_SUCCESS, LANG_INIT_PLAY_FINDER_FAILED);
                    }

                    if (Setting.GameMode == "Auto" && m_mode_finder == null)
                    {
                        m_mode_finder = InitFinder <OsuPlayModeFinder>(LANG_INIT_MODE_FINDER_SUCCESS, LANG_INIT_MODE_FINDER_FAILED);
                    }

                    if (m_hit_event_finder == null)
                    {
                        m_hit_event_finder = InitFinder <OsuHitEventFinder>(LANG_INIT_HIT_EVENT_SUCCESS, LANG_INIT_HIT_EVENT_FAIL);
                    }
                }

                if (m_beatmap_finder == null)
                {
                    m_beatmap_finder = InitFinder <OsuBeatmapFinder>(LANG_INIT_BEATMAP_FINDER_SUCCESS, LANG_INIT_BEATMAP_FINDER_FAILED);
                }

                if (m_mode_finder != null)
                {
                    OsuPlayMode mode = OsuPlayMode.Osu;

                    if (OnPlayModeChanged != null)
                    {
                        mode = m_mode_finder.GetMode();
                    }

                    if (m_last_mode != mode)
                    {
                        OnPlayModeChanged?.Invoke(m_last_mode, mode);
                    }

                    m_last_mode = mode;
                }
                else
                {
                    if (Setting.GameMode != "Auto")
                    {
                        if (s_game_mode_map.TryGetValue(Setting.GameMode, out var mode))
                        {
                            if (m_last_mode != mode)
                            {
                                OnPlayModeChanged?.Invoke(m_last_mode, mode);
                            }
                        }

                        m_last_mode = mode;
                    }
                }

                if (OnHitEventsChanged != null && m_hit_event_finder != null)
                {
                    // Hit events should work with playing time
                    if (OnPlayingTimeChanged == null)
                    {
                        OnPlayingTimeChanged += (t) => { }
                    }
                    ;

                    bool hasChanged;
                    m_hit_event_finder.GetHitEvents(status, m_playing_time, out m_play_type, out m_hit_events, out hasChanged);
                    if (hasChanged)
                    {
                        OnHitEventsChanged?.Invoke(m_play_type, m_hit_events);
                    }
                }

                if (m_play_finder != null)
                {
                    Beatmap  beatmap = Beatmap.Empty;
                    ModsInfo mods    = ModsInfo.Empty;
                    ErrorStatisticsResult error_statistics = ErrorStatisticsResult.Empty;
                    int    cb         = 0;
                    int    pt         = 0;
                    int    n300       = 0;
                    int    n100       = 0;
                    int    n50        = 0;
                    int    ngeki      = 0;
                    int    nkatu      = 0;
                    int    nmiss      = 0;
                    int    score      = 0;
                    double hp         = 0.0;
                    double acc        = 0.0;
                    string playername = Setting.Username;

                    try
                    {
                        if (OnPlayingTimeChanged != null)
                        {
                            pt = m_play_finder.GetPlayingTime();
                        }
                        if (OnBeatmapChanged != null)
                        {
                            beatmap = m_beatmap_finder.GetCurrentBeatmap(m_osu_id);
                        }
                        if (Setting.EnableModsChangedAtListening && status != OsuStatus.Playing)
                        {
                            if (OnModsChanged != null)
                            {
                                mods = m_play_finder.GetCurrentModsAtListening();
                            }
                        }

                        if (beatmap != Beatmap.Empty && beatmap != m_last_beatmap)
                        {
                            OnBeatmapChanged?.Invoke(beatmap);
                        }

                        if (status == OsuStatus.Playing)
                        {
                            if (OnErrorStatisticsChanged != null)
                            {
                                error_statistics = m_play_finder.GetUnstableRate();
                            }
                            if (OnModsChanged != null)
                            {
                                mods = m_play_finder.GetCurrentMods();
                            }
                            if (OnComboChanged != null)
                            {
                                cb = m_play_finder.GetCurrentCombo();
                            }
                            if (OnCount300Changed != null)
                            {
                                n300 = m_play_finder.Get300Count();
                            }
                            if (OnCount100Changed != null)
                            {
                                n100 = m_play_finder.Get100Count();
                            }
                            if (OnCount50Changed != null)
                            {
                                n50 = m_play_finder.Get50Count();
                            }
                            if (OnCountGekiChanged != null)
                            {
                                ngeki = m_play_finder.GetGekiCount();
                            }
                            if (OnCountKatuChanged != null)
                            {
                                nkatu = m_play_finder.GetKatuCount();
                            }
                            if (OnCountMissChanged != null)
                            {
                                nmiss = m_play_finder.GetMissCount();
                            }
                            if (OnAccuracyChanged != null)
                            {
                                acc = m_play_finder.GetCurrentAccuracy();
                            }
                            if (OnHealthPointChanged != null)
                            {
                                hp = m_play_finder.GetCurrentHP();
                            }
                            if (OnScoreChanged != null)
                            {
                                score = m_play_finder.GetCurrentScore();
                            }
                            if (OnPlayerChanged != null)
                            {
                                playername = m_play_finder.GetCurrentPlayerName();
                            }
                        }

                        if (status != m_last_osu_status)
                        {
                            OnStatusChanged?.Invoke(m_last_osu_status, status);
                        }

                        if (mods != ModsInfo.Empty && !ModsInfo.VaildMods(mods))
                        {
                            mods = m_last_mods;
                        }

                        if (mods != m_last_mods)
                        {
                            OnModsChanged?.Invoke(mods);
                        }

                        if (hp != m_last_hp)
                        {
                            OnHealthPointChanged?.Invoke(hp);
                        }

                        if (acc != m_last_acc)
                        {
                            OnAccuracyChanged?.Invoke(acc);
                        }

                        if (!error_statistics.Equals(m_last_error_statistics))
                        {
                            OnErrorStatisticsChanged?.Invoke(error_statistics);
                        }

                        if (playername != m_last_playername)
                        {
                            OnPlayerChanged(playername);
                        }

                        if (score != m_last_score)
                        {
                            OnScoreChanged?.Invoke(score);
                        }

                        if (n300 != m_last_300)
                        {
                            OnCount300Changed?.Invoke(n300);
                        }

                        if (n100 != m_last_100)
                        {
                            OnCount100Changed?.Invoke(n100);
                        }

                        if (n50 != m_last_50)
                        {
                            OnCount50Changed?.Invoke(n50);
                        }

                        if (ngeki != m_last_geki)
                        {
                            OnCountGekiChanged?.Invoke(ngeki);
                        }

                        if (nkatu != m_last_katu)
                        {
                            OnCountKatuChanged?.Invoke(nkatu);
                        }

                        if (nmiss != m_last_miss)
                        {
                            OnCountMissChanged?.Invoke(nmiss);
                        }

                        if (cb != m_last_combo)
                        {
                            OnComboChanged?.Invoke(cb);
                        }

                        if (pt != m_playing_time)
                        {
                            OnPlayingTimeChanged?.Invoke(pt);
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Error(e.ToString());
                    }

                    m_last_beatmap          = beatmap;
                    m_last_mods             = mods;
                    m_last_hp               = hp;
                    m_last_acc              = acc;
                    m_last_error_statistics = error_statistics;
                    m_last_combo            = cb;
                    m_playing_time          = pt;
                    m_last_300              = n300;
                    m_last_100              = n100;
                    m_last_50               = n50;
                    m_last_geki             = ngeki;
                    m_last_katu             = nkatu;
                    m_last_miss             = nmiss;
                    m_last_score            = score;
                    m_last_osu_status       = status;
                    m_last_playername       = playername;
                }
            }
        }
 static void listener_OnPlayModeChanged(OsuPlayMode last, OsuPlayMode mode)
 {
     update_display();
 }
        public static List <BeatPerformance> GetBp(string player, OsuPlayMode mode)
        {
            HttpWebRequest req;

            if (Setting.ByCuteSyncProxy)
            {
                if (publicOsuBotTransferWarpper == null)
                {
                    publicOsuBotTransferWarpper = new PublicOsuBotTransferWarpper();
                    if (!publicOsuBotTransferWarpper.Init())
                    {
                        return(null);
                    }
                }
                if (publicOsuBotTransferWarpper.Username != player)
                {
                    Sync.Tools.IO.DefaultIO.WriteColor(DefaultLanguage.HINT_CANNOT_WATCH_OTHER_PLAYER, ConsoleColor.Yellow);
                    return(null);
                }

                if (string.IsNullOrEmpty(publicOsuBotTransferWarpper.Token))
                {
                    return(null);
                }

                req = (HttpWebRequest)WebRequest.Create($"https://osubot.kedamaovo.moe/osuapi/bp?k={publicOsuBotTransferWarpper.Token}&u={player}&type=string&limit=100&m={(uint)mode}");
            }
            else
            {
                req = (HttpWebRequest)WebRequest.Create($"https://osu.ppy.sh/api/get_user_best?k={Setting.ApiKey}&u={player}&type=string&limit=100&m={(uint)mode}");
            }

            req.Timeout = 5000;
            List <BeatPerformance> result = new List <BeatPerformance>();
            Stream stream = null;

            try
            {
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                stream = resp.GetResponseStream();
                using (StreamReader sr = new StreamReader(stream))
                {
                    var json = sr.ReadToEnd();
                    var objs = Newtonsoft.Json.JsonConvert.DeserializeObject <List <Dictionary <string, string> > >(json);
                    foreach (var obj in objs)
                    {
                        BeatPerformance bp = new BeatPerformance();
                        bp.BeatmapID = int.Parse(obj["beatmap_id"]);
                        bp.Score     = int.Parse(obj["score"]);
                        bp.ScoreID   = obj["score_id"];
                        bp.MaxCombo  = int.Parse(obj["maxcombo"]);
                        bp.Count50   = int.Parse(obj["count50"]);
                        bp.Count100  = int.Parse(obj["count100"]);
                        bp.Count300  = int.Parse(obj["count300"]);
                        bp.CountMiss = int.Parse(obj["countmiss"]);
                        bp.CountKatu = int.Parse(obj["countkatu"]);
                        bp.CountGeki = int.Parse(obj["countgeki"]);
                        bp.Perfect   = obj["perfect"] == "1";
                        Enum.TryParse <ModsInfo.Mods>(obj["enabled_mods"], out var mods);
                        bp.EnabledMods = new ModsInfo()
                        {
                            Mod = mods
                        };

                        bp.UserID = obj["user_id"];
                        bp.Date   = DateTime.Parse(obj["date"]);
                        bp.Rank   = obj["rank"];
                        bp.PP     = double.Parse(obj["pp"]);

                        result.Add(bp);
                    }
                }
            }
            catch
            {
                return(null);
            }
            finally
            {
                stream?.Close();
            }

            result.Sort((a, b) => b.PP.CompareTo(a.PP));
            return(result);
        }
        public static UserInfo GetPlayerInfo(string player, OsuPlayMode mode)
        {
            HttpWebRequest req;

            if (Setting.ByCuteSyncProxy)
            {
                return(null);
            }
            else
            {
                req = (HttpWebRequest)WebRequest.Create($"https://osu.ppy.sh/api/get_user?k={Setting.ApiKey}&u={player}&type=string&m={(uint)mode}");
            }

            req.Timeout = 5000;
            UserInfo result = new UserInfo();
            Stream   stream = null;

            try
            {
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                stream = resp.GetResponseStream();
                using (StreamReader sr = new StreamReader(stream))
                {
                    var    json    = sr.ReadToEnd();
                    JArray jObject = JArray.Parse(json);

                    JToken obj = jObject[0];
                    result.Accuracy           = double.Parse(obj["accuracy"].Value <string>());
                    result.Count50            = uint.Parse(obj["count50"].Value <string>());
                    result.Count100           = uint.Parse(obj["count100"].Value <string>());
                    result.Count300           = uint.Parse(obj["count300"].Value <string>());
                    result.CountA             = uint.Parse(obj["count_rank_a"].Value <string>());
                    result.CountS             = uint.Parse(obj["count_rank_s"].Value <string>());
                    result.CountSH            = uint.Parse(obj["count_rank_sh"].Value <string>());
                    result.CountSS            = uint.Parse(obj["count_rank_ss"].Value <string>());
                    result.CountSSH           = uint.Parse(obj["count_rank_ssh"].Value <string>());
                    result.Country            = obj["country"].Value <string>();
                    result.JoinDate           = obj["join_date"].Value <string>();
                    result.Level              = double.Parse(obj["level"].Value <string>());
                    result.PlayCount          = uint.Parse(obj["playcount"].Value <string>());
                    result.PPRank             = uint.Parse(obj["pp_rank"].Value <string>());
                    result.PPRankCountry      = uint.Parse(obj["pp_country_rank"].Value <string>());
                    result.RankedScore        = obj["ranked_score"].Value <string>();
                    result.TotalScore         = obj["total_score"].Value <string>();
                    result.TotalSecondsPlayed = obj["total_seconds_played"].Value <string>();
                    result.UserID             = obj["user_id"].Value <string>();
                    result.Username           = obj["username"].Value <string>();
                    result.TotalPP            = double.Parse(obj["pp_raw"].Value <string>());
                }
            }
            catch (Exception e)
            {
                IO.CurrentIO.WriteColor(e.ToString(), ConsoleColor.Red);
                return(null);
            }
            finally
            {
                stream?.Close();
            }

            return(result);
        }
Exemple #23
0
 /// <summary>
 ///     使用两个<see cref="OsuRTDataProvider.Listen.OsuPlayMode" />构造一个GMMode
 /// </summary>
 /// <param name="lastMode"></param>
 /// <param name="nowMode"></param>
 public GmMode(OsuPlayMode lastMode, OsuPlayMode nowMode)
 {
     LastMode    = GameMode.FromLegacyMode((OsuGameMode)lastMode);
     CurrentMode = GameMode.FromLegacyMode((OsuGameMode)nowMode);
 }
Exemple #24
0
        public PPControl(OsuListenerManager mamger, int?id)
        {
            m_listener_manager = mamger;

            m_listener_manager.OnModsChanged      += (mods) => { m_cur_mods = mods; m_pp_calculator.ClearCache(); };
            m_listener_manager.OnCount300Changed  += c => m_n300 = c;
            m_listener_manager.OnCountGekiChanged += c => m_ngeki = c;
            m_listener_manager.OnCountKatuChanged += c => m_nkatu = c;
            m_listener_manager.OnCount100Changed  += c => m_n100 = c;
            m_listener_manager.OnCount50Changed   += c => m_n50 = c;
            m_listener_manager.OnCountMissChanged += c => m_nmiss = c;
            m_listener_manager.OnScoreChanged     += s => m_score = s;
            m_listener_manager.OnPlayModeChanged  += (last, mode) =>
            {
                switch (mode)
                {
                case OsuPlayMode.Osu:
                    m_pp_calculator = new StdPPCalculator(); break;

                case OsuPlayMode.Taiko:
                    m_pp_calculator = new TaikoPerformanceCalculator(); break;

                case OsuPlayMode.Mania:
                    m_pp_calculator = new ManiaPerformanceCalculator(); break;

                default:
                    Sync.Tools.IO.CurrentIO.WriteColor("[RealTimePPDisplayer]Unsupported Mode", ConsoleColor.Red);
                    m_pp_calculator = null; break;
                }
                m_mode = mode;
            };

            m_listener_manager.OnStatusChanged += (last, cur) =>
            {
                m_status = cur;
                if (cur == OsuStatus.Listening || cur == OsuStatus.Editing)//Clear Output
                {
                    m_combo     = 0;
                    m_max_combo = 0;
                    m_n100      = 0;
                    m_n50       = 0;
                    m_nmiss     = 0;
                    foreach (var p in m_displayers)
                    {
                        p.Value.Clear();
                    }
                }
            };

            m_listener_manager.OnComboChanged += (combo) =>
            {
                if (m_status != OsuStatus.Playing)
                {
                    return;
                }
                if (combo <= ((m_pp_calculator as OppaiPerformanceCalculator)?.Oppai.FullCombo ?? 20000))
                {
                    m_combo     = combo;
                    m_max_combo = Math.Max(m_max_combo, m_combo);
                }
            };

            m_listener_manager.OnBeatmapChanged     += RTPPOnBeatmapChanged;
            m_listener_manager.OnPlayingTimeChanged += RTPPOnPlayingTimeChanged;
        }
Exemple #25
0
 public void OnPlayModeChanged(OsuPlayMode lastMode, OsuPlayMode mode)
 {
     // todo
 }