//private bool SaberExists(AssetsManager manager, string saberID) //{ // var file11 = manager.GetAssetsFile(BSConst.KnownFiles.File11); // return file11.FindAsset<GameObject>(x => x.Object.Name == $"{saberID}Saber") != null; //} //private string GetCurrentSaberID(AssetsManager manager) //{ // var saberChild = GetSaberObjectParentTransform(manager)?.GameObject?.Object; // if (saberChild == null) // throw new Exception("Couldn't find child saber game object of transform."); // return saberChild.Name.Substring(0, saberChild.Name.Length - 5); //} //private Transform GetSaberObjectParentTransform(AssetsManager manager) //{ // var file11 = manager.GetAssetsFile(BSConst.KnownFiles.File11); // var basicSaberModel = file11.FindAsset<GameObject>(x => x.Object.Name == "BasicSaberModel"); // if (basicSaberModel == null) // throw new Exception("Couldn't find BasicSaberModel!"); // var transform = basicSaberModel.Object.Components.FirstOrDefault(x => x.Object is Transform)?.Object as Transform; // if (transform == null) // throw new Exception("Couldn't find Transform on BasicSaberModel!"); // var saberParent = (transform.Children.FirstOrDefault(x => x.Object is Transform // && ((x.Object as Transform).GameObject?.Object?.Name?.EndsWith("Saber") ?? false)).Object as Transform); // if (saberParent == null) // throw new Exception("Could not find child transform of BasicSaberModel!"); // return saberParent; //} //private void SwapToSaberID(AssetsManager manager, string saberID) //{ // var file11 = manager.GetAssetsFile(BSConst.KnownFiles.File11); // var newSaber = file11.FindAsset<GameObject>(x => x.Object.Name == $"{saberID}Saber")?.Object; // if (newSaber == null) // throw new Exception($"Saber with ID {saberID} does not exist!"); // var newSaberTransform = newSaber.Components.FirstOrDefault(x => x.Object is Transform).Object as Transform; // if (newSaberTransform == null) // throw new Exception($"Saber with ID {saberID} is missing its parent transform!"); // var basicSaberModel = file11.FindAsset<GameObject>(x => x.Object.Name == "BasicSaberModel"); // if (basicSaberModel == null) // throw new Exception("Couldn't find BasicSaberModel!"); // var transform = basicSaberModel.Object.Components.FirstOrDefault(x => x.Object is Transform)?.Object as Transform; // if (transform == null) // throw new Exception("Couldn't find Transform on BasicSaberModel!"); // var saberChild = transform.Children.FirstOrDefault(x => x.Object.GameObject?.Object?.Name?.EndsWith("Saber")??false); // if (saberChild == null) // throw new Exception("Couldn't find a game object on the BasicSaberModel Transform that ended with -Saber!"); // int saberIndex = transform.Children.IndexOf(saberChild); // saberChild.Object.Father = null; // transform.Children[saberIndex] = newSaberTransform.PtrFrom(transform) as ISmartPtr<Transform>; // newSaberTransform.Father = transform.PtrFrom(newSaberTransform); //} #endregion private BeatSaberQuestomConfig GetConfig() { lock (this) { BeatSaberQuestomConfig config = new BeatSaberQuestomConfig(); var mainPack = GetMainLevelPack(); CustomLevelLoader loader = new CustomLevelLoader(GetSongsAssetsFile(), _config); foreach (var packPtr in mainPack.BeatmapLevelPacks) { var pack = packPtr.Target.Object; if (HideOriginalPlaylists && BSConst.KnownLevelPackIDs.Contains(pack.PackID)) { continue; } var packModel = new BeatSaberPlaylist() { PlaylistName = pack.PackName, PlaylistID = pack.PackID, LevelPackObject = pack }; var collection = pack.BeatmapLevelCollection.Object; foreach (var songPtr in collection.BeatmapLevels) { var songObj = songPtr.Object; var songModel = new BeatSaberSong() { LevelAuthorName = songObj.LevelAuthorName, SongID = songObj.LevelID, SongAuthorName = songObj.SongAuthorName, SongName = songObj.SongName, SongSubName = songObj.SongSubName, LevelData = songObj }; songModel.CoverArtFilename = loader.GetCoverImageFilename(songObj); packModel.SongList.Add(songModel); } config.Playlists.Add(packModel); } return(config); } }
private BeatSaberQuestomConfig GetConfig(AssetsManager manager, bool suppressImages) { BeatSaberQuestomConfig config = new BeatSaberQuestomConfig(); var file19 = manager.GetAssetsFile(BSConst.KnownFiles.MainCollectionAssetsFilename); var file17 = manager.GetAssetsFile(BSConst.KnownFiles.SongsAssetsFilename); var mainPack = GetMainLevelPack(manager); foreach (var packPtr in mainPack.BeatmapLevelPacks) { var pack = packPtr.Target.Object; if (HideOriginalPlaylists && BSConst.KnownLevelPackIDs.Contains(pack.PackID)) { continue; } var packModel = new BeatSaberPlaylist() { PlaylistName = pack.PackName, PlaylistID = pack.PackID, LevelPackObject = pack }; var collection = pack.BeatmapLevelCollection.Object; //get cover art for playlist if (!suppressImages) { try { var coverSprite = pack.CoverImage.Object; var coverTex = coverSprite.Texture.Object; packModel.CoverArt = coverTex.ToBitmap(); packModel.CoverArtBase64PNG = packModel.CoverArt.ToBase64PNG(); } catch (Exception ex) { Log.LogErr($"Unable to convert texture for playlist ID '{pack.PackID}' cover art", ex); } } foreach (var songPtr in collection.BeatmapLevels) { var songObj = songPtr.Object; var songModel = new BeatSaberSong() { LevelAuthorName = songObj.LevelAuthorName, SongID = songObj.LevelID, SongAuthorName = songObj.SongAuthorName, SongName = songObj.SongName, SongSubName = songObj.SongSubName, LevelData = songObj }; if (!suppressImages) { try { var songCover = songObj.CoverImageTexture2D.Object; try { songModel.CoverArt = songCover.ToBitmap(); songModel.CoverArtBase64PNG = songModel.CoverArt.ToBase64PNG(); } catch (Exception ex) { Log.LogErr($"Unable to convert texture for song ID '{songModel.SongID}' cover", ex); } } catch (Exception ex) { Log.LogErr($"Exception loading/converting the cover image for song id '{songObj.LevelID}'", ex); } } packModel.SongList.Add(songModel); } config.Playlists.Add(packModel); } return(config); }
private void UpdatePlaylistConfig(AssetsManager manager, BeatSaberPlaylist playlist) { Log.LogMsg($"Processing playlist ID {playlist.PlaylistID}..."); var songsAssetFile = manager.GetAssetsFile(BSConst.KnownFiles.SongsAssetsFilename); CustomLevelLoader loader = new CustomLevelLoader(songsAssetFile); BeatmapLevelPackObject levelPack = songsAssetFile.FindAsset <BeatmapLevelPackObject>(x => x.Object.PackID == playlist.PlaylistID)?.Object; //create a new level pack if one waasn't found if (levelPack == null) { Log.LogMsg($"Level pack for playlist '{playlist.PlaylistID}' was not found and will be created"); levelPack = new BeatmapLevelPackObject(songsAssetFile) { Enabled = 1, GameObject = null, IsPackAlwaysOwned = true, PackID = playlist.PlaylistID, Name = playlist.PlaylistID + BSConst.NameSuffixes.LevelPack, PackName = playlist.PlaylistName }; songsAssetFile.AddObject(levelPack, true); var col = new BeatmapLevelCollectionObject(songsAssetFile) { Name = playlist.PlaylistID + BSConst.NameSuffixes.LevelCollection }; songsAssetFile.AddObject(col, true); levelPack.BeatmapLevelCollection = col.PtrFrom(levelPack); } playlist.LevelPackObject = levelPack; levelPack.PackName = playlist.PlaylistName ?? levelPack.PackName; if (playlist.CoverArt != null) { Log.LogMsg($"Loading cover art for playlist ID '{playlist.PlaylistID}'"); playlist.CoverArtSprite = loader.LoadPackCover(playlist.PlaylistID, playlist.CoverArt); playlist.LevelPackObject.CoverImage = playlist.CoverArtSprite.PtrFrom(playlist.LevelPackObject); } else { if (playlist.LevelPackObject.CoverImage != null) { playlist.CoverArtSprite = playlist.LevelPackObject.CoverImage.Object; } else { playlist.CoverArtSprite = loader.LoadPackCover(playlist.PlaylistID, null); } playlist.LevelPackObject.CoverImage = playlist.CoverArtSprite.PtrFrom(playlist.LevelPackObject); } //clear out any levels, we'll add them back var levelCollection = levelPack.BeatmapLevelCollection.Object; levelCollection.BeatmapLevels.ForEach(x => x.Dispose()); levelCollection.BeatmapLevels.Clear(); int songCount = 0; Log.LogMsg($"Processing songs for playlist ID {playlist.PlaylistID}..."); var totalSongs = playlist.SongList.Count(); var songMod = Math.Ceiling((double)totalSongs / (double)10); if (songMod < 1) { songMod = 1; } foreach (var song in playlist.SongList.ToList()) { songCount++; if (songCount % songMod == 0) { Console.WriteLine($"{songCount.ToString().PadLeft(5)} of {totalSongs}..."); } if (UpdateSongConfig(manager, song, loader)) { if (levelCollection.BeatmapLevels.Any(x => x.Object.LevelID == song.LevelData.LevelID)) { Log.LogErr($"Playlist ID '{playlist.PlaylistID}' already contains song ID '{song.SongID}' once, removing the second link"); } else { levelCollection.BeatmapLevels.Add(song.LevelData.PtrFrom(levelCollection)); continue; } } playlist.SongList.Remove(song); } Console.WriteLine($"Proccessed {totalSongs} for playlist ID {playlist.PlaylistID}"); }