static bool Prefix(BeatmapObjectManager __instance, NoteController noteController) { try { if (Config.Instance.SpectatorMode && SpectatingController.Instance != null && SpectatingController.active && Client.Instance != null && Client.Instance.connected && SpectatingController.Instance.spectatedPlayer != null && SpectatingController.Instance.spectatedPlayer.playerInfo != null) { ulong playerId = SpectatingController.Instance.spectatedPlayer.playerInfo.playerId; if (SpectatingController.Instance.playerUpdates.ContainsKey(playerId) && SpectatingController.Instance.playerUpdates[playerId].hits.Count > 0) { if (SpectatingController.Instance.playerUpdates[playerId].hits.TryGetValue(noteController.noteData.id, out HitData hit)) { if (hit.noteWasCut) { #if DEBUG Plugin.log.Warn("We missed the note, but the player cut it"); #endif __instance.Despawn(noteController); return(false); } else { return(true); } } } return(true); } else { return(true); } } catch (Exception e) { Plugin.log.Error("Exception in Harmony patch BeatmapObjectSpawnController.NoteWasMissed: " + e); return(true); } }
public static void OnSongTimeChanged(float newSongTime, float aheadTime) { foreach (var callbackData in CallbackList) { for (var i = 0; i < _beatmapData.beatmapLinesData.Length; i++) { callbackData.nextObjectIndexInLine[i] = 0; while (callbackData.nextObjectIndexInLine[i] < _beatmapData.beatmapLinesData[i].beatmapObjectsData.Length) { var beatmapObjectData = _beatmapData.beatmapLinesData[i].beatmapObjectsData[callbackData.nextObjectIndexInLine[i]]; if (beatmapObjectData.time - aheadTime >= newSongTime) { break; } callbackData.nextObjectIndexInLine[i]++; } } } var newNextEventIndex = 0; while (newNextEventIndex < _beatmapData.beatmapEventData.Length) { var beatmapEventData = _beatmapData.beatmapEventData[newNextEventIndex]; if (beatmapEventData.time >= newSongTime) { break; } newNextEventIndex++; } _beatmapObjectCallbackController.SetPrivateField("_nextEventIndex", newNextEventIndex); var notesA = _noteAPool.activeItems.ToList(); foreach (var noteA in notesA) { _beatmapObjectManager.Despawn(noteA); } var notesB = _noteBPool.activeItems.ToList(); foreach (var noteB in notesB) { _beatmapObjectManager.Despawn(noteB); } var bombs = _bombNotePool.activeItems.ToList(); foreach (var bomb in bombs) { _beatmapObjectManager.Despawn(bomb); } var obstacles = _obstaclePool.activeItems.ToList(); foreach (var obstacle in obstacles) { _beatmapObjectManager.Despawn(obstacle); } InGameOnlineController.Instance.audioTimeSync.SetPrivateField("_prevAudioSamplePos", -1); InGameOnlineController.Instance.audioTimeSync.GetPrivateField <FloatSO>("_songTime").value = newSongTime; _noteCutSoundEffectManager.SetPrivateField("_prevNoteATime", -1); _noteCutSoundEffectManager.SetPrivateField("_prevNoteBTime", -1); }
static bool Prefix(BeatmapObjectManager __instance, NoteController noteController, NoteCutInfo noteCutInfo) { try { if (Config.Instance.SpectatorMode && SpectatingController.Instance != null && SpectatingController.active && Client.Instance != null && Client.Instance.connected && SpectatingController.Instance.spectatedPlayer != null && SpectatingController.Instance.spectatedPlayer.playerInfo != null) { ulong playerId = SpectatingController.Instance.spectatedPlayer.playerInfo.playerId; if (SpectatingController.Instance.playerUpdates.ContainsKey(playerId) && SpectatingController.Instance.playerUpdates[playerId].hits.Count > 0) { if (SpectatingController.Instance.playerUpdates[playerId].hits.TryGetValue(noteController.noteData.id, out HitData hit)) { bool allIsOKExpected = hit.noteWasCut && hit.speedOK && hit.saberTypeOK && hit.directionOK && !hit.wasCutTooSoon; if (hit.noteWasCut) { if (noteCutInfo.allIsOK == allIsOKExpected) { return(true); } else if (!noteCutInfo.allIsOK && allIsOKExpected) { #if DEBUG Plugin.log.Warn("Oopsie, we missed it, let's forget about that"); #endif __instance.Despawn(noteController); return(false); } else if (noteCutInfo.allIsOK && !allIsOKExpected) { #if DEBUG Plugin.log.Warn("We cut the note, but the player cut it wrong"); #endif noteCutInfo.SetProperty("wasCutTooSoon", hit.wasCutTooSoon); noteCutInfo.SetProperty("directionOK", hit.directionOK); noteCutInfo.SetProperty("saberTypeOK", hit.saberTypeOK); noteCutInfo.SetProperty("speedOK", hit.speedOK); return(true); } } else { #if DEBUG Plugin.log.Warn("We cut the note, but the player missed it"); #endif __instance.HandleNoteWasMissed(noteController); return(false); } } } return(true); } else { return(true); } }catch (Exception e) { Plugin.log.Error("Exception in Harmony patch BeatmapObjectSpawnController.NoteWasCut: " + e); return(true); } }