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(); }
// 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); } }
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); }