コード例 #1
0
ファイル: Loader.cs プロジェクト: brian91292/SongCore
        internal void AttemptReselectCurrentLevelPack(LevelFilteringNavigationController controller)
        {
            var tabBarView = controller.GetField <TabBarViewController>("_tabBarViewController");

            if (tabBarView?.selectedCellNumber != 3)
            {
                return;
            }
            var tabBarDatas = controller.GetField <object[]>("_tabBarDatas");

            if (tabBarDatas == null)
            {
                return;
            }
            int selectedPackNum             = tabBarDatas[tabBarView.selectedCellNumber].GetField <int>("selectedItem");
            var currentLevelPacksCollection = tabBarDatas[tabBarView.selectedCellNumber].GetField <IAnnotatedBeatmapLevelCollection[]>("annotatedBeatmapLevelCollections");

            if (currentLevelPacksCollection == null)
            {
                return;
            }
            int packCount = currentLevelPacksCollection.Length;

            if (!(selectedPackNum < packCount))
            {
                return;
            }
            controller.SelectBeatmapLevelPackOrPlayList(currentLevelPacksCollection[selectedPackNum] as IBeatmapLevelPack, null);
        }
コード例 #2
0
        /// <summary>
        /// Constructor.  Acquire all necessary BeatSaberUi elements.
        /// </summary>
        /// <param name="flowCoordinator"></param>
        public BeatSaberUIController(LevelSelectionFlowCoordinator flowCoordinator)
        {
            Logger.Debug("Collecting all BeatSaberUI Elements...");

            LevelSelectionFlowCoordinator = flowCoordinator;

            // gather flow coordinator elements
            LevelSelectionNavigationController = LevelSelectionFlowCoordinator.GetField <LevelSelectionNavigationController, LevelSelectionFlowCoordinator>("levelSelectionNavigationController");
            Logger.Debug("Acquired LevelSelectionNavigationController [{0}]", LevelSelectionNavigationController.GetInstanceID());

            LevelFilteringNavigationController = LevelSelectionNavigationController.GetField <LevelFilteringNavigationController, LevelSelectionNavigationController>("_levelFilteringNavigationController");
            Logger.Debug("Acquired LevelFilteringNavigationController [{0}]", LevelFilteringNavigationController.GetInstanceID());

            LevelCollectionNavigationController = LevelSelectionNavigationController.GetField <LevelCollectionNavigationController, LevelSelectionNavigationController>("_levelCollectionNavigationController");
            Logger.Debug("Acquired LevelCollectionNavigationController [{0}]", LevelCollectionNavigationController.GetInstanceID());

            LevelCollectionViewController = LevelCollectionNavigationController.GetField <LevelCollectionViewController, LevelCollectionNavigationController>("_levelCollectionViewController");
            Logger.Debug("Acquired LevelPackLevelsViewController [{0}]", LevelCollectionViewController.GetInstanceID());

            LevelDetailViewController = LevelCollectionNavigationController.GetField <StandardLevelDetailViewController, LevelCollectionNavigationController>("_levelDetailViewController");
            Logger.Debug("Acquired StandardLevelDetailViewController [{0}]", LevelDetailViewController.GetInstanceID());

            LevelCollectionTableView = this.LevelCollectionViewController.GetField <LevelCollectionTableView, LevelCollectionViewController>("_levelCollectionTableView");
            Logger.Debug("Acquired LevelPackLevelsTableView [{0}]", LevelCollectionTableView.GetInstanceID());

            StandardLevelDetailView = LevelDetailViewController.GetField <StandardLevelDetailView, StandardLevelDetailViewController>("_standardLevelDetailView");
            Logger.Debug("Acquired StandardLevelDetailView [{0}]", StandardLevelDetailView.GetInstanceID());

            BeatmapCharacteristicSelectionViewController = StandardLevelDetailView.GetField <BeatmapCharacteristicSegmentedControlController, StandardLevelDetailView>("_beatmapCharacteristicSegmentedControlController");
            Logger.Debug("Acquired BeatmapCharacteristicSegmentedControlController [{0}]", BeatmapCharacteristicSelectionViewController.GetInstanceID());

            LevelDifficultyViewController = StandardLevelDetailView.GetField <BeatmapDifficultySegmentedControlController, StandardLevelDetailView>("_beatmapDifficultySegmentedControlController");
            Logger.Debug("Acquired BeatmapDifficultySegmentedControlController [{0}]", LevelDifficultyViewController.GetInstanceID());

            LevelCollectionTableViewTransform = LevelCollectionTableView.transform as RectTransform;
            Logger.Debug("Acquired TableViewRectTransform from LevelPackLevelsTableView [{0}]", LevelCollectionTableViewTransform.GetInstanceID());

            AnnotatedBeatmapLevelCollectionsViewController = LevelFilteringNavigationController.GetField <AnnotatedBeatmapLevelCollectionsViewController, LevelFilteringNavigationController>("_annotatedBeatmapLevelCollectionsViewController");
            Logger.Debug("Acquired AnnotatedBeatmapLevelCollectionsViewController from LevelFilteringNavigationController [{0}]", AnnotatedBeatmapLevelCollectionsViewController.GetInstanceID());

            TableView  tableView  = LevelCollectionTableView.GetField <TableView, LevelCollectionTableView>("_tableView");
            ScrollView scrollView = tableView.GetField <ScrollView, TableView>("_scrollView");

            TableViewPageUpButton   = scrollView.GetField <Button, ScrollView>("_pageUpButton");
            TableViewPageDownButton = scrollView.GetField <Button, ScrollView>("_pageDownButton");
            Logger.Debug("Acquired Page Up and Down buttons...");

            ActionButtons = StandardLevelDetailView.GetComponentsInChildren <RectTransform>().First(x => x.name == "ActionButtons");
            Logger.Debug("Acquired ActionButtons [{0}]", ActionButtons.GetInstanceID());

            ScreenSystem = Resources.FindObjectsOfTypeAll <ScreenSystem>().Last();
            Logger.Debug("Acquired ScreenSystem [{0}]", ScreenSystem.GetInstanceID());

            SimpleDialogPromptViewControllerPrefab = Resources.FindObjectsOfTypeAll <SimpleDialogPromptViewController>().Last();
            Logger.Debug("Acquired SimpleDialogPromptViewControllerPrefab [{0}]", SimpleDialogPromptViewControllerPrefab.GetInstanceID());

            BeatmapLevelsModel = Resources.FindObjectsOfTypeAll <BeatmapLevelsModel>().Last();
            Logger.Debug("Acquired BeatmapLevelsModel [{0}]", BeatmapLevelsModel);
        }
コード例 #3
0
ファイル: ManagerMain.cs プロジェクト: Parapass/BeatSaberPlus
        ////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////

        /// <summary>
        /// Change current song view to all songs view
        /// </summary>
        /// <param name="p_FirstActivation"></param>
        /// <param name="p_AddedToHierarchy"></param>
        /// <param name="p_ScreenSystemEnabling"></param>
        private static void LevelSelectionNavigationController_didActivateEvent(bool p_FirstActivation, bool p_AddedToHierarchy, bool p_ScreenSystemEnabling)
        {
            var l_LevelSelectionNavigationController = Resources.FindObjectsOfTypeAll <LevelSelectionNavigationController>().FirstOrDefault();

            if (l_LevelSelectionNavigationController == null)
            {
                return;
            }

            l_LevelSelectionNavigationController.didActivateEvent -= LevelSelectionNavigationController_didActivateEvent;

            LevelFilteringNavigationController l_LevelFilteringNavigationController = l_LevelSelectionNavigationController.GetField <LevelFilteringNavigationController>("_levelFilteringNavigationController");

            try
            {
                if (l_LevelFilteringNavigationController != null)
                {
                    var l_Selector = l_LevelFilteringNavigationController.GetField <SelectLevelCategoryViewController>("_selectLevelCategoryViewController");
                    if (l_Selector != null && l_Selector)
                    {
                        var l_Tags = l_Selector.GetField <SelectLevelCategoryViewController.LevelCategoryInfo[]>("_allLevelCategoryInfos");
                        for (int l_I = 0; l_I < l_Tags.Length; ++l_I)
                        {
                            if (l_Tags[l_I].levelCategory != SelectLevelCategoryViewController.LevelCategory.All)
                            {
                                continue;
                            }

                            var l_SegmentControl = l_Selector.GetField <IconSegmentedControl>("_levelFilterCategoryIconSegmentedControl");
                            var l_Cells          = l_Selector != null?l_SegmentControl.GetField <List <SegmentedControlCell> >("_cells") : null as List <SegmentedControlCell>;

                            if (l_Cells != null)
                            {
                                /// Multiplayer fix
                                if (l_Cells.Count == 4)
                                {
                                    l_I = l_I - 1;
                                }

                                l_SegmentControl.SelectCellWithNumber(l_I);
                                l_Selector.LevelFilterCategoryIconSegmentedControlDidSelectCell(l_SegmentControl, l_I);
                                //l_SegmentControl.HandleCellSelectionDidChange(l_Cells.ElementAt(l_I), SelectableCell.TransitionType.Instant, null);
                                //l_SegmentControl.SelectCellWithNumber(l_I);
                            }
                            break;
                        }
                    }

                    /// Wait next frame
                    HMMainThreadDispatcher.instance.Enqueue(() =>
                    {
                        try
                        {
                            var l_LevelSearchViewController = l_LevelFilteringNavigationController.GetField <LevelSearchViewController>("_levelSearchViewController");
                            if (l_LevelSearchViewController != null &&
                                l_LevelSearchViewController &&
                                l_LevelSearchViewController.isInViewControllerHierarchy &&
                                !l_LevelSearchViewController.isInTransition &&
                                l_LevelSearchViewController.gameObject.activeInHierarchy)
                            {
                                l_LevelSearchViewController.didStartLoadingEvent -= LevelSearchViewController_didStartLoadingEvent;
                                l_LevelSearchViewController.ResetCurrentFilterParams();
                                var l_InputFieldView = l_LevelSearchViewController.GetField <InputFieldView>("_searchTextInputFieldView");
                                if (l_InputFieldView != null && l_InputFieldView)
                                {
                                    l_InputFieldView.SetText(m_PendingFilterSong.songName);
                                    l_InputFieldView.UpdateClearButton();
                                    l_InputFieldView.UpdatePlaceholder();
                                }

                                l_LevelSearchViewController.UpdateSearchLevelFilterParams(LevelFilterParams.ByBeatmapLevelIds(new HashSet <string>()
                                {
                                    m_PendingFilterSong.levelID
                                }));
                                l_LevelSearchViewController.didStartLoadingEvent += LevelSearchViewController_didStartLoadingEvent;
                            }
                        }
                        catch (System.Exception p_Exception)
                        {
                            Logger.Instance.Error("[ChatRequest] LevelSelectionNavigationController_didActivateEvent coroutine failed : ");
                            Logger.Instance.Error(p_Exception);

                            LevelSearchViewController_didStartLoadingEvent(l_LevelFilteringNavigationController.GetField <LevelSearchViewController>("_levelSearchViewController"));
                        }
                    });
                }
            }
            catch (System.Exception p_Exception)
            {
                Logger.Instance.Error("[ChatRequest] LevelSelectionNavigationController_didActivateEvent failed : ");
                Logger.Instance.Error(p_Exception);

                LevelSearchViewController_didStartLoadingEvent(l_LevelFilteringNavigationController.GetField <LevelSearchViewController>("_levelSearchViewController"));
            }
        }
コード例 #4
0
 static bool Prefix(ref LevelFilteringNavigationController __instance, ref TabBarViewController ____tabBarViewController)
 {
     __instance.GetField("_customLevelsTabBarData")?.SetField("annotatedBeatmapLevelCollections", Loader.CustomBeatmapLevelPackCollectionSO?.beatmapLevelPacks);
     return(false);
 }
コード例 #5
0
 static void Postfix(ref LevelFilteringNavigationController __instance, ref TabBarViewController ____tabBarViewController)
 {
     //      Logging.logger.Info("Set CustomLevelCollection");
     __instance.GetField("_customLevelsTabBarData")?.SetField("annotatedBeatmapLevelCollections", Loader.CustomBeatmapLevelPackCollectionSO?.beatmapLevelPacks);
 }
コード例 #6
0
        private IEnumerator buttonClickCoroutine(string buttonName)
        {
            /*
             * foreach (Button b in Resources.FindObjectsOfTypeAll<Button>())
             * {
             *  Logger.log?.Debug($"Button.name={b.name}");
             * }
             */

            Logger.log?.Debug($"Time.time={Time.time}, WaitUntil={buttonName}");
            yield return(new WaitUntil(() => Resources.FindObjectsOfTypeAll <Button>().Any(x => x != null && x.name == buttonName)));

            Logger.log?.Debug($"Time.time={Time.time}, Found");
            Button button = Resources.FindObjectsOfTypeAll <Button>().Where(x => x != null && x.name == buttonName).First();

            // need some wait
            yield return(new WaitForSecondsRealtime(Configuration.PluginConfig.Instance.wait));

            // wait for SongCore
            GameObject songCoreLoader = GameObject.Find("SongCore Loader");

            if (songCoreLoader != null)
            {
                Logger.log?.Debug($"Time.time={Time.time}, SongCore Found");
                foreach (var monoBehaviour in songCoreLoader.GetComponents <MonoBehaviour>())
                {
                    if (monoBehaviour.GetType().Name == "Loader")
                    {
                        Logger.log?.Debug($"Time.time={Time.time}, SongCore Loader Found");

                        Logger.log?.Debug($"Time.time={Time.time}, WaitUntil AreSongsLoading");
                        yield return(new WaitUntil(() => AreSongsLoading(monoBehaviour) == false));

                        Logger.log?.Debug($"Time.time={Time.time}, SongsLoaded");

                        // need some wait for update screen
                        yield return(new WaitForSecondsRealtime(1f));

                        break;
                    }
                }
            }

            button.onClick.Invoke();

            if ((Configuration.PluginConfig.Instance.selectTab >= 0) && (Configuration.PluginConfig.Instance.selectTab <= 3))
            {
                // need some wait
                yield return(new WaitForSecondsRealtime(Configuration.PluginConfig.Instance.wait));

                LevelFilteringNavigationController levelFilteringNavigationController = Resources.FindObjectsOfTypeAll <LevelFilteringNavigationController>().First();
                TabBarViewController tabBarViewController = levelFilteringNavigationController?.GetField <TabBarViewController, LevelFilteringNavigationController>("_tabBarViewController");
                if (levelFilteringNavigationController != null && tabBarViewController != null)
                {
                    tabBarViewController.SelectItem(Configuration.PluginConfig.Instance.selectTab);
                    levelFilteringNavigationController.SwitchToPlaylists();
                }
            }

            Logger.log?.Debug($"Time.time={Time.time}, Done");
        }
コード例 #7
0
        /// <summary>
        /// Sort the song list based on the settings.
        /// </summary>
        public void ProcessSongList(IAnnotatedBeatmapLevelCollection selectedBeatmapCollection, LevelSelectionNavigationController navController)
        {
            Logger.Trace("ProcessSongList()");

            List <IPreviewBeatmapLevel> unsortedSongs;
            List <IPreviewBeatmapLevel> filteredSongs;
            List <IPreviewBeatmapLevel> sortedSongs;

            // Abort
            if (selectedBeatmapCollection == null)
            {
                Logger.Debug("Cannot process songs yet, no level collection selected...");
                return;
            }

            Logger.Debug($"Using songs from level collection: {selectedBeatmapCollection.collectionName} [num={selectedBeatmapCollection.beatmapLevelCollection.beatmapLevels.Count}");
            unsortedSongs = GetLevelsForLevelCollection(selectedBeatmapCollection).ToList();

            // filter
            Logger.Debug($"Starting filtering songs by {PluginConfig.Instance.FilterMode}");
            Stopwatch stopwatch = Stopwatch.StartNew();

            if (PluginConfig.Instance.FilterMode == SongFilterMode.Requirements && !Plugin.IsCustomJsonDataEnabled)
            {
                PluginConfig.Instance.FilterMode = SongFilterMode.None;
            }

            switch (PluginConfig.Instance.FilterMode)
            {
            case SongFilterMode.Favorites:
                filteredSongs = FilterFavorites(unsortedSongs);
                break;

            case SongFilterMode.Search:
                filteredSongs = FilterSearch(unsortedSongs);
                break;

            case SongFilterMode.Ranked:
                filteredSongs = FilterRanked(unsortedSongs, true, false);
                break;

            case SongFilterMode.Unranked:
                filteredSongs = FilterRanked(unsortedSongs, false, true);
                break;

            case SongFilterMode.Played:
                filteredSongs = FilterPlayed(unsortedSongs, true, false);
                break;

            case SongFilterMode.Unplayed:
                filteredSongs = FilterPlayed(unsortedSongs, false, true);
                break;

            case SongFilterMode.Requirements:
                filteredSongs = FilterRequirements(unsortedSongs);
                break;

            case SongFilterMode.Custom:
                Logger.Info("Song filter mode set to custom. Deferring filter behaviour to another mod.");
                filteredSongs = CustomFilterHandler != null?CustomFilterHandler.Invoke(selectedBeatmapCollection) : unsortedSongs;

                break;

            case SongFilterMode.None:
            default:
                Logger.Info("No song filter selected...");
                filteredSongs = unsortedSongs;
                break;
            }

            stopwatch.Stop();
            Logger.Info("Filtering songs took {0}ms", stopwatch.ElapsedMilliseconds);

            // sort
            Logger.Debug($"Starting to sort songs by {PluginConfig.Instance.SortMode}");
            stopwatch = Stopwatch.StartNew();

            SortWasMissingData = false;

            switch (PluginConfig.Instance.SortMode)
            {
            case SongSortMode.Original:
                sortedSongs = SortOriginal(filteredSongs);
                break;

            case SongSortMode.Newest:
                sortedSongs = SortNewest(filteredSongs);
                break;

            case SongSortMode.Author:
                sortedSongs = SortAuthor(filteredSongs);
                break;

            case SongSortMode.Mapper:
                sortedSongs = SortMapper(filteredSongs);
                break;

            case SongSortMode.Vanilla:
                sortedSongs = SortVanilla(filteredSongs);
                break;

            case SongSortMode.UpVotes:
                sortedSongs = SortUpVotes(filteredSongs);
                break;

            case SongSortMode.PlayCount:
                sortedSongs = SortBeatSaverPlayCount(filteredSongs);
                break;

            case SongSortMode.Rating:
                sortedSongs = SortBeatSaverRating(filteredSongs);
                break;

            case SongSortMode.Heat:
                sortedSongs = SortBeatSaverHeat(filteredSongs);
                break;

            case SongSortMode.YourPlayCount:
                sortedSongs = SortPlayCount(filteredSongs);
                break;

            case SongSortMode.PP:
                sortedSongs = SortPerformancePoints(filteredSongs);
                break;

            case SongSortMode.Stars:
                sortedSongs = SortStars(filteredSongs);
                break;

            case SongSortMode.Random:
                sortedSongs = SortRandom(filteredSongs);
                break;

            case SongSortMode.Bpm:
                sortedSongs = SortSongBpm(filteredSongs);
                break;

            case SongSortMode.Length:
                sortedSongs = SortSongLength(filteredSongs);
                break;

            case SongSortMode.Custom:
                sortedSongs = CustomSortHandler != null?CustomSortHandler.Invoke(filteredSongs) : filteredSongs;

                break;

            case SongSortMode.Default:
            default:
                sortedSongs = SortSongName(filteredSongs);
                break;
            }

            if (PluginConfig.Instance.InvertSortResults && PluginConfig.Instance.SortMode != SongSortMode.Random && PluginConfig.Instance.SortMode != SongSortMode.Stars)
            {
                sortedSongs.Reverse();
            }

            stopwatch.Stop();
            Logger.Info("Sorting songs took {0}ms", stopwatch.ElapsedMilliseconds);

            // Still hacking in a custom level pack
            // Asterisk the pack name so it is identifable as filtered.
            var packName = selectedBeatmapCollection.collectionName;

            if (packName == null)
            {
                packName = "";
            }

            if (!packName.EndsWith("*") && PluginConfig.Instance.FilterMode != SongFilterMode.None)
            {
                packName += "*";
            }

            // Some level categories have a null cover image, supply something, it won't show it anyway
            var coverImage = selectedBeatmapCollection.coverImage;

            if (coverImage == null)
            {
                coverImage = BeatSaberMarkupLanguage.Utilities.ImageResources.BlankSprite;
            }

            var smallCoverImage = selectedBeatmapCollection.smallCoverImage;

            if (smallCoverImage == null)
            {
                smallCoverImage = BeatSaberMarkupLanguage.Utilities.ImageResources.BlankSprite;
            }

            Logger.Debug("Creating filtered level pack...");
            BeatmapLevelPack levelPack = new BeatmapLevelPack(SongBrowserModel.FilteredSongsCollectionName, packName, selectedBeatmapCollection.collectionName, coverImage, smallCoverImage, new BeatmapLevelCollection(sortedSongs.ToArray()));

            /*
             * public virtual void SetData(
             *  IAnnotatedBeatmapLevelCollection annotatedBeatmapLevelCollection,
             *  bool showPackHeader, bool showPlayerStats, bool showPracticeButton,
             *  string actionButtonText,
             *  GameObject noDataInfoPrefab, BeatmapDifficultyMask allowedBeatmapDifficultyMask, BeatmapCharacteristicSO[] notAllowedCharacteristics);
             */
            Logger.Debug("Acquiring necessary fields to call SetData(pack)...");
            LevelCollectionNavigationController lcnvc = navController.GetField <LevelCollectionNavigationController, LevelSelectionNavigationController>("_levelCollectionNavigationController");
            LevelFilteringNavigationController  lfnc  = navController.GetField <LevelFilteringNavigationController, LevelSelectionNavigationController>("_levelFilteringNavigationController");
            var _hidePracticeButton           = navController.GetField <bool, LevelSelectionNavigationController>("_hidePracticeButton");
            var _actionButtonText             = navController.GetField <string, LevelSelectionNavigationController>("_actionButtonText");
            var _allowedBeatmapDifficultyMask = navController.GetField <BeatmapDifficultyMask, LevelSelectionNavigationController>("_allowedBeatmapDifficultyMask");
            var _notAllowedCharacteristics    = navController.GetField <BeatmapCharacteristicSO[], LevelSelectionNavigationController>("_notAllowedCharacteristics");
            var noDataPrefab = lfnc.GetField <GameObject, LevelFilteringNavigationController>("_currentNoDataInfoPrefab");

            Logger.Debug("Calling lcnvc.SetData...");
            lcnvc.SetData(levelPack,
                          true,
                          !_hidePracticeButton,
                          _actionButtonText,
                          noDataPrefab,
                          _allowedBeatmapDifficultyMask,
                          _notAllowedCharacteristics);

            //_sortedSongs.ForEach(x => Logger.Debug(x.levelID));
        }