private void OnModeSelection(FreePlayMode mode) { if (mode == FreePlayMode.Solo) { Logger.log.Debug("Selected solo free play mode"); _freePlayFlowCoordinator = FindObjectOfType <SoloFreePlayFlowCoordinator>(); (_freePlayFlowCoordinator as SoloFreePlayFlowCoordinator).didFinishEvent += OnFreePlayFlowCoordinatorFinished; PrepareLevelPackSelectedEvent(); if (!SongBrowserTweaks.ModLoaded) { UnityCoroutineHelper.StartDelayedAction(SelectSavedLevelPack); } else if (!SongBrowserTweaks.Initialized) { StartCoroutine(GetSongBrowserButtons()); } } else if (mode == FreePlayMode.Party) { Logger.log.Debug("Selected party free play mode"); _freePlayFlowCoordinator = FindObjectOfType <PartyFreePlayFlowCoordinator>(); (_freePlayFlowCoordinator as PartyFreePlayFlowCoordinator).didFinishEvent += OnFreePlayFlowCoordinatorFinished; PrepareLevelPackSelectedEvent(); if (!SongBrowserTweaks.ModLoaded) { UnityCoroutineHelper.StartDelayedAction(SelectSavedLevelPack); } else if (!SongBrowserTweaks.Initialized) { StartCoroutine(GetSongBrowserButtons()); } } else if (mode == FreePlayMode.Campaign) { Logger.log.Debug("Selected campaign play mode"); _freePlayFlowCoordinator = FindObjectOfType <CampaignFlowCoordinator>(); (_freePlayFlowCoordinator as CampaignFlowCoordinator).didFinishEvent += OnFreePlayFlowCoordinatorFinished; } // UIState in SongBrowser is always reset to Main, so we need to disable the filter button SongBrowserTweaks.DisableOtherFiltersButton(); }
private void LevelPackSelected(LevelFilteringNavigationController navController, IAnnotatedBeatmapLevelCollection levelPack, GameObject noDataInfoPrefab, BeatmapCharacteristicSO preferredCharacteristic) { // ignore the first select event that's fired immediately after the user select the free play mode // this is done so we can select the saved last pack later // when the saved pack is selected, it will then call this function again for sorting/storing if (_isSelectingInitialLevelPack) { _lastPack = levelPack; _isSelectingInitialLevelPack = false; if (levelPack is IBeatmapLevelPack beatmapLevelPack) { Logger.log.Debug($"Storing '{beatmapLevelPack.packName}' (id = '{beatmapLevelPack.packID}') level pack as initial pack"); } else { Logger.log.Debug($"Storing '{levelPack.collectionName}' level collection as initial pack"); } return; } // in ConfirmDeleteButtonClicked, the call to SongCore.Loader.Instance.DeleteSong will reload the level packs // which causes the custom level pack to be re-selected. but, if filters are applied or level pack is sorted, // we want to reshow our own filtered/sorted level pack and not reset our UI, so we don't have to handle this event // this code is kinda smelly tbh, but can't do anything about it unless there are changes to SongCore else if (_isDeletingSongInModOwnedLevelPack) { return; } // when SongBrowser is enabled, we only need to store the pack for the WordPredictionEngine when using the search feature else if (SongBrowserTweaks.Initialized) { _lastPack = levelPack; SongBrowserTweaks.DisableOtherFiltersButton(); return; } if (levelPack.collectionName != FilteredLevelsLevelPack.CollectionName) { _lastPack = levelPack; // store level pack to PluginConfig var tabBarVC = LevelFilteringNavigationController.GetPrivateField <TabBarViewController>("_tabBarViewController"); var tabBarItems = tabBarVC.GetPrivateField <TabBarViewController.TabBarItem[]>("_items"); string lastLevelPackString = tabBarItems[tabBarVC.selectedCellNumber].title + PluginConfig.LastLevelPackIDSeparator; if (levelPack is IBeatmapLevelPack beatmapLevelPack) { lastLevelPackString += beatmapLevelPack.packID; Logger.log.Debug($"Storing '{beatmapLevelPack.packName}' (id = '{beatmapLevelPack.packID}') level pack as last pack"); } else { lastLevelPackString += levelPack.collectionName; Logger.log.Debug($"Storing '{levelPack.collectionName}' level collection as last pack"); } PluginConfig.LastLevelPackID = lastLevelPackString; // reapply sort mode if (!SongSortModule.IsDefaultSort) { _sortedLevelsLevelPack.SetupFromLevelCollection(levelPack); // since the level selection navigation controller shows a level pack using the same event that calls this function // and it technically isn't a guarantee that this function will run after it is set, // delay setting our level pack UnityCoroutineHelper.StartDelayedAction(() => LevelSelectionNavigationController.SetData( _sortedLevelsLevelPack, true, LevelSelectionNavigationController.GetPrivateField <bool>("_showPlayerStatsInDetailView"), LevelSelectionNavigationController.GetPrivateField <bool>("_showPracticeButtonInDetailView"))); } } // SongBrowser can now apply filters to OST levels and switch between different level packs // so our old behaviour of cancelling the filters is no longer needed // that being said, without SongBrowser, we are still going to cancel filters upon switching level packs // because i'd rather the player have to go into the FilterViewController, // so that it can check if all the beatmap details have been loaded if (FilterList.AnyApplied) { Logger.log.Debug("Another level pack has been selected, unapplying filters"); } UnapplyFilters(); if (_uiAdditions != null) { UnityCoroutineHelper.StartDelayedAction(_uiAdditions.RefreshPageButtons); } }