Explorar o código

Merge pull request #92 from halsafar/devel

Update master, time for a release
Halsafar %!s(int64=5) %!d(string=hai) anos
pai
achega
4568865ea9

+ 4 - 2
README.md

@@ -23,7 +23,9 @@ A plugin for customizing the in-game song browser.
 - Filters:
   - Playlists.
   - Search (with keyboard support).
-  - Favorites (all songs you have marked as a favorite).  
+  - Favorites (all songs you have marked as a favorite).
+  - Ranked.
+  - Unranked.
 - UI Enhancements:
   - Display PP, STARS, and NJS.
   - Fast scroll buttons (jumps 10% of your song list in each press).
@@ -60,6 +62,6 @@ A plugin for customizing the in-game song browser.
 - `customDetailUrl` (optional): Expects a response equivalent to BeatSaver.com API.
 
 ## Status
-- Working with BeatSaber 1.1.0
+- Working with BeatSaber 1.1.0p1
 
 

BIN=BIN
SongBrowserPlugin/Assets/Graph.png


BIN=BIN
SongBrowserPlugin/Assets/Search.png


BIN=BIN
SongBrowserPlugin/Assets/Speed.png


BIN=BIN
SongBrowserPlugin/Assets/X.png


+ 30 - 64
SongBrowserPlugin/DataAccess/SongBrowserModel.cs

@@ -17,6 +17,8 @@ namespace SongBrowser
 {
     public class SongBrowserModel
     {
+        public const string FilteredSongsPackId = "SongBrowser_FilteredSongPack";
+
         private readonly String CUSTOM_SONGS_DIR = Path.Combine("Beat Saber_Data", "CustomLevels");
 
         private readonly DateTime EPOCH = new DateTime(1970, 1, 1);
@@ -343,42 +345,9 @@ namespace SongBrowser
         }
 
         /// <summary>
-        /// Overwrite the current level pack.
-        /// </summary>
-        private void OverwriteCurrentLevelPack(IBeatmapLevelPack pack, List<IPreviewBeatmapLevel> sortedLevels)
-        {
-            Logger.Debug("Overwriting levelPack [{0}] beatmapLevelCollection.levels", pack);
-            if (pack.packID == PluginConfig.CUSTOM_SONG_LEVEL_PACK_ID || (pack as SongCoreCustomBeatmapLevelPack) != null)
-            {
-                Logger.Debug("Overwriting SongCore Level Pack collection...");
-                var newLevels = sortedLevels.Select(x => x as CustomPreviewBeatmapLevel);
-                ReflectionUtil.SetPrivateField(pack.beatmapLevelCollection, "_customPreviewBeatmapLevels", newLevels.ToArray());
-            }
-            else
-            {
-                // Hack to see if level pack is purchased or not.
-                BeatmapLevelPackSO beatmapLevelPack = pack as BeatmapLevelPackSO;
-                if ((pack as BeatmapLevelPackSO) != null)
-                {
-                    Logger.Debug("Owned level pack...");
-                    var newLevels = sortedLevels.Select(x => x as BeatmapLevelSO);
-                    ReflectionUtil.SetPrivateField(pack.beatmapLevelCollection, "_beatmapLevels", newLevels.ToArray());
-                }
-                else
-                {
-                    Logger.Debug("Unowned DLC Detected...");
-                    var newLevels = sortedLevels.Select(x => x as PreviewBeatmapLevelSO);
-                    ReflectionUtil.SetPrivateField(pack.beatmapLevelCollection, "_beatmapLevels", newLevels.ToArray());
-                }
-
-                Logger.Debug("Overwriting Regular Collection...");
-            }
-        }
-
-        /// <summary>
         /// Sort the song list based on the settings.
         /// </summary>
-        public void ProcessSongList(IBeatmapLevelPack pack)
+        public void ProcessSongList(LevelPackLevelsViewController levelsViewController)
         {
             Logger.Trace("ProcessSongList()");
 
@@ -386,51 +355,39 @@ namespace SongBrowser
             List<IPreviewBeatmapLevel> filteredSongs = null;
             List<IPreviewBeatmapLevel> sortedSongs = null;
 
-            // This has come in handy many times for debugging issues with Newest.
-            /*foreach (BeatmapLevelSO level in _originalSongs)
-            {
-                if (_levelIdToCustomLevel.ContainsKey(level.levelID))
-                {
-                    Logger.Debug("HAS KEY {0}: {1}", _levelIdToCustomLevel[level.levelID].customSongInfo.path, level.levelID);
-                }
-                else
-                {
-                    Logger.Debug("Missing KEY: {0}", level.levelID);
-                }
-            }*/
-
             // Abort
-            if (pack == null)
+            if (levelsViewController.levelPack == null)
             {
                 Logger.Debug("Cannot process songs yet, no level pack selected...");
                 return;
             }
             
             // fetch unsorted songs.
+            // playlists always use customsongs
             if (this._settings.filterMode == SongFilterMode.Playlist && this.CurrentPlaylist != null)
             {
                 unsortedSongs = null;
             }
             else
             {
-                Logger.Debug("Using songs from level pack: {0}", pack.packID);
-                unsortedSongs = pack.beatmapLevelCollection.beatmapLevels.ToList();
+                Logger.Debug("Using songs from level pack: {0}", levelsViewController.levelPack.packID);
+                unsortedSongs = levelsViewController.levelPack.beatmapLevelCollection.beatmapLevels.ToList();
             }
 
             // filter
-            Logger.Debug("Starting filtering songs...");
+            Logger.Debug($"Starting filtering songs by {_settings.filterMode}");
             Stopwatch stopwatch = Stopwatch.StartNew();
 
             switch (_settings.filterMode)
             {
                 case SongFilterMode.Favorites:
-                    filteredSongs = FilterFavorites(pack);
+                    filteredSongs = FilterFavorites();
                     break;
                 case SongFilterMode.Search:
                     filteredSongs = FilterSearch(unsortedSongs);
                     break;
                 case SongFilterMode.Playlist:
-                    filteredSongs = FilterPlaylist(pack);
+                    filteredSongs = FilterPlaylist();
                     break;
                 case SongFilterMode.Ranked:
                     filteredSongs = FilterRanked(unsortedSongs, true, false);
@@ -440,7 +397,7 @@ namespace SongBrowser
                     break;
                 case SongFilterMode.Custom:
                     Logger.Info("Song filter mode set to custom. Deferring filter behaviour to another mod.");
-                    filteredSongs = CustomFilterHandler != null ? CustomFilterHandler.Invoke(pack) : unsortedSongs;
+                    filteredSongs = CustomFilterHandler != null ? CustomFilterHandler.Invoke(levelsViewController.levelPack) : unsortedSongs;
                     break;
                 case SongFilterMode.None:
                 default:
@@ -508,7 +465,15 @@ namespace SongBrowser
             stopwatch.Stop();
             Logger.Info("Sorting songs took {0}ms", stopwatch.ElapsedMilliseconds);
 
-            this.OverwriteCurrentLevelPack(pack, sortedSongs);
+            // Asterisk the pack name so it is identifable as filtered.
+            var packName = levelsViewController.levelPack.packName;
+            if (!packName.EndsWith("*") && _settings.filterMode != SongFilterMode.None)
+            {
+                packName += "*";
+            }
+            BeatmapLevelPack levelPack = new BeatmapLevelPack(SongBrowserModel.FilteredSongsPackId, packName, levelsViewController.levelPack.coverImage, new BeatmapLevelCollection(sortedSongs.ToArray()));
+            levelsViewController.SetData(levelPack);
+
             //_sortedSongs.ForEach(x => Logger.Debug(x.levelID));
         }
 
@@ -516,14 +481,14 @@ namespace SongBrowser
         /// For now the editing playlist will be considered the favorites playlist.
         /// Users can edit the settings file themselves.
         /// </summary>
-        private List<IPreviewBeatmapLevel> FilterFavorites(IBeatmapLevelPack pack)
+        private List<IPreviewBeatmapLevel> FilterFavorites()
         {
             Logger.Info("Filtering song list as favorites playlist...");
             if (this.CurrentEditingPlaylist != null)
             {
                 this.CurrentPlaylist = this.CurrentEditingPlaylist;
             }
-            return this.FilterPlaylist(pack);
+            return this.FilterPlaylist();
         }
 
         /// <summary>
@@ -569,7 +534,7 @@ namespace SongBrowser
         /// </summary>
         /// <param name="pack"></param>
         /// <returns></returns>
-        private List<IPreviewBeatmapLevel> FilterPlaylist(IBeatmapLevelPack pack)
+        private List<IPreviewBeatmapLevel> FilterPlaylist()
         {
             // bail if no playlist, usually means the settings stored one the user then moved.
             if (this.CurrentPlaylist == null)
@@ -584,12 +549,12 @@ namespace SongBrowser
 
             Logger.Debug("Filtering songs for playlist: {0}", this.CurrentPlaylist.playlistTitle);
 
-            Dictionary<String, IPreviewBeatmapLevel> levelDict = new Dictionary<string, IPreviewBeatmapLevel>();
-            foreach (var level in pack.beatmapLevelCollection.beatmapLevels)
+            Dictionary<String, CustomPreviewBeatmapLevel> levelDict = new Dictionary<string, CustomPreviewBeatmapLevel>();
+            foreach (var level in SongCore.Loader.CustomLevels)
             {
-                if (!levelDict.ContainsKey(level.levelID))
+                if (!levelDict.ContainsKey(level.Value.levelID))
                 {
-                    levelDict.Add(level.levelID, level);
+                    levelDict.Add(level.Value.levelID, level.Value);
                 }               
             }
 
@@ -817,11 +782,12 @@ namespace SongBrowser
         /// <returns></returns>
         private List<IPreviewBeatmapLevel> SortRandom(List<IPreviewBeatmapLevel> levelIds)
         {
-            Logger.Info("Sorting song list by random (seed={0})...", this.Settings.randomSongSeed);
+            Logger.Info("Sorting song list by random (seed={0})...", Settings.randomSongSeed);
 
-            System.Random rnd = new System.Random(this.Settings.randomSongSeed);
+            System.Random rnd = new System.Random(Settings.randomSongSeed);
 
             return levelIds
+                .OrderBy(x => x.songName)
                 .OrderBy(x => rnd.Next())
                 .ToList();
         }

+ 1 - 1
SongBrowserPlugin/Plugin.cs

@@ -11,7 +11,7 @@ namespace SongBrowser
 {
     public class Plugin : IBeatSaberPlugin
     {
-        public const string VERSION_NUMBER = "5.3.1";
+        public const string VERSION_NUMBER = "5.4.0";
         public static Plugin Instance;
         public static IPA.Logging.Logger Log;
 

+ 0 - 6
SongBrowserPlugin/PluginConfig.cs

@@ -1,13 +1,7 @@
 using Microsoft.Win32;
 using System;
-using System.Collections.Generic;
 using System.IO;
 using System.Linq;
-using System.Text;
-using System.Xml.Serialization;
-using SongBrowser;
-using Newtonsoft.Json;
-using Newtonsoft.Json.Converters;
 using Logger = SongBrowser.Logging.Logger;
 using IPA.Config;
 

+ 2 - 2
SongBrowserPlugin/Properties/AssemblyInfo.cs

@@ -31,5 +31,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers 
 // by using the '*' as shown below:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("5.3.1")]
-[assembly: AssemblyFileVersion("5.3.1")]
+[assembly: AssemblyVersion("5.4.0")]
+[assembly: AssemblyFileVersion("5.4.0")]

+ 4 - 1
SongBrowserPlugin/SongBrowser.csproj

@@ -155,19 +155,22 @@
     <Compile Include="UI\Browser\SongSortButton.cs" />
     <Compile Include="UI\UIBuilder.cs" />
   </ItemGroup>
-  <ItemGroup />
   <ItemGroup>
     <EmbeddedResource Include="Assets\AddToFavorites.png" />
     <EmbeddedResource Include="Assets\DeleteIcon.png" />
     <EmbeddedResource Include="Assets\DoubleArrow.png" />
     <EmbeddedResource Include="Assets\BeastSaberLogo.png" />
     <EmbeddedResource Include="Assets\DownloadIcon.png" />
+    <EmbeddedResource Include="Assets\Graph.png" />
     <EmbeddedResource Include="Assets\RandomIcon.png" />
     <EmbeddedResource Include="Assets\SongIcon.png" />
     <EmbeddedResource Include="Assets\PlaylistIcon.png" />
     <EmbeddedResource Include="Assets\StarEmpty.png" />
     <EmbeddedResource Include="Assets\StarFull.png" />
     <EmbeddedResource Include="Assets\RemoveFromFavorites.png" />
+    <EmbeddedResource Include="Assets\Search.png" />
+    <EmbeddedResource Include="Assets\Speed.png" />
+    <EmbeddedResource Include="Assets\X.png" />
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />

+ 17 - 12
SongBrowserPlugin/SongBrowserApplication.cs

@@ -16,9 +16,17 @@ namespace SongBrowser
 
         // Song Browser UI Elements
         private SongBrowserUI _songBrowserUI;
+        private SongBrowserModel _songBrowserModel;
 
         public static SongBrowser.UI.ProgressBar MainProgressBar;
 
+        public SongBrowserModel Model
+        {
+            get
+            {
+                return _songBrowserModel;
+            }
+        }
 
         /// <summary>
         /// Load the main song browser app.
@@ -46,7 +54,13 @@ namespace SongBrowser
 
             Instance = this;
 
+            // Init Model, load settings
+            _songBrowserModel = new SongBrowserModel();
+            _songBrowserModel.Init();
+
+            // Init browser UI
             _songBrowserUI = gameObject.AddComponent<SongBrowserUI>();
+            _songBrowserUI.Model = _songBrowserModel;
         }
 
         /// <summary>
@@ -111,7 +125,7 @@ namespace SongBrowser
             Logger.Trace("OnScoreSaberDataDownloaded");
             try
             {
-                if (_songBrowserUI.Model.Settings.sortMode.NeedsScoreSaberData())
+                if (_songBrowserModel.Settings.sortMode.NeedsScoreSaberData())
                 {
                     _songBrowserUI.ProcessSongList();
                     _songBrowserUI.RefreshSongUI();
@@ -135,7 +149,7 @@ namespace SongBrowser
             Logger.Trace("OnBeatSaverDataDownloaded");
             try
             {
-                if (_songBrowserUI.Model.Settings.sortMode.NeedsBeatSaverData())
+                if (_songBrowserModel.Settings.sortMode.NeedsBeatSaverData())
                 {
                     _songBrowserUI.ProcessSongList();
                     _songBrowserUI.RefreshSongUI();
@@ -224,17 +238,8 @@ namespace SongBrowser
             yield return new WaitForEndOfFrame();
 
             _songBrowserUI.UpdateLevelDataModel();
+            _songBrowserUI.UpdateLevelPackSelection();
             _songBrowserUI.RefreshSongList();
         }
-
-        /// <summary>
-        /// Helper for invoking buttons.
-        /// </summary>
-        /// <param name="buttonName"></param>
-        public static void InvokeBeatSaberButton(String buttonName)
-        {
-            Button buttonInstance = Resources.FindObjectsOfTypeAll<Button>().First(x => (x.name == buttonName));
-            buttonInstance.onClick.Invoke();
-        }
     }
 }

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 5 - 18
SongBrowserPlugin/UI/Base64Sprites.cs


+ 42 - 58
SongBrowserPlugin/UI/Browser/SongBrowserUI.cs

@@ -69,11 +69,17 @@ namespace SongBrowser.UI
         
         private Sprite _currentAddFavoriteButtonSprite;
 
+        private IBeatmapLevelPack _lastLevelPack;
+
         // Model
         private SongBrowserModel _model;
-
         public SongBrowserModel Model
         {
+            set
+            {
+                _model = value;
+            }
+
             get
             {
                 return _model;
@@ -85,19 +91,6 @@ namespace SongBrowser.UI
         private UIState _currentUiState = UIState.Disabled;
 
         /// <summary>
-        /// Constructor
-        /// </summary>
-        public SongBrowserUI() : base()
-        {
-            if (_model == null)
-            {
-                _model = new SongBrowserModel();
-            }
-
-            _model.Init();
-        }
-
-        /// <summary>
         /// Builds the UI for this plugin.
         /// </summary>
         public void CreateUI(MainMenuViewController.MenuButton mode)
@@ -157,9 +150,10 @@ namespace SongBrowser.UI
                 this.ModifySongStatsPanel();
                 this.ResizeSongUI();
 
+                _uiCreated = true;
+
                 RefreshSortButtonUI();
 
-                _uiCreated = true;
                 Logger.Debug("Done Creating UI...");
             }
             catch (Exception e)
@@ -230,7 +224,7 @@ namespace SongBrowser.UI
             _filterByDisplay = _beatUi.LevelPackLevelsViewController.CreateUIButton("ApplyButton", new Vector2(curX, buttonY), new Vector2(outerButtonWidth, buttonHeight), () =>
             {
                 _model.Settings.filterMode = SongFilterMode.None;
-                SongCore.Loader.Instance.RefreshLevelPacks();
+                CancelFilter();
                 RefreshSongUI();
             }, "");
             _filterByDisplay.SetButtonTextSize(displayButtonFontSize);
@@ -504,8 +498,8 @@ namespace SongBrowser.UI
             _beatUi.LevelDetailViewController.didChangeDifficultyBeatmapEvent -= OnDidChangeDifficultyEvent;
             _beatUi.LevelDetailViewController.didChangeDifficultyBeatmapEvent += OnDidChangeDifficultyEvent;
 
-            _beatUi.LevelPacksTableView.didSelectPackEvent -= _levelPacksTableView_didSelectPackEvent;
-            _beatUi.LevelPacksTableView.didSelectPackEvent += _levelPacksTableView_didSelectPackEvent;
+            //_beatUi.LevelPacksTableView.didSelectPackEvent -= _levelPacksTableView_didSelectPackEvent;
+            //_beatUi.LevelPacksTableView.didSelectPackEvent += _levelPacksTableView_didSelectPackEvent;
             _beatUi.LevelPackViewController.didSelectPackEvent -= _levelPackViewController_didSelectPackEvent;
             _beatUi.LevelPackViewController.didSelectPackEvent += _levelPackViewController_didSelectPackEvent;
 
@@ -557,7 +551,7 @@ namespace SongBrowser.UI
                 return;
             }
 
-            this._model.ProcessSongList(_beatUi.GetCurrentSelectedLevelPack());
+            this._model.ProcessSongList(_beatUi.LevelPackLevelsViewController);
         }
 
         /// <summary>
@@ -565,9 +559,9 @@ namespace SongBrowser.UI
         /// </summary>
         public void CancelFilter()
         {
-            Logger.Debug("Cancelling filter.");
+            Logger.Debug($"Cancelling filter, levelPack {_lastLevelPack}");
             _model.Settings.filterMode = SongFilterMode.None;
-            SongCore.Loader.Instance.RefreshLevelPacks();
+            _beatUi.LevelPackLevelsViewController.SetData(_lastLevelPack);
         }
 
         /// <summary>
@@ -589,11 +583,7 @@ namespace SongBrowser.UI
 
             try
             {
-                bool didUpdateLevelPack = this.UpdateLevelPackSelection();
-                if (!didUpdateLevelPack)
-                {
-                    _model.ProcessSongList(_beatUi.GetCurrentSelectedLevelPack());
-                }
+                UpdateLevelPackSelection();
                 _beatUi.SelectAndScrollToLevel(_beatUi.LevelPackLevelsTableView, _model.LastSelectedLevelId);
                 RefreshQuickScrollButtons();
             }
@@ -629,28 +619,31 @@ namespace SongBrowser.UI
         /// </summary>
         /// <param name="arg1"></param>
         /// <param name="arg2"></param>
-        private void _levelPackViewController_didSelectPackEvent(LevelPacksViewController arg1, IBeatmapLevelPack arg2)
+        private void _levelPackViewController_didSelectPackEvent(LevelPacksViewController arg1, IBeatmapLevelPack levelPack)
         {
-            Logger.Trace("_levelPackViewController_didSelectPackEvent(arg2={0})", arg2);
+            Logger.Trace("_levelPackViewController_didSelectPackEvent(levelPack={0})", levelPack);
 
             try
             {
-                // reset filter mode always here
-                if (this._model.Settings.currentLevelPackId != arg2.packID)
+                // store the real level pack
+                if (levelPack.packID != SongBrowserModel.FilteredSongsPackId)
                 {
-                    this._model.Settings.filterMode = SongFilterMode.None;
+                    _lastLevelPack = levelPack;
                 }
 
-                // save level pack
-                this._model.Settings.currentLevelPackId = arg2.packID;
+                // reset level selection
+                _model.LastSelectedLevelId = null;
+
+                // save level packs
+                this._model.Settings.currentLevelPackId = levelPack.packID;
                 this._model.Settings.Save();
 
-                this._model.ProcessSongList(arg2);
+                ProcessSongList();
 
                 // trickery to handle Downloader playlist level packs
                 // We need to avoid scrolling to a level and then select the header
                 bool scrollToLevel = true;
-                if (arg2.packID.Contains("Playlist_"))
+                if (levelPack.packID.Contains("Playlist_"))
                 {
                     scrollToLevel = false;
                 }
@@ -675,7 +668,7 @@ namespace SongBrowser.UI
             _model.Settings.filterMode = SongFilterMode.None;
             _model.Settings.Save();
 
-            SongCore.Loader.Instance.RefreshLevelPacks();
+            CancelFilter();
             ProcessSongList();
             RefreshSongUI();
         }
@@ -724,17 +717,19 @@ namespace SongBrowser.UI
         {
             Logger.Debug($"FilterButton {mode} clicked.");
 
-            // TODO - Downloader level pack support - need a way to refresh downloader level packs.
-
-            // Every filter will lead to needing a refresh.
-            SongCore.Loader.Instance.RefreshLevelPacks();
+            if (_lastLevelPack == null || _beatUi.LevelPackLevelsViewController.levelPack.packID != SongBrowserModel.FilteredSongsPackId)
+            {
+                _lastLevelPack = _beatUi.LevelPackLevelsViewController.levelPack;
+            }
 
-            // Always select the custom level pack - TODO - Downloader level pack support - Don't always do this
-            var pack = _beatUi.GetCurrentSelectedLevelPack();
-            if (pack != null && !pack.packID.Equals(PluginConfig.CUSTOM_SONG_LEVEL_PACK_ID))
+            if (mode == SongFilterMode.Favorites || mode == SongFilterMode.Playlist)
             {
                 _beatUi.SelectLevelPack(PluginConfig.CUSTOM_SONG_LEVEL_PACK_ID);
             }
+            else
+            {
+                _beatUi.LevelPackLevelsViewController.SetData(_lastLevelPack);
+            }
 
             // If selecting the same filter, cancel
             if (_model.Settings.filterMode == mode)
@@ -1070,7 +1065,7 @@ namespace SongBrowser.UI
 
                     if (_model.Settings.filterMode == SongFilterMode.Favorites)
                     {
-                        this._model.ProcessSongList(_beatUi.GetCurrentSelectedLevelPack());
+                        ProcessSongList();
                         this.RefreshSongList();
                     }
                 }
@@ -1404,12 +1399,6 @@ namespace SongBrowser.UI
                 }
 
                 _model.UpdateLevelRecords();
-
-                bool didUpdateLevelPack = UpdateLevelPackSelection();
-                if (didUpdateLevelPack)
-                {
-                    ProcessSongList();
-                }
             }
             catch (Exception e)
             {
@@ -1440,20 +1429,15 @@ namespace SongBrowser.UI
                 {
                     Logger.Debug("Automatically selecting level pack: {0}", _model.Settings.currentLevelPackId);
 
-                    // HACK - BeatSaber seems to always go back to OST1 internally.
-                    //      - Lets force it to the last pack id but not have SongBrowser functions fire.
-                    // Turn off our event processing
                     _beatUi.LevelPackViewController.didSelectPackEvent -= _levelPackViewController_didSelectPackEvent;
-                    _beatUi.LevelPacksTableView.didSelectPackEvent -= _levelPacksTableView_didSelectPackEvent;
 
-                    var levelPack = _beatUi.GetLevelPackByPackId(_model.Settings.currentLevelPackId);
+                    _lastLevelPack = _beatUi.GetLevelPackByPackId(_model.Settings.currentLevelPackId);
                     _beatUi.SelectLevelPack(_model.Settings.currentLevelPackId);
 
+                    _beatUi.LevelPackViewController.didSelectPackEvent += _levelPackViewController_didSelectPackEvent;
+
                     ProcessSongList();
 
-                    _beatUi.LevelPackViewController.didSelectPackEvent += _levelPackViewController_didSelectPackEvent;
-                    _beatUi.LevelPacksTableView.didSelectPackEvent += _levelPacksTableView_didSelectPackEvent;
-                    
                     return true;
                 }
             }

+ 3 - 3
SongBrowserPlugin/manifest.json

@@ -2,14 +2,14 @@
   "$schema": "https://raw.githubusercontent.com/beat-saber-modding-group/BSIPA-MetadataFileSchema/master/Schema.json",
   "author": "Halsafar",
   "description": "Adds sort and filter features to the level selection UI.",
-  "gameVersion": "1.1.0",
+  "gameVersion": "1.1.0p1",
   "id": "SongBrowser",
   "name": "Song Browser",
-  "version": "5.3.1",
+  "version": "5.4.0",
   "dependsOn": {
     "CustomUI": "^1.5.4",
     "SongCore": "^2.0.0",
-    "SongDataCore":  "^1.0.0"
+    "SongDataCore":  "^1.1.0"
   },
   "features": [
     "print",