/// <summary> /// Saves user settings and database data to disk. /// </summary> internal bool Save() { try { ConfigManager.SaveConfig(); BeatmapManager.DatabaseSerialize(); PresenceCache.DatabaseSerialize(); CollectionManager.SaveToDisk(); ScoreManager.SaveToDisk(); return(true); } catch (Exception e) { ErrorSubmission.Submit(new OsuError(e) { Feedback = "background-save" }); return(false); } finally { lastSave = GameBase.Time; modeChangeCount = 0; } }
internal bool RequestPresence(bool fill = true, bool force = false) { if (InitialLoadComplete && !force) { return(false); } PresenceCacheItem i = PresenceCache.Query(Id, fill); if (i != null) { ReceivePresence(i.Presence); return(true); } return(false); }
private void InitializeTester() { if (!PREDEFINED_TEST) { return; } if (BeatmapManager.Beatmaps.Count > 0) { if (USE_LAST_PLAYED_BEATMAP) { List <Beatmap> temp = new List <Beatmap>(BeatmapManager.Beatmaps); temp.Sort((a, b) => { return(a.DateLastPlayed.CompareTo(b.DateLastPlayed)); }); BeatmapManager.Current = temp[temp.Count - 1]; } else //Choose a random beatmap { BeatmapManager.Current = BeatmapManager.Beatmaps[RNG.Next(0, BeatmapManager.Beatmaps.Count)]; } } if (MULTIPLAYER_MATCH) { if (BeatmapManager.Current == null) { NotificationManager.ShowMessage("Couldn't start in specified test mode because no beatmaps were available."); return; } BanchoClient.Start(); Mode = OsuModes.MatchSetup; const int player_count = 8; while (!BanchoClient.Connected || !BanchoClient.InitializationComplete) { Scheduler.Update(); } PresenceCache.QueryAll(); while (User.Id <= 0 || BanchoClient.Users.Count < player_count) { Scheduler.Update(); } List <User> users = BanchoClient.Users.FindAll(u => u.InitialLoadComplete && u.Id != User.Id); users.Insert(0, User); //we are the first user. MatchSetup.Match = new ClientSideMatch(new bMatch(MatchTypes.Standard, MatchScoringTypes.Score, MatchTeamTypes.TeamVs, PlayModes.Osu, @"My test game", string.Empty, player_count, BeatmapManager.Current.SortTitle, BeatmapManager.Current.BeatmapChecksum, BeatmapManager.Current.BeatmapId, MODS_TO_USE, 2, MultiSpecialModes.FreeMod )); for (int i = 0; i < player_count; i++) { MatchSetup.Match.slotId[i] = users[i].Id; MatchSetup.Match.UserSlots[i] = users[i]; MatchSetup.Match.slotStatus[i] = SlotStatus.Playing; switch (MatchSetup.Match.matchTeamType) { case MatchTeamTypes.TagTeamVs: case MatchTeamTypes.TeamVs: MatchSetup.Match.slotTeam[i] = i % 2 == 0 ? SlotTeams.Blue : SlotTeams.Red; break; } } bScoreFrame[] frames = new bScoreFrame[player_count]; for (int i = 0; i < player_count; i++) { frames[i] = new bScoreFrame { id = (byte)i, pass = true, currentHp = 200 } } ; RunBackgroundThread(delegate { Thread.Sleep(5000); for (int i = 0; i < player_count; i++) { PlayerVs.MatchPlayerSkipped(i); Thread.Sleep(100); } Thread.Sleep(2000); Player.QueueSkip(); Player.Instance?.DoSkip(); PlayerVs.AllPlayersLoaded = true; PlayerVs.AllPlayersCompleted = true; while (true) { byte player = (byte)RNG.Next(0, player_count); switch (RNG.Next(0, 30)) { default: frames[player].count300 += 1; frames[player].currentCombo++; frames[player].currentHp += 3; break; case 1: case 2: case 3: frames[player].count100 += 1; frames[player].currentCombo++; frames[player].currentHp += 2; break; case 4: case 5: frames[player].count50 += 1; frames[player].currentHp += 1; frames[player].currentCombo++; break; case 6: frames[player].countMiss += 1; frames[player].currentHp -= 50; frames[player].currentCombo = 0; break; } frames[player].currentHp = OsuMathHelper.Clamp(frames[player].currentHp, 0, 200); if (frames[player].currentHp == 0) { frames[player].pass = false; } else if (frames[player].currentHp > 100) { frames[player].pass = true; } frames[player].totalScore += frames[player].currentCombo * 300; frames[player].maxCombo = Math.Max(frames[player].maxCombo, frames[player].currentCombo); PlayerVs.MatchScoreUpdate(frames[player]); Thread.Sleep(50); } }); } switch (INITIAL_MODE) { case OsuModes.Play: if (BeatmapManager.Current == null) { NotificationManager.ShowMessage("Couldn't start in specified test mode because no beatmaps were available."); return; } ModManager.ModStatus = MODS_TO_USE; if (AUTOMATIC_SKIP) { GameBase.RunBackgroundThread(delegate { while (true) { if (Player.Instance != null && Player.Instance.Status != PlayerStatus.Busy) { Scheduler.Add(delegate { Player.Instance?.DoSkip(); }); if (Player.HasSkipped) { break; } } Thread.Sleep(200); } }); } if (AUTOPLAY) { ModManager.ModStatus |= Mods.Autoplay; } break; } QueuedMode = INITIAL_MODE; Player.Mode = INITIAL_PLAY_MODE; } }
internal override void Update() { if (!ConfigManager.sFpsCounter || (!InputManager.HandleInput && monitor.FramesPerSecond == 0)) { return; } base.Update(); double decay = Math.Pow(0.05, GameBase.ElapsedMilliseconds / 1000.0); double targetFps = GameBase.TargetFrameRate; char suffix = '\\'; if (targetFps > 1000) { //We don't want to display unlimited target FPS, so let's use the user's refresh rate instead. targetFps = GameBase.RefreshRate; //In this case we change the suffix displayed for the cap from 'fps' to 'hz' to make things a bit easier to understand. suffix = '+'; } if (GameBase.TotalFramesRendered % targetFps == 0) { #if DEBUG float drawTimes = SpriteManager.PixelCount / (GameBase.WindowManager.Width * GameBase.WindowManager.Height); backgroundDelay.HandleInput = true; if (SpriteManager.Placement && SpriteManager.ClickHandledSprite != null) { backgroundDelay.ToolTip = SpriteManager.ClickHandledSprite.ToString(); } else { backgroundDelay.ToolTip = string.Format( "FPS {0:#,#}fps {15}sfps | NET ↑{5:#,0}kb ↓{6:#,0}kb {28}pkt {27}ms | MOUSE ({7:0.0},{8:0.0}) POLL{29}\n" + "SPRITES man:{1} sk:{9} bm:{10} osu:{12} dyn:{13}/{14} vbo:{32} rbo:{34} fbo:{35} tex:{33}\n" + "TIME a{16} g{17} v{18}{19} | GC {24}/{23}/{22} | MON {21}hz\n" + "PERF cpu:{20}ms fill:{2:n}m ({3:n}x) {4} sprites:{30} vis:{31}\n" + "{25}", monitor.FramesPerSecond, SpriteManager.InstanceCount, SpriteManager.PixelCount / 1000000f, drawTimes, string.Empty, /* 4 */ BanchoClient.SentBytes / 1024, BanchoClient.ReceivedBytes / 1024, /* 6 */ MouseManager.MousePositionWindow.X, MouseManager.MousePositionWindow.Y, /* 8 */ TextureManager.GetCacheCount(SkinSource.Skin), TextureManager.GetCacheCount(SkinSource.Beatmap), 0, /* 11 */ TextureManager.GetCacheCount(SkinSource.Osu), DynamicSpriteCache.DynamicSprites.Count, /* 13 */ DynamicSpriteCache.DynamicSpritesNoUnload.Count, 0, AudioEngine.Time, GameBase.Time, /* 17 */ AudioEngine.VirtualTimeAccumulated, AudioEngine.ExtendedTime ? "!" : string.Empty, string.Empty, GameBase.RefreshRate, /* 21 */ GC.CollectionCount(0), GC.CollectionCount(1), GC.CollectionCount(2), /* 24 */ PresenceCache.Status(), Player.Seed, /* 26 */ BanchoClient.RequestInterval, BanchoClient.SendCount, /* 28 */ MouseManager.MousePollRate, /* 29 */ SpriteManager.TotalSprites, SpriteManager.TotalSpritesVisible, GameBase.AmountVBO, GameBase.AmountTextures, /* 33 */ RenderTarget2D.TotalRenderBuffers, RenderTarget2D.TotalFrameBuffers /* 35 */ ); } #endif } if (Math.Abs(monitor.FramesPerSecond - fpsDisplayValue) > 0.5) { fpsDisplayValue = fpsDisplayValue * decay + Math.Min(targetFps, monitor.FramesPerSecond) * (1.0 - decay); textFpsDisplay.Text = String.Format(@"{0:#,#}\", (int)Math.Round(fpsDisplayValue)); textFpsLimitDisplay.Text = @"/" + targetFps + suffix; } IsFaded = Math.Abs(fpsDisplayValue - targetFps) < 0.5; //format the frame time displace (three significant digits) if (monitor.AverageFrameTime >= 10) { textFrameDelay.Text = monitor.AverageFrameTime.ToString(@"0") + '='; } else if (monitor.AverageFrameTime >= 1) { textFrameDelay.Text = monitor.AverageFrameTime.ToString(@"0.0") + '='; } else { textFrameDelay.Text = monitor.AverageFrameTime.ToString(@"0.00") + '='; } if (IsFaded) { backgroundFps.InitialColour = colour_okay; } else if (fpsDisplayValue > targetFps - 10 && fpsDisplayValue > targetFps * 0.95f) { backgroundFps.InitialColour = colour_warning; } else { backgroundFps.InitialColour = colour_danger; } if (monitor.AverageFrameTime < 8) { backgroundDelay.InitialColour = colour_okay; } else if (monitor.AverageFrameTime < 16) { backgroundDelay.InitialColour = colour_warning; } else { backgroundDelay.InitialColour = colour_danger; } updateDroppedFrames(); }