protected override void Dispose(bool disposing) { if (GameBase.QueuedMode != OsuModes.RankingVs) { PlayerVs.DisposeStatic(); base.Dispose(disposing); } }
internal MultiRulesetTagCoop(PlayerVs player) : base(player) { InputManager.ReplayCursorFollow = false; combinedScore.InvalidateSubmission(); combinedScore.Pass = true; }
protected override void Dispose(bool disposing) { if (Player.ScoreBoard != null) { Player.ScoreBoard.Dispose(); } PlayerVs.DisposeStatic(); base.Dispose(disposing); }
internal TeamplayOverlay(PlayerVs playerVs, SpriteManager spriteManager) { player = playerVs; this.spriteManager = spriteManager; team1header = new pText("Blue Team", 16, new Vector2(0, 100), 1, true, Color.White); team1header.TextBold = true; team1header.TextShadow = true; spriteManager.Add(team1header); team2header = new pText("Red Team", 16, new Vector2(GameBase.WindowManager.WidthScaled, 100), 1, true, Color.White); team2header.TextShadow = true; team2header.TextBold = true; team2header.Origin = Origins.TopRight; spriteManager.Add(team2header); accuracyMatch = PlayerVs.Match.matchScoringType == MatchScoringTypes.Accuracy; team1display = new ScoreDisplay(spriteManager, new Vector2(0, 120), false, 0.7f, !accuracyMatch, accuracyMatch); team2display = new ScoreDisplay(spriteManager, new Vector2(0, 120), true, 0.7f, !accuracyMatch, accuracyMatch); metre = new pSprite(TextureManager.Load(@"lobby-crown", SkinSource.Osu), Origins.Centre, new Vector2(GameBase.WindowManager.WidthScaled / 2, 90), 0.99f, true, Color.Yellow); metre.Scale = 1.2f; spriteManager.Add(metre); metre2 = new pSprite(TextureManager.Load(@"lobby-crown", SkinSource.Osu), Origins.Centre, new Vector2(GameBase.WindowManager.WidthScaled / 2, 90), 1, true, Color.Yellow); metre2.Additive = true; Transformation t = new Transformation(TransformationType.Scale, 1.2f, 1.3f, GameBase.Time, GameBase.Time + 1000, EasingTypes.In); t.Loop = true; t.LoopDelay = 1000; metre2.Transformations.Add(t); t = new Transformation(TransformationType.Scale, 1.3f, 1.2f, GameBase.Time + 1000, GameBase.Time + 2000, EasingTypes.Out); t.Loop = true; t.LoopDelay = 1000; metre2.Transformations.Add(t); metre2.Scale = 1.2f; spriteManager.Add(metre2); }
internal void UpdateScores() { if (!accuracyMatch) { bool comboHack = PlayerVs.Match.matchScoringType == MatchScoringTypes.Combo; int team1 = comboHack ? getTeamCombo(SlotTeams.Blue) : getTeamScore(SlotTeams.Blue); int team2 = comboHack ? getTeamCombo(SlotTeams.Red) : getTeamScore(SlotTeams.Red); team1display.Update(team1); team2display.Update(team2); //Accuracy is shown too... team1display.Update(getTeamAccuracy(SlotTeams.Blue) * 100); team2display.Update(getTeamAccuracy(SlotTeams.Red) * 100); //team1score.Text = team1.ToString("00000000"); //team2score.Text = team2.ToString("00000000"); bool teamBlueWinner = (team1 > team2 && !PlayerVs.TeamFailed(SlotTeams.Blue)) || PlayerVs.TeamFailed(SlotTeams.Red); float offset = teamBlueWinner ? -Math.Min(300, ((float)team1 / Math.Max(1, team2) - 1) * 100) : Math.Min(300, ((float)team2 / Math.Max(1, team1) - 1) * 100); float x = GameBase.WindowManager.WidthScaled / 2 + offset; metre.MoveTo(new Vector2(x, 90), 1000, EasingTypes.Out); metre2.MoveTo(new Vector2(x, 90), 1000, EasingTypes.Out); } else { float team1 = getTeamAccuracy(SlotTeams.Blue); float team2 = getTeamAccuracy(SlotTeams.Red); team1display.Update(team1 * 100); team2display.Update(team2 * 100); float offset = team1 > team2 ? -Math.Min(300, ((float)team1 / Math.Max(1, team2) - 1) * 300) : Math.Min(300, ((float)team2 / Math.Max(1, team1) - 1) * 300); float x = GameBase.WindowManager.WidthScaled / 2 + offset; metre.MoveTo(new Vector2(x, 90), 1000, EasingTypes.Out); metre2.MoveTo(new Vector2(x, 90), 1000, EasingTypes.Out); } }
protected override void Dispose(bool disposing) { PlayerVs.DisposeStatic(); base.Dispose(disposing); }
public override void Initialize() { base.Initialize(); Player.ScoreBoard.spriteManager.WidescreenAutoOffset = true; Player.ScoreBoard.spriteManager.Alpha = 1; lock (StreamingManager.LockReplayScore) { InputManager.ReplayMode = false; InputManager.ReplayStreaming = false; InputManager.ReplayStartTime = 0; } pText text = null; SlotTeams winner = PlayerVs.TeamOverlay.winner; if (PlayerVs.TeamFailed(SlotTeams.Blue)) { text = new pText("Blue team failed!", 20, new Vector2(GameBase.WindowManager.WidthScaled / 2, 85), Vector2.Zero, 1, true, Color.Blue, false); } else if (PlayerVs.TeamFailed(SlotTeams.Red)) { text = new pText("Red team failed!", 20, new Vector2(GameBase.WindowManager.WidthScaled / 2, 85), Vector2.Zero, 1, true, Color.Red, false); } else { switch (winner) { case SlotTeams.Blue: text = new pText("Blue team wins!", 20, new Vector2(GameBase.WindowManager.WidthScaled / 2, 85), Vector2.Zero, 1, true, Color.Blue, false); break; case SlotTeams.Red: text = new pText("Red team wins!", 20, new Vector2(GameBase.WindowManager.WidthScaled / 2, 85), Vector2.Zero, 1, true, Color.Red, false); break; } } text.TextBold = true; text.Origin = Origins.Centre; spriteManagerWideScrolling.Add(text); int tabHeight = 113; //add team1Tabs = new pTabCollection(spriteManagerWideScrolling, 3, new Vector2(56, tabHeight), 0.8f, true, Color.BlueViolet, 40); team2Tabs = new pTabCollection(spriteManagerWideScrolling, 3, new Vector2(GameBase.WindowManager.WidthScaled - 224, tabHeight), 0.8f, true, Color.BlueViolet, 40); team1Tabs.Add("Total", 0); team2Tabs.Add("Total", 0); team1Tabs.SetSelected(0); team2Tabs.SetSelected(0); team1Tabs.OnTabChanged += delegate(object sender, EventArgs e) { loadScores(SlotTeams.Blue, (int)sender, false); }; team2Tabs.OnTabChanged += delegate(object sender, EventArgs e) { loadScores(SlotTeams.Red, (int)sender, false); }; int count = PlayerVs.LastScoreEntries.Count; for (int i = 0; i < count; i++) { ScoreboardEntry entry = PlayerVs.LastScoreEntries[i]; if (entry != null) { (entry.Team == SlotTeams.Blue ? team1Tabs : team2Tabs).Add(entry.name, i + 1); } } pSprite scoreBackground1 = new pSprite(TextureManager.Load(@"ranking-panel"), Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(1, SkinManager.UseNewLayout ? 107 : 97), 0.79f, true, Color.White); scoreBackground1.Alpha = 1.0f; scoreBackground1.VectorScale = new Vector2(0.715f, 0.77f); pSprite scoreBackground2 = new pSprite(TextureManager.Load(@"ranking-panel"), Fields.TopLeft, Origins.TopLeft, Clocks.Game, new Vector2(GameBase.WindowManager.WidthScaled - 279, SkinManager.UseNewLayout ? 107 : 97), 0.79f, true, Color.White); scoreBackground2.Alpha = 1.0f; scoreBackground2.VectorScale = new Vector2(0.715f, 0.77f); spriteManagerWideScrolling.Add(scoreBackground1); spriteManagerWideScrolling.Add(scoreBackground2); initializeStatics(); //cache scores for more efficiency team1Score = getTeamScore(SlotTeams.Blue); team2Score = getTeamScore(SlotTeams.Red); loadScores(SlotTeams.Blue, 0, true); loadScores(SlotTeams.Red, 0, true); playMode = Player.Mode; }
public MultiRulesetTeamVs(PlayerVs player) : base(player) { }
internal MultiRuleset(PlayerVs player) { this.player = player; }
public static void IncomingMatch(bMatch match) { if (match.inProgress) { for (int i = 0; i < 8; i++) { if (Match.slotId[i] >= 0 && match.slotId[i] < 0) { PlayerVs.MatchPlayerLeft(i); } } } else { for (int i = 0; i < 8; i++) { bool newPlayer = true; for (int j = 0; j < 8; j++) { if (match.slotId[i] == Match.slotId[j]) { newPlayer = false; break; } } if (newPlayer) { User u = BanchoClient.GetUserById(match.slotId[i]); if (u != null) { GameBase.ShowMessage(u.Name + " joined the game.", Color.YellowGreen, 3000); AudioEngine.PlaySample("match-join"); } } } for (int i = 0; i < 8; i++) { bool leftPlayer = true; for (int j = 0; j < 8; j++) { if (match.slotId[j] == Match.slotId[i]) { leftPlayer = false; break; } } if (leftPlayer) { User u = BanchoClient.GetUserById(Match.slotId[i]); if (u != null) { GameBase.ShowMessage(u.Name + " left the game.", Color.OrangeRed, 3000); AudioEngine.PlaySample("match-leave"); } } } } if (match.beatmapChecksum != Match.beatmapChecksum) { SongChangePending = true; } if (match.activeMods != Match.activeMods) { ModChangePending = true; } Match = match; UpdatePending = true; }
private static void Run() { Connect(); while (true) { if (GameBase.Time - lastPingTime > pingTimeout) { Connect(); Thread.Sleep(20); continue; } if (client != null && client.Connected) { try { //Send any waiting requests. if (Requests.Count > 0 && stream.CanWrite && Authenticated) { Requests.Dequeue().Send(stream); sendSequence = (sendSequence + 1) % ushort.MaxValue; } while (Connected && stream != null && stream.DataAvailable) { lastPingTime = GameBase.Time; readBytes += stream.Read(readByteArray, readBytes, readByteArray.Length - readBytes); //Read header data if (readBytes == readByteArray.Length && readingHeader) { readType = (RequestType)BitConverter.ToUInt16(readByteArray, 0); compression = readByteArray[2] == 1; uint length = BitConverter.ToUInt32(readByteArray, 3); Console.WriteLine("R" + length + ": " + readType); ResetReadArray(false); readByteArray = new byte[length]; } //Read payload data if (readBytes != readByteArray.Length) { continue; } switch (readType) { /* CONNECTION MANAGEMENT */ case RequestType.Bancho_LoginReply: GameBase.User.Id = new bInt(readStream).number; switch (GameBase.User.Id) { case -1: GameBase.ShowMessage( "Bancho authentication failed. Please check your username/password by clicking the user pane on the main menu.", Color.Red, 4400); Authenticated = false; Disconnect(true); if (LoginResult != null) { LoginResult(false, null); } break; case -2: GameBase.ShowMessage( "Bancho connection failed: Version mismatch", Color.Red, 4400); GameBase.CheckForUpdates(); Authenticated = false; Disconnect(true); return; default: Console.WriteLine("login success userid:" + GameBase.User.Id); ChatEngine.BanchoConnected(); GameBase.ShowMessage("Welcome to osu!Bancho.", Color.SlateBlue, 4400); Status = bStatus.Idle; UpdateStatus(); Authenticated = true; if (OnConnect != null) { OnConnect(); } if (LoginResult != null) { LoginResult(true, null); } break; } break; case RequestType.Bancho_Ping: SendRequest(RequestType.Osu_Pong, null); break; case RequestType.Bancho_VersionUpdate: GameBase.CheckForUpdates(); break; /* CHAT and MESSAGING */ case RequestType.Bancho_SendIrcMessage: ChatEngine.HandleMessage(new bMessage(readStream), false); break; case RequestType.Bancho_HandleIrcChangeUsername: string message = new bString(readStream).text; string oldname = message.Substring(0, message.IndexOf(">>>>")); string newname = message.Remove(0, message.IndexOf(">>>>") + 4); ChatEngine.HandleChangeUsername(oldname, newname); break; case RequestType.Bancho_HandleIrcQuit: ChatEngine.HandleQuit("#osu", new bString(readStream).text); break; case RequestType.Bancho_HandleIrcJoin: ChatEngine.HandleJoin("#osu", new bString(readStream).text); break; case RequestType.Bancho_HandleOsuQuit: ChatEngine.HandleUserQuit(new bInt(readStream).number); break; /* STATISTICS */ case RequestType.Bancho_HandleOsuUpdate: if (readStream == null) { break; } bUserStats stats = new bUserStats(readStream); ChatEngine.HandleUserUpdate(stats); if (stats.userId == GameBase.User.Id) { if (stats.username != null) { ConfigManager.sUsername = stats.username; } GameBase.User.bancho_StatsReceived(null, stats); } break; /* SPECTATING */ case RequestType.Bancho_FellowSpectatorJoined: lock (StreamingManager.Spectators) { User u = GetUserById(new bInt(readStream).number); StreamingManager.HasSpectators = true; if (!StreamingManager.FellowSpectators.Contains(u)) { StreamingManager.FellowSpectators.Add(u); } StreamingManager.FellowSpectators.Sort(); } break; case RequestType.Bancho_FellowSpectatorLeft: lock (StreamingManager.Spectators) { User u = GetUserById(new bInt(readStream).number); StreamingManager.FellowSpectators.Remove(u); if (StreamingManager.Spectators.Count == 0) { StreamingManager.HasSpectators = false; } } break; case RequestType.Bancho_SpectatorJoined: //Start sending spectator frames. lock (StreamingManager.Spectators) { User u = GetUserById(new bInt(readStream).number); u.CantSpectate = false; if (!StreamingManager.Spectators.Contains(u)) { StreamingManager.Spectators.Add(u); } StreamingManager.HasSpectators = true; StreamingManager.Spectators.Sort(); } break; case RequestType.Bancho_SpectatorCantSpectate: GetUserById(new bInt(readStream).number).CantSpectate = true; break; case RequestType.Bancho_SpectatorLeft: //Stop sending spectator frames. lock (StreamingManager.Spectators) { User u = GetUserById(new bInt(readStream).number); u.CantSpectate = false; StreamingManager.Spectators.Remove(u); if (StreamingManager.Spectators.Count == 0) { StreamingManager.HasSpectators = false; } } break; case RequestType.Bancho_SpectateFrames: StreamingManager.HandleFrames(new bReplayFrameBundle(readStream)); //Received some spectator frames. break; case RequestType.Bancho_GetAttention: ChatEngine.PendingShow = true; break; case RequestType.Bancho_Announce: GameBase.ShowMessage(new bString(readStream).text.Replace("\\n", "\n"), Color.DarkMagenta, 10000); break; case RequestType.Bancho_MatchUpdate: case RequestType.Bancho_MatchNew: Lobby.IncomingMatch(new bMatch(readStream)); break; case RequestType.Bancho_MatchStart: MatchSetup.MatchStart(new bMatch(readStream)); break; case RequestType.Bancho_MatchDisband: Lobby.DisbandedMatch(new bInt(readStream).number); break; case RequestType.Bancho_LobbyJoin: case RequestType.Bancho_LobbyPart: User f = GetUserById(new bInt(readStream).number); if (f != null) { f.InLobby = readType == RequestType.Bancho_LobbyJoin; } Lobby.LobbyUpdatePending = true; break; case RequestType.Bancho_MatchJoinFail: Lobby.OnJoinFail(); break; case RequestType.Bancho_MatchJoinSuccess: MatchSetup.Match = new bMatch(readStream); Lobby.OnJoinSuccess(); break; case RequestType.Bancho_MatchScoreUpdate: if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play) { PlayerVs.MatchScoreUpdate(new bScoreFrame(readStream)); } break; case RequestType.Bancho_MatchTransferHost: MatchSetup.MatchTransferHost(); break; case RequestType.Bancho_MatchAllPlayersLoaded: if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play) { PlayerVs.AllPlayersLoaded = true; } break; case RequestType.Bancho_MatchPlayerFailed: if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play) { PlayerVs.MatchPlayerFailed(new bInt(readStream).number); } break; case RequestType.Bancho_MatchComplete: if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play) { PlayerVs.MatchComplete(); } break; case RequestType.Bancho_MatchSkip: if (GameBase.Mode == Modes.Play && Lobby.Status == LobbyStatus.Play) { Player.QueueSkip(); } break; case RequestType.Bancho_Unauthorised: break; case RequestType.Bancho_ChannelJoinSuccess: string match = new bString(readStream).text; Channel channel = ChatEngine.channels.Find(ch => ch.name == match); if (channel != null) { channel.HandleJoinSuccess(); } break; case RequestType.Bancho_ChannelAvailable: ChatEngine.AddChannel(new bString(readStream).text, false); break; case RequestType.Bancho_ChannelAvailableAutojoin: ChatEngine.AddChannel(new bString(readStream).text, true); break; case RequestType.Bancho_ChannelRevoked: ChatEngine.RemoveChannel(new bString(readStream).text); break; case RequestType.Bancho_BeatmapInfoReply: BeatmapManager.IncomingBeatmapInfoReply(new bBeatmapInfoReply(readStream)); break; } ResetReadArray(true); } } catch (Exception e) { if (firstError) { firstError = false; if (Connected) { StringBuilder report = new StringBuilder(); report.AppendLine("----------------------BANCHO--------------------------------"); report.AppendLine("Bancho error from " + ConfigManager.sUsername + " at " + DateTime.UtcNow.ToString(GameBase.nfi)); report.AppendLine(); report.AppendLine("Mode: " + GameBase.Mode); report.AppendLine(); report.Append(e + "\n"); report.AppendLine(); report.AppendLine("------------------------------------------------------------"); try { new RequestGeneric(RequestType.Osu_ErrorReport, new bString(report.ToString())).Send (stream); } catch (Exception) { } } } FailConnection("An error occurred somewhere in bancho comms. Reconnecting!", errorRetry); errorRetry = (int)(errorRetry * 1.5); } } if (Connected) { CheckAfk(); } Thread.Sleep(20); } }
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; } }