static void Prefix(ref LevelPackLevelsTableView __instance, int row, ref HMUI.TableView ____tableView, ref bool ____showLevelPackHeader, ref IBeatmapLevelPack ____pack)
        {
            if (!SongLoader.AreSongsLoaded)
            {
                return;
            }

            if (____pack.beatmapLevelCollection.beatmapLevels.Length == 0)
            {
                return;
            }

            int num = ____showLevelPackHeader ? (row - 1) : row;

            num = Mathf.Clamp(num, 0, ____pack.beatmapLevelCollection.beatmapLevels.Length - 1);

            //     Console.WriteLine($"Num: {num}   Size: {____pack.beatmapLevelCollection.beatmapLevels.Length}");

            if (!(____pack.beatmapLevelCollection.beatmapLevels[num] is OverrideClasses.CustomLevel))
            {
                return;
            }

            OverrideClasses.CustomLevel customLevel = ____pack.beatmapLevelCollection.beatmapLevels[num] as OverrideClasses.CustomLevel;
            if (!customLevel)
            {
                return;
            }

            if (customLevel.coverImage == SongLoader.CustomSongsIcon)
            {
                SongLoader.LoadSprite(customLevel.customSongInfo.path + "/" + customLevel.customSongInfo.coverImagePath, customLevel);
            }
        }
        /// <summary>
        /// Constructor.  Acquire all necessary BeatSaberUi elements.
        /// </summary>
        /// <param name="flowCoordinator"></param>
        public BeatSaberUIController(FlowCoordinator flowCoordinator)
        {
            LevelSelectionFlowCoordinator = flowCoordinator;

            // gather controllers and ui elements.
            LevelPackViewController = LevelSelectionFlowCoordinator.GetPrivateField <LevelPacksViewController>("_levelPacksViewController");
            Logger.Debug("Acquired LevelPacksViewController [{0}]", LevelPackViewController.GetInstanceID());

            LevelPackDetailViewController = LevelSelectionFlowCoordinator.GetPrivateField <LevelPackDetailViewController>("_levelPackDetailViewController");
            Logger.Debug("Acquired LevelPackDetailViewController [{0}]", LevelPackDetailViewController.GetInstanceID());

            LevelPacksTableView = LevelPackViewController.GetPrivateField <LevelPacksTableView>("_levelPacksTableView");
            Logger.Debug("Acquired LevelPacksTableView [{0}]", LevelPacksTableView.GetInstanceID());

            LevelPackLevelsViewController = LevelSelectionFlowCoordinator.GetPrivateField <LevelPackLevelsViewController>("_levelPackLevelsViewController");
            Logger.Debug("Acquired LevelPackLevelsViewController [{0}]", LevelPackLevelsViewController.GetInstanceID());

            LevelPackLevelsTableView = this.LevelPackLevelsViewController.GetPrivateField <LevelPackLevelsTableView>("_levelPackLevelsTableView");
            Logger.Debug("Acquired LevelPackLevelsTableView [{0}]", LevelPackLevelsTableView.GetInstanceID());

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

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

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

            LevelSelectionNavigationController = LevelSelectionFlowCoordinator.GetPrivateField <DismissableNavigationController>("_navigationController");
            Logger.Debug("Acquired DismissableNavigationController [{0}]", LevelSelectionNavigationController.GetInstanceID());

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

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

            TableView tableView = ReflectionUtil.GetPrivateField <TableView>(LevelPackLevelsTableView, "_tableView");

            TableViewPageUpButton   = tableView.GetPrivateField <Button>("_pageUpButton");
            TableViewPageDownButton = tableView.GetPrivateField <Button>("_pageDownButton");
            Logger.Debug("Acquired Page Up and Down buttons...");

            PlayContainer = StandardLevelDetailView.GetComponentsInChildren <RectTransform>().First(x => x.name == "PlayContainer");
            PlayButtons   = PlayContainer.GetComponentsInChildren <RectTransform>().First(x => x.name == "PlayButtons");

            PlayButton     = Resources.FindObjectsOfTypeAll <Button>().First(x => x.name == "PlayButton");
            PracticeButton = PlayButtons.GetComponentsInChildren <Button>().First(x => x.name == "PracticeButton");

            SimpleDialogPromptViewControllerPrefab = Resources.FindObjectsOfTypeAll <SimpleDialogPromptViewController>().First();
        }
Ejemplo n.º 3
0
 //      public static OverrideClasses.CustomLevel previouslySelectedSong = null;
 static void Prefix(LevelPackLevelsTableView tableView, IPreviewBeatmapLevel level)
 {
     if (level is CustomPreviewBeatmapLevel)
     {
         var customLevel = level as CustomPreviewBeatmapLevel;
         if (customLevel != null)
         {
             //       Logging.Log(Utilities.Hashing.GetCustomLevelHash(customLevel));
             SongCore.Collections.AddSong(Utilities.Hashing.GetCustomLevelHash(customLevel), customLevel.customLevelPath);
             SongCore.Collections.SaveExtraSongData();
         }
     }
 }
        /// <summary>
        /// Scroll TableView to proper row, fire events.
        /// </summary>
        /// <param name="table"></param>
        /// <param name="levelID"></param>
        public void SelectAndScrollToLevel(LevelPackLevelsTableView table, string levelID)
        {
            Logger.Debug("Scrolling to LevelID: {0}", levelID);

            // Check once per load
            if (!_checkedForTwitchPlugin)
            {
                Logger.Info("Checking for BeatSaber Twitch Integration Plugin...");
                _detectedTwitchPluginQueue = Resources.FindObjectsOfTypeAll <VRUIViewController>().Any(x => x.name == "RequestInfo");
                Logger.Info("BeatSaber Twitch Integration plugin detected: " + _detectedTwitchPluginQueue);

                _checkedForTwitchPlugin = true;
            }

            // Skip scrolling to level if twitch plugin has queue active.
            if (_detectedTwitchPluginQueue)
            {
                Logger.Debug("Skipping SelectAndScrollToLevel() because we detected Twitch Integration Plugin has a Queue active...");
                return;
            }

            // try to find the index and scroll to it
            int selectedIndex = 0;
            List <IPreviewBeatmapLevel> levels = table.GetPrivateField <IBeatmapLevelPack>("_pack").beatmapLevelCollection.beatmapLevels.ToList();

            if (levels.Count <= 0)
            {
                return;
            }

            // acquire the index or try the last row
            selectedIndex = levels.FindIndex(x => x.levelID == levelID);
            if (selectedIndex < 0)
            {
                // this might look like an off by one error but the _level list we keep is missing the header entry BeatSaber.
                // so the last row is +1 the max index, the count.
                int maxCount = GetLevelPackLevelCount();

                int selectedRow = table.GetPrivateField <int>("_selectedRow");

                Logger.Debug("Song is not in the level pack, cannot scroll to it...  Using last known row {0}/{1}", selectedRow, maxCount);
                selectedIndex = Math.Min(maxCount, selectedRow);
            }
            else
            {
                // the header counts as an index, so if the index came from the level array we have to add 1.
                selectedIndex += 1;
            }

            ScrollToLevelByRow(selectedIndex);
        }
        public void OnMenuSceneLoadedFresh()
        {
            // get view controller which will contain our buttons
            RectTransform viewControllersContainer = FindObjectsOfType <RectTransform>().First(x => x.name == "ViewControllers");

            ButtonParentViewController = viewControllersContainer.GetComponentInChildren <DismissableNavigationController>(true);

            _levelsTableViewContainer = viewControllersContainer.GetComponentInChildren <LevelPackLevelsTableView>(true);
            _levelsTableView          = _levelsTableViewContainer.GetPrivateField <TableView>("_tableView");
            LevelsViewController      = viewControllersContainer.GetComponentInChildren <LevelPackLevelsViewController>(true);

            var levelPacksViewController = viewControllersContainer.GetComponentInChildren <LevelPacksViewController>(true);

            levelPacksViewController.didSelectPackEvent += LevelPackSelected;

            Button soloFreePlayButton  = Resources.FindObjectsOfTypeAll <Button>().First(x => x.name == "SoloFreePlayButton");
            Button partyFreePlayButton = Resources.FindObjectsOfTypeAll <Button>().First(x => x.name == "PartyFreePlayButton");
            Button campaignButton      = Resources.FindObjectsOfTypeAll <Button>().First(x => x.name == "CampaignButton");

            soloFreePlayButton.onClick.AddListener(() => OnModeSelection(FreePlayMode.Solo));
            partyFreePlayButton.onClick.AddListener(() => OnModeSelection(FreePlayMode.Party));
            campaignButton.onClick.AddListener(() => OnModeSelection(FreePlayMode.Campaign));

            if (SongBrowserTweaks.ModLoaded)
            {
                // delay building UI until SongBrowser elements are built (after the user selects mode)
            }
            else if (BeatSaverDownloaderTweaks.ModLoaded)
            {
                StartCoroutine(GetBeatSaverDownloaderButtons());
            }
            else
            {
                CreateSearchButton(DefaultSearchButtonPosition, DefaultButtonSize);
                CreateFilterButton(DefaultFilterButtonPosition, DefaultButtonSize);
                CreateClearButton(DefaultClearButtonPosition, DefaultButtonSize);
                ToggleButtonsActive(false);
            }
        }
Ejemplo n.º 6
0
        static TableCell Postfix(TableCell __result, LevelPackLevelsTableView __instance, int row)
        {
            try
            {
                if (!PluginConfig.enableSongIcons)
                {
                    return(__result);
                }

                bool showHeader = __instance.GetPrivateField <bool>("_showLevelPackHeader");

                if (row == 0 && showHeader)
                {
                    return(__result);
                }

                string levelId = __instance.GetPrivateField <IBeatmapLevelPack>("_pack").beatmapLevelCollection.beatmapLevels[(showHeader ? (row - 1) : row)].levelID;
                levelId = levelId.Substring(0, Math.Min(32, levelId.Length));

                UnityEngine.UI.Image icon = null;

                UnityEngine.UI.Image[] levelIcons = __result.GetPrivateField <UnityEngine.UI.Image[]>("_beatmapCharacteristicImages");
                float[] levelIconAlphas           = __result.GetPrivateField <float[]>("_beatmapCharacteristicAlphas");

                if (levelIcons.Any(x => x.name == "LevelTypeIconExtra"))
                {
                    icon = levelIcons.First(x => x.name == "LevelTypeIconExtra");
                }
                else
                {
                    icon = GameObject.Instantiate(__result.GetComponentsInChildren <UnityEngine.UI.Image>().First(x => x.name == "LevelTypeIcon0"), __result.transform, true);

                    (icon.transform as RectTransform).anchoredPosition = new Vector2(-14.5f, 0f);
                    icon.transform.name = "LevelTypeIconExtra";

                    levelIcons = levelIcons.AddToArray(icon);
                    __result.SetPrivateField("_beatmapCharacteristicImages", levelIcons);

                    levelIconAlphas = levelIconAlphas.AddToArray(0.1f);
                    __result.SetPrivateField("_beatmapCharacteristicAlphas", levelIconAlphas);

                    foreach (var levelIcon in levelIcons)
                    {
                        levelIcon.rectTransform.anchoredPosition = new Vector2(levelIcon.rectTransform.anchoredPosition.x, -2f);
                    }
                }

                if (PluginConfig.favoriteSongs.Any(x => x.StartsWith(levelId)))
                {
                    levelIconAlphas[3] = 1f;
                    icon.sprite        = Sprites.StarFull;
                }
                else if (PluginConfig.votedSongs.ContainsKey(levelId))
                {
                    switch (PluginConfig.votedSongs[levelId].voteType)
                    {
                    case VoteType.Upvote:
                    {
                        levelIconAlphas[3] = 1f;
                        icon.sprite        = Sprites.ThumbUp;
                    }
                    break;

                    case VoteType.Downvote:
                    {
                        levelIconAlphas[3] = 1f;
                        icon.sprite        = Sprites.ThumbDown;
                    }
                    break;
                    }
                }
                else
                {
                    levelIconAlphas[3] = 0.1f;
                    icon.sprite        = Sprites.StarFull;
                }
            }
            catch (Exception e)
            {
                Logger.Exception("Unable to create extra icon! Exception: " + e);
            }
            return(__result);
        }