private void ClearOldData() { //Wipe score data beatmapObjectSpawnController.SetField("_halfJumpDurationInBeats", 4f); //In the disassembly, it looks like this field is usually initialized to 1f, however in practice, when the game starts, it is always 4f. Blame Beat Games. beatmapObjectExecutionRatingsRecorder.beatmapObjectExecutionRatings.Clear(); beatmapObjectExecutionRatingsRecorder.GetField <HashSet <int> >("_hitObstacles").Clear(); beatmapObjectExecutionRatingsRecorder.GetField <List <ObstacleController> >("_prevIntersectingObstacles").Clear(); multiplierValuesRecorder.GetField <List <MultiplierValuesRecorder.MultiplierValue> >("_multiplierValues").Clear(); scoreController.SetField("_baseRawScore", 0); scoreController.SetField("_prevFrameRawScore", 0); scoreController.SetField("_multiplier", 1); scoreController.SetField("_multiplierIncreaseProgress", 0); scoreController.SetField("_multiplierIncreaseMaxProgress", 2); scoreController.SetField("_combo", 0); scoreController.SetField("_maxCombo", 0); scoreController.SetField("_feverIsActive", false); scoreController.SetField("_feverStartTime", 0f); scoreController.SetField("_feverCombo", 0); scoreController.SetField("_playerHeadWasInObstacle", false); scoreController.SetField("_immediateMaxPossibleRawScore", 0); scoreController.SetField("_cutOrMissedNotes", 0); scoreController.GetField <List <CutScoreBuffer> >("_cutScoreBuffers").Clear(); /*saberActivityCounter.GetField<MovementHistoryRecorder>("_saberMovementHistoryRecorder").SetField("_accum", 0); * saberActivityCounter.GetField<MovementHistoryRecorder>("_handMovementHistoryRecorder").SetField("_accum", 0);*/ saberActivityCounter.SetField("_saberMovementHistoryRecorder", new MovementHistoryRecorder(saberActivityCounter.GetField <float>("_averageWindowDuration"), saberActivityCounter.GetField <float>("_valuesPerSecond"), saberActivityCounter.GetField <float>("_increaseSpeed"), saberActivityCounter.GetField <float>("_deceraseSpeed"))); saberActivityCounter.SetField("_handMovementHistoryRecorder", new MovementHistoryRecorder(saberActivityCounter.GetField <float>("_averageWindowDuration"), saberActivityCounter.GetField <float>("_valuesPerSecond"), saberActivityCounter.GetField <float>("_increaseSpeed"), saberActivityCounter.GetField <float>("_deceraseSpeed"))); saberActivityCounter.SetField("_leftSaberMovementDistance", 0f); saberActivityCounter.SetField("_rightSaberMovementDistance", 0f); saberActivityCounter.SetField("_leftHandMovementDistance", 0f); saberActivityCounter.SetField("_rightHandMovementDistance", 0f); saberActivityCounter.SetField("_hasPrevPos", false); /*saberActivityCounter.saberMovementAveragingValueRecorder.GetField<Queue<AveragingValueRecorder.AverageValueData>>("_averageWindowValues").Clear(); * saberActivityCounter.saberMovementAveragingValueRecorder.GetField<Queue<float>>("_historyValues").Clear(); * saberActivityCounter.saberMovementAveragingValueRecorder.SetField("_time", 0); * saberActivityCounter.saberMovementAveragingValueRecorder.SetField("_historyTime", 0); * saberActivityCounter.saberMovementAveragingValueRecorder.SetField("_averageValue", 0); * saberActivityCounter.saberMovementAveragingValueRecorder.SetField("_averageWindowValuesDuration", 0); * saberActivityCounter.saberMovementAveragingValueRecorder.SetField("_lastValue", 0); * * saberActivityCounter.handMovementAveragingValueRecorder.GetField<Queue<AveragingValueRecorder.AverageValueData>>("_averageWindowValues").Clear(); * saberActivityCounter.handMovementAveragingValueRecorder.GetField<Queue<float>>("_historyValues").Clear(); * saberActivityCounter.handMovementAveragingValueRecorder.SetField("_time", 0); * saberActivityCounter.handMovementAveragingValueRecorder.SetField("_historyTime", 0); * saberActivityCounter.handMovementAveragingValueRecorder.SetField("_averageValue", 0); * saberActivityCounter.handMovementAveragingValueRecorder.SetField("_averageWindowValuesDuration", 0); * saberActivityCounter.handMovementAveragingValueRecorder.SetField("_lastValue", 0);*/ noteCutSoundEffectManager.SetField("_prevNoteATime", -1f); noteCutSoundEffectManager.SetField("_prevNoteBTime", -1f); //Wipe notes var noteAPool = beatmapObjectSpawnController.GetField <NoteController.Pool>("_noteAPool"); var noteBPool = beatmapObjectSpawnController.GetField <NoteController.Pool>("_noteBPool"); var bombNotePool = beatmapObjectSpawnController.GetField <NoteController.Pool>("_bombNotePool"); var obstaclePool = beatmapObjectSpawnController.GetField <ObstacleController.Pool>("_obstaclePool"); noteAPool.activeItems.ToList().ForEach(x => beatmapObjectSpawnController.Despawn(x)); noteBPool.activeItems.ToList().ForEach(x => beatmapObjectSpawnController.Despawn(x)); bombNotePool.activeItems.ToList().ForEach(x => beatmapObjectSpawnController.Despawn(x)); obstaclePool.activeItems.ToList().ForEach(x => beatmapObjectSpawnController.Despawn(x)); }