/// <summary> /// Handle splitting up and labelling the hitObjects into different player's scopes. /// </summary> internal override void InitializeHitObjectPostProcessing() { bMatch match = PlayerVs.Match; usedPlayerSlots = new List <int>(); int playerCount = 0; for (int i = 0; i < bMatch.MAX_PLAYERS; i++) { if ((match.slotStatus[i] & SlotStatus.Playing) > 0 && match.slotTeam[i] == match.slotTeam[player.localPlayerMatchId]) { usedPlayerSlots.Add(i); playerCount++; } } HitObjectManager hitObjectManager = player.hitObjectManager; int currentPlayer = -1; localUserActiveTime = new List <EventBreak>(); EventBreak currentBreak = null; bool firstCombo = true; bool customTagColor; if (customTagColor = MatchSetup.TagComboColour != Color.TransparentWhite) { GameBase.Scheduler.Add(delegate { SkinManager.SliderRenderer.Tag = MatchSetup.TagComboColour; }); } for (int i = 0; i < hitObjectManager.hitObjectsCount; i++) { HitObject h = hitObjectManager.hitObjects[i]; //HitObject hLast = i > 0 ? hitObjectManager.hitObjects[i-1] : hitObjectManager.hitObjects[i]; bool firstInCombo = h.NewCombo || firstCombo; bool spinner = h.IsType(HitObjectType.Spinner) || h is HitCircleFruitsSpin; if (firstInCombo) { if (!spinner) { currentPlayer = (currentPlayer + 1) % playerCount; firstCombo = false; } if (spinner || usedPlayerSlots[currentPlayer] == player.localPlayerMatchId) { //The local player starts playing at this point. int st = (i > 0 ? Math.Max(h.StartTime - hitObjectManager.HitWindow50, hitObjectManager.hitObjects[i - 1].EndTime + 1) : h.StartTime - hitObjectManager.HitWindow50); int ed = h.EndTime; currentBreak = new EventBreak(st, ed); localUserActiveTime.Add(currentBreak); } else { //Another play has taken over. currentBreak = null; } } if (spinner || usedPlayerSlots[currentPlayer] == player.localPlayerMatchId) { if (currentBreak != null) { //The local player finishes playing at this point (or further). currentBreak.SetEndTime(h.EndTime + hitObjectManager.HitWindow50); } if (customTagColor) { h.SetColour(MatchSetup.TagComboColour); } } else { h.IsScorable = false; h.SetColour(Color.Gray); } h.TagNumeric = spinner ? -2 : usedPlayerSlots[currentPlayer]; } InitializeWarningArrows(); }