private static IEnumerator ProcessSongRequest(int index = -1)
        {
            if (FinalRequestQueue.Count > 0)
            {
                SongRequest request = index == -1 ? FinalRequestQueue.First() : FinalRequestQueue.ElementAt(index);
                JSONObject  song    = request.song;
                FinalRequestQueue.Remove(request);
                UpdateRequestButton();

                bool   retried = false;
                string songIndex = song["version"], songName = song["songName"].Value;
                string currentSongDirectory = $"{Environment.CurrentDirectory}\\CustomSongs\\{songIndex}";
                string songHash             = ((string)song["hashMd5"]).ToUpper();
retry:
                CustomLevel[] levels = SongLoader.CustomLevels.Where(l => l.levelID.StartsWith(songHash)).ToArray();
                if (levels.Length == 0)
                {
                    Utilities.EmptyDirectory(".requestcache", false);

                    if (Directory.Exists(currentSongDirectory))
                    {
                        Utilities.EmptyDirectory(currentSongDirectory, true);
                        Plugin.Log($"Deleting {currentSongDirectory}");
                    }

                    string localPath = $"{Environment.CurrentDirectory}\\.requestcache\\{songIndex}.zip";
                    yield return(Utilities.DownloadFile(song["downloadUrl"], localPath));

                    yield return(Utilities.ExtractZip(localPath, currentSongDirectory));

                    yield return(SongListUtils.RefreshSongs(false, false, true));

                    Utilities.EmptyDirectory(".requestcache", true);
                    levels = SongLoader.CustomLevels.Where(l => l.levelID.StartsWith(songHash)).ToArray();
                }
                else
                {
                    Plugin.Log($"Song {songName} already exists!");
                }

                if (levels.Length > 0)
                {
                    Plugin.Log($"Scrolling to level {levels[0].levelID}");
                    if (!SongListUtils.ScrollToLevel(levels[0].levelID) && !retried)
                    {
                        retried = true;
                        goto retry;
                    }
                }
                else
                {
                    Plugin.Log("Failed to find new level!");
                }
                _songRequestMenu.Dismiss();
                SongRequestDequeued?.Invoke(song);
            }
        }
예제 #2
0
        public static void Init()
        {
            if (Instance == null)
            {
                Instance = BeatSaberUI.CreateCustomMenu <CustomMenu>("Online Multiplayer");

                middleViewController = BeatSaberUI.CreateViewController <ListViewController>();


                Instance.SetMainViewController(middleViewController, true, (firstActivation, type) =>
                {
                    refreshAvailableLobbies();
                    if (firstActivation)
                    {
                        middleViewController.CreateText("Available Lobbies", new Vector2(BASE.x + 60f, BASE.y));

                        refresh = middleViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x + 80f, BASE.y + 2.5f), new Vector2(25f, 7f));
                        refresh.SetButtonText("Refresh");
                        refresh.SetButtonTextSize(3f);
                        refresh.ToggleWordWrapping(false);
                        refresh.onClick.AddListener(delegate()
                        {
                            refreshAvailableLobbies();
                        });

                        if (!SteamAPI.isLobbyConnected())
                        {
                            Button host = middleViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x, BASE.y + 2.5f), new Vector2(25f, 7f));
                            host.SetButtonTextSize(3f);
                            host.ToggleWordWrapping(false);

                            host.onClick.RemoveAllListeners();
                            host.SetButtonText("Host Public Lobby");
                            host.onClick.AddListener(delegate()
                            {
                                SteamAPI.CreateLobby(false);
                                Instance.Dismiss();
                                MultiplayerLobby.Instance.Present();
                            });

                            Button hostP = middleViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x, BASE.y + 2.5f - 10f), new Vector2(25f, 7f));
                            hostP.SetButtonTextSize(3f);
                            hostP.ToggleWordWrapping(false);

                            hostP.onClick.RemoveAllListeners();
                            hostP.SetButtonText("Host Private Lobby");
                            hostP.onClick.AddListener(delegate()
                            {
                                SteamAPI.CreateLobby(true);
                                Instance.Dismiss();
                                MultiplayerLobby.Instance.Present();
                            });
                        }
                    }
                });
            }
        }
예제 #3
0
        private void InitConfirmationDialog()
        {
            _confirmationDialog         = BeatSaberUI.CreateCustomMenu <CustomMenu>("Are you sure?");
            _confirmationViewController = BeatSaberUI.CreateViewController <CustomViewController>();

            RectTransform confirmContainer = new GameObject("CustomListContainer", typeof(RectTransform)).transform as RectTransform;

            confirmContainer.SetParent(_confirmationViewController.rectTransform, false);
            confirmContainer.sizeDelta = new Vector2(60f, 0f);

            // Title text
            _warningTitle                    = BeatSaberUI.CreateText(confirmContainer, "", new Vector2(0, 30f));
            _warningTitle.fontSize           = 9f;
            _warningTitle.color              = Color.red;
            _warningTitle.alignment          = TextAlignmentOptions.Center;
            _warningTitle.enableWordWrapping = false;

            // Warning text
            _warningMessage = BeatSaberUI.CreateText(confirmContainer, "", new Vector2(0, 0));
            _warningMessage.rectTransform.sizeDelta = new Vector2(120, 1);
            _warningMessage.fontSize           = 5f;
            _warningMessage.color              = Color.white;
            _warningMessage.alignment          = TextAlignmentOptions.Center;
            _warningMessage.enableWordWrapping = true;

            // Yes button
            _okButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(x => (x.name == "OkButton")), confirmContainer, false);
            _okButton.ToggleWordWrapping(false);
            (_okButton.transform as RectTransform).anchoredPosition = new Vector2(43f, -30f);
            _okButton.SetButtonText("Yes");
            _okButton.onClick.RemoveAllListeners();
            _okButton.onClick.AddListener(delegate()
            {
                _onConfirm?.Invoke();
                _confirmationDialog.Dismiss();
                confirmDialogActive = false;
            });

            // No button
            _cancelButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(x => (x.name == "OkButton")), confirmContainer, false);
            _cancelButton.ToggleWordWrapping(false);
            (_cancelButton.transform as RectTransform).anchoredPosition = new Vector2(18f, -30f);
            _cancelButton.SetButtonText("No");
            _cancelButton.onClick.RemoveAllListeners();
            _cancelButton.onClick.AddListener(delegate()
            {
                _confirmationDialog.Dismiss();
                confirmDialogActive = false;
            });
            _confirmationDialog.SetMainViewController(_confirmationViewController, false);
        }
        private void _SetupDrinkWaterPanel()
        {
            if (_CustomMenu != null && _CustomViewController != null)
            {
                return;
            }

            _CustomMenu                = BeatSaberUI.CreateCustomMenu <CustomMenu>("Drink some cum!");
            _CustomViewController      = BeatSaberUI.CreateViewController <CustomViewController>();
            _CustomViewController.name = "DrinkCumPanel";

            if (_CustomMenu != null && _CustomViewController != null)
            {
                _CustomMenu.SetMainViewController(_CustomViewController, false, (firstActivation, type) =>
                {
                    if (firstActivation && type == VRUI.VRUIViewController.ActivationType.AddedToHierarchy)
                    {
                        _TextContent                    = _CustomViewController.CreateText("", new Vector2(0, 28f));
                        _TextContent.alignment          = TextAlignmentOptions.Center;
                        _TextContent.fontSize           = 5;
                        _TextContent.enableWordWrapping = false;
                        _ContinueButton                 = _CustomViewController.CreateUIButton("CreditsButton", new Vector2(0, -28f), new Vector2(37f, 10f),
                                                                                               null, "I understand!");
                        _ContinueButton.ToggleWordWrapping(false);
                        _ContinueButton.SetButtonTextSize(4);
                        _ContinueButton.onClick.AddListener(delegate() { _CustomMenu.Dismiss(); Destroy(_CustomViewController.gameObject, 1); _CustomMenu = null; _CustomViewController = null; });

                        _RefreshTextContent(_CurrentPanelMode);

                        if (PluginConfig.ShowGIFs)
                        {
                            GameObject go      = new GameObject("[BeatSaberDrinkCum] PreviewGif");
                            _RawImage          = go.AddComponent <RawImage>();
                            _RawImage.material = Instantiate(Resources.FindObjectsOfTypeAll <Material>().Where(m => m.name == "UINoGlow").FirstOrDefault());
                            go.transform.SetParent(_CustomViewController.transform, false);
                            go.GetComponent <RectTransform>().anchoredPosition = new Vector2(0, 0);
                            go.GetComponent <RectTransform>().sizeDelta        = new Vector2(30, 30);
                            _UniGifImage = go.AddComponent <UniGifImage>();
                            UniGifImageAspectController ugiac = go.AddComponent <UniGifImageAspectController>();
                            _UniGifImage.SetPrivateField("m_imgAspectCtrl", ugiac);
                            StartCoroutine(_DisplayGifFromRotation());
                        }
                    }
                });
            }
            else
            {
                Console.WriteLine("[BeatSaberCustomExit.MainMenuUIOverload]: '_CustomMenu' or '_CustomViewController' was null.");
            }
        }
예제 #5
0
        private void HandleMenuSceneLoadedFresh()
        {
            if (_platformMenu == null)
            {
                _platformMenu = BeatSaberUI.CreateCustomMenu <CustomMenu>("Platform Select");
                PlatformListViewController platformListViewController = BeatSaberUI.CreateViewController <PlatformListViewController>();
                platformListViewController.backButtonPressed += delegate() { _platformMenu.Dismiss(); };
                _platformMenu.SetMainViewController(platformListViewController, true);
                platformListViewController.DidSelectRowEvent += delegate(TableView view, int row) { PlatformManager.Instance.ChangeToPlatform(row); };
            }

            MenuButtonUI.AddButton("Platforms", delegate() { _platformMenu.Present(); });

            CreateSettingsUI();
        }
예제 #6
0
        public void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
        {
            if (scene.name == "MenuCore")
            {
                if (_notesMenu == null)
                {
                    _notesMenu = BeatSaberUI.CreateCustomMenu <CustomMenu>("Custom Notes");
                    UI.NoteListViewController noteListViewController = BeatSaberUI.CreateViewController <UI.NoteListViewController>();
                    noteListViewController.backButtonPressed += delegate() { _notesMenu.Dismiss(); };
                    _notesMenu.SetMainViewController(noteListViewController, true);
                    noteListViewController.DidSelectRowEvent += delegate(TableView view, int row) { selectedNote = row; };
                }

                CustomUI.MenuButton.MenuButtonUI.AddButton("CustomNotes", delegate() { _notesMenu.Present(); });
            }
        }
예제 #7
0
        internal static void CreateMenu()
        {
            if (SaberForgeMenu == null)
            {
                SaberForgeMenu = BeatSaberUI.CreateCustomMenu <CustomMenu>("Saber Forge");

                //create views
                mainViewController  = BeatSaberUI.CreateViewController <MainViewController>();
                rightViewController = BeatSaberUI.CreateViewController <RightViewController>();
                leftViewController  = BeatSaberUI.CreateViewController <LeftViewController>();

                //set back button
                mainViewController.backButtonPressed += delegate()
                {
                    SaberForgeMenu.Dismiss();
                };

                //set view positions
                SaberForgeMenu.SetMainViewController(mainViewController, true);
                SaberForgeMenu.SetRightViewController(rightViewController, false);
                SaberForgeMenu.SetLeftViewController(leftViewController, false);
            }

            if (HelpMenu == null)
            {
                HelpMenu = BeatSaberUI.CreateCustomMenu <CustomMenu>("Saber Forge Help");

                HelpMainViewController  helpMainViewController  = BeatSaberUI.CreateViewController <HelpMainViewController>();
                HelpRightViewController helpRightViewController = BeatSaberUI.CreateViewController <HelpRightViewController>();
                HelpLeftViewController  helpLeftViewController  = BeatSaberUI.CreateViewController <HelpLeftViewController>();

                //set back button
                helpMainViewController.backButtonPressed += delegate()
                {
                    HelpMenu.Dismiss(); rightViewController.ForceSliders(); leftViewController.ForceSliders();;
                };

                //set view positions
                HelpMenu.SetMainViewController(helpMainViewController, true);
                HelpMenu.SetRightViewController(helpRightViewController, false);
                HelpMenu.SetLeftViewController(helpLeftViewController, false);
            }

            MenuButtonUI.AddButton("Saber Forge", delegate() { SaberForgeMenu.Present(); rightViewController.ForceSliders(); leftViewController.ForceSliders(); });
        }
예제 #8
0
        /// <summary>
        /// Set up the UI components for the Tag System
        /// </summary>
        /// <returns>yields for the Coroutine system</returns>
        private IEnumerator _SetupUI()
        {
            if (!Initialized)
            {
                _ButtonTags = new Dictionary <Button, bool>();

                _CustomMenu           = BeatSaberUI.CreateCustomMenu <CustomMenu>("Tags");
                _CustomViewController = BeatSaberUI.CreateViewController <CustomViewController>();
                _TagNames             = new string[] { "Flow", "Streams", "Inventive Patterns",
                                                       "Meme", "Jump Streams", "Beautiful Lighting", "Vision Blocks",
                                                       "Bad Walls", "Overstated Difficulty", "Ugly", "Useless", "Entertaining", "Impossible" };
                _CustomMenu.SetLeftViewController(_CustomViewController, false, (firstActivation, type) =>
                {
                    if (firstActivation && type == VRUI.VRUIViewController.ActivationType.AddedToHierarchy)
                    {
                        _TopTagLabel           = _CustomViewController.CreateText("Tags", new Vector2(2f, 32.5f));
                        _TopTagLabel.fontSize  = 5f;
                        _TopTagLabel.alignment = TextAlignmentOptions.Center;
                        _GenerateButtonTags(_CustomViewController, _TagNames, new Vector2(12.5f, 6.25f), new Vector2(0, 12f), new Vector2(10f, 8.5f), 2f);
                        _CloseButton = _CustomViewController.CreateUIButton("CreditsButton",
                                                                            new Vector2(43f, 31.5f),
                                                                            new Vector2(20f, 8f),
                                                                            () => { _CustomMenu.Dismiss(); },
                                                                            "Close");
                        _CloseButton.SetButtonTextSize(3f);
                        _CloseButton.ToggleWordWrapping(false);

                        _OKResultButton = _ResultViewController.GetComponentsInChildren <Button>().First(x => x.name == "Ok");
                        _OKResultButton.onClick.AddListener(_OKResultButtonClicked);
                    }
                });

                yield return(new WaitUntil(() => { return _CustomMenu.Present(false); }));

                _CustomMenu.Present();

                IsInitializing = false;
                Initialized    = true;
            }
        }
예제 #9
0
 public static void refreshLobbyList()
 {
     availableLobbies.Clear();
     middleViewController.Data.Clear();
     try
     {
         Dictionary <ulong, LobbyInfo> lobbies = SteamAPI.LobbyData;
         foreach (KeyValuePair <ulong, LobbyInfo> entry in lobbies)
         {
             LobbyInfo info = SteamAPI.LobbyData[entry.Key];
             availableLobbies.Add(entry.Key, info.Joinable);
             middleViewController.Data.Add(new CustomCellInfo($"{(info.Joinable && info.TotalSlots - info.UsedSlots > 0 ? "":"[LOCKED]")}[{info.UsedSlots}/{info.TotalSlots}] {info.HostName}'s Lobby", $"{info.Status}"));
         }
     }
     catch (Exception e)
     {
         Logger.Error(e);
     }
     middleViewController._customListTableView.ReloadData();
     middleViewController._customListTableView.ScrollToRow(0, false);
     middleViewController.DidSelectRowEvent = (TableView view, int row) =>
     {
         ulong     clickedID = availableLobbies.Keys.ToArray()[row];
         LobbyInfo info      = SteamAPI.LobbyData[clickedID];
         if (clickedID != 0 && availableLobbies.Values.ToArray()[row] && info.TotalSlots - info.UsedSlots > 0)
         {
             Scoreboard.Instance.UpsertScoreboardEntry(Controllers.PlayerController.Instance._playerInfo.playerId, Controllers.PlayerController.Instance._playerInfo.playerName);
             Instance.Dismiss();
             MultiplayerLobby.Instance.Present();
             SteamAPI.JoinLobby(new CSteamID(clickedID));
         }
     };
     if (refresh)
     {
         refresh.interactable = true;
     }
 }
예제 #10
0
        public static void Init()
        {
            if (Instance == null)
            {
                try
                {
                    Instance = BeatSaberUI.CreateCustomMenu <CustomMenu>("Multiplayer Lobby");

                    CustomViewController middleViewController = BeatSaberUI.CreateViewController <CustomViewController>();
                    ListViewController   leftViewController   = BeatSaberUI.CreateViewController <ListViewController>();
                    rightViewController = BeatSaberUI.CreateViewController <TableViewController>();

                    Instance.SetMainViewController(middleViewController, true, (firstActivation, type) =>
                    {
                        if (firstActivation)
                        {
                            try
                            {
                                Button host = middleViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x, BASE.y + 2.5f), new Vector2(25f, 7f));
                                host.SetButtonTextSize(3f);
                                host.ToggleWordWrapping(false);
                                host.SetButtonText("Disconnect");
                                host.onClick.AddListener(delegate
                                {
                                    try
                                    {
                                        SteamAPI.Disconnect();
                                        Instance.Dismiss();
                                        MultiplayerListing.Instance.Present();
                                    }
                                    catch (Exception e)
                                    {
                                        Logger.Error(e);
                                    }
                                });
                                float offs = 0;
                                offs      += 10f;
                                Button vc  = middleViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x, BASE.y + 2.5f - offs), new Vector2(25f, 7f));
                                vc.SetButtonTextSize(3f);
                                vc.ToggleWordWrapping(false);
                                vc.SetButtonText(Controllers.PlayerController.Instance.VoipEnabled ? "Disable Voice Chat" : "Enable Voice Chat");
                                vc.onClick.AddListener(delegate
                                {
                                    try
                                    {
                                        if (!Controllers.PlayerController.Instance.VoipEnabled)
                                        {
                                            vc.SetButtonText("Disable Voice Chat");
                                            Controllers.PlayerController.Instance.VoipEnabled = true;
                                            SteamUser.StartVoiceRecording();
                                        }
                                        else
                                        {
                                            vc.SetButtonText("Enable Voice Chat");
                                            Controllers.PlayerController.Instance.VoipEnabled = false;
                                            SteamUser.StopVoiceRecording();
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        Logger.Error(e);
                                    }
                                });
                                var t        = middleViewController.CreateText("You can use Online Lobby in the Main Menu to choose songs for your lobby. \n\nYou can also control all the default Game Modifiers for the lobby through the Online Lobby Menu as well.", new Vector2(0, BASE.y - 10f));
                                var tt       = middleViewController.CreateText("If something goes wrong, click the disconnect button above and just reconnect to the lobby.", new Vector2(0, 0 - BASE.y));
                                t.alignment  = TMPro.TextAlignmentOptions.Center;
                                tt.alignment = TMPro.TextAlignmentOptions.Center;
                            } catch (Exception e)
                            {
                                Data.Logger.Error(e);
                            }

                            /*   Button g = middleViewController.CreateUIButton("CreditsButton", new Vector2(0, 0), new Vector2(25f, 25f));
                             * g.SetButtonTextSize(7f);
                             * g.ToggleWordWrapping(false);
                             * g.SetButtonText("Select a Song");
                             * g.onClick.AddListener(delegate {
                             *     try
                             *     {
                             *         if (SteamAPI.IsHost())
                             *         {
                             *             SteamAPI.SetSong("112D7FA45FA06F36FF41029099E95B98", "TaKillYa");
                             *             SteamAPI.SetDifficulty((byte)2);
                             *             SteamAPI.RequestPlay(new GameplayModifiers(new GameplayModifiers()));
                             *         }
                             *     }
                             *     catch (Exception e)
                             *     {
                             *         Logger.Error(e);
                             *     }
                             * });*/
                        }
                    });
                    Instance.SetLeftViewController(leftViewController, false, (firstActivation, type) =>
                    {
                        if (firstActivation)
                        {
                            refreshFriendsList(leftViewController);
                            leftViewController.CreateText("Invite Friends", new Vector2(BASE.x + 62.5f, BASE.y));

                            Button b = leftViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x + 80f, BASE.y + 2.5f), new Vector2(25f, 7f));
                            b.SetButtonText("Refresh");
                            b.SetButtonTextSize(3f);
                            b.ToggleWordWrapping(false);
                            b.onClick.AddListener(delegate()
                            {
                                refreshFriendsList(leftViewController);
                            });


                            invite = leftViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x + 80f, 0 - BASE.y + 2.5f), new Vector2(25f, 7f));
                            invite.SetButtonText("Invite");
                            invite.SetButtonTextSize(3f);
                            invite.ToggleWordWrapping(false);
                            invite.interactable = false;
                            invite.onClick.AddListener(delegate()
                            {
                                if (selectedPlayer > 0)
                                {
                                    SteamAPI.InviteUserToLobby(new CSteamID(selectedPlayer));
                                }
                            });
                        }
                    });
                    Instance.SetRightViewController(rightViewController, false, (active, type) => {
                        if (active)
                        {
                            rightViewController.CreateText("Lobby Leaderboard", new Vector2(BASE.x + 62.5f, BASE.y));
                        }
                        RefreshScores();
                    });
                } catch (Exception e)
                {
                    Data.Logger.Error(e);
                }
            }
        }
예제 #11
0
        private void _SetupConfirmQuitPanel()
        {
            _CustomMenu           = BeatSaberUI.CreateCustomMenu <CustomMenu>("Quit");
            _CustomViewController = BeatSaberUI.CreateViewController <CustomViewController>();

            if (_CustomMenu != null && _CustomViewController != null)
            {
                _CustomViewController.didDeactivateEvent += (deactivationType) => { ConfirmExitDialogOpened = false; };
                _CustomMenu.SetMainViewController(_CustomViewController, false, (firstActivation, type) =>
                {
                    if (firstActivation && type == VRUI.VRUIViewController.ActivationType.AddedToHierarchy)
                    {
                        _TopText = _CustomViewController.CreateText(PluginConfig.QuitTextContent, new Vector2(0, 10f), new Vector2(105f, 10));
                        if (_TopText != null)
                        {
                            _TopText.alignment = TMPro.TextAlignmentOptions.Center;
                            _TopText.fontSize  = 6;
                        }
                        else
                        {
                            Console.WriteLine("[BeatSaberCustomExit.MainMenuUIOverload]: 'topText' was null.");
                        }

                        _CancelButton = _CustomViewController.CreateUIButton("CreditsButton", new Vector2(-20f, -20f), new Vector2(30f, 10f),
                                                                             delegate() { _CustomMenu.Dismiss(); }, "Cancel");
                        _ConfirmButton = _CustomViewController.CreateUIButton("CreditsButton", new Vector2(20, -20f), new Vector2(30f, 10f),
                                                                              delegate() { Plugin.QuitGame(); }, "Quit");
                        if (_CancelButton != null)
                        {
                            _CancelButton.ToggleWordWrapping(false);
                        }
                        else
                        {
                            Console.WriteLine("[BeatSaberCustomExit.MainMenuUIOverload]: 'buttonCancel' was null.");
                        }

                        if (_ConfirmButton != null)
                        {
                            _ConfirmButton.ToggleWordWrapping(false);
                        }
                        else
                        {
                            Console.WriteLine("[BeatSaberCustomExit.MainMenuUIOverload]: 'buttonConfirm' was null.");
                        }
                    }
                });
            }
            else
            {
                Console.WriteLine("[BeatSaberCustomExit.MainMenuUIOverload]: '_CustomMenu' or '_CustomViewController' was null.");
            }
        }
예제 #12
0
        private static IEnumerator ProcessSongRequest(int index, bool fromHistory = false)
        {
            if ((RequestQueue.Songs.Count > 0 && !fromHistory) || (RequestHistory.Songs.Count > 0 && fromHistory))
            {
                SongRequest request = null;
                if (!fromHistory)
                {
                    SetRequestStatus(index, RequestStatus.Played);
                    request = DequeueRequest(index);
                }
                else
                {
                    request = RequestHistory.Songs.ElementAt(index);
                }

                if (request == null)
                {
                    Plugin.Log("Can't process a null request! Aborting!");
                    yield break;
                }
                else
                {
                    Plugin.Log($"Processing song request {request.song["songName"].Value}");
                }


                string songName  = request.song["songName"].Value;
                string songIndex = $"{request.song["id"].Value} ({request.song["songName"].Value} - {request.song["levelAuthor"].Value})";
                songIndex = normalize.RemoveDirectorySymbols(ref songIndex); // Remove invalid characters.

                string currentSongDirectory = Path.Combine(Environment.CurrentDirectory, "Beat Saber_Data\\CustomLevels", songIndex);
                string songHash             = request.song["hash"].Value.ToUpper();


                // Check to see if level exists, download if not.

                // Replace with level check.
                //CustomLevel[] levels = SongLoader.CustomLevels.Where(l => l.levelID.StartsWith(songHash)).ToArray();
                //if (levels.Length == 0)

                var  rat       = SongCore.Collections.levelIDsForHash(songHash);
                bool mapexists = (rat.Count > 0) && (rat[0] != "");


                if (!SongCore.Loader.CustomLevels.ContainsKey(currentSongDirectory) && !mapexists)
                {
                    Utilities.EmptyDirectory(".requestcache", false);


                    //SongMap map;
                    //if (MapDatabase.MapLibrary.TryGetValue(songIndex, out map))
                    //{
                    //    if (map.path != "")
                    //    {
                    //        songIndex = map.song["version"].Value;
                    //        songName = map.song["songName"].Value;
                    //        currentSongDirectory = Path.Combine(Environment.CurrentDirectory, "CustomSongs", songIndex);
                    //        songHash = map.song["hashMd5"].Value.ToUpper();

                    //        Directory.CreateDirectory(currentSongDirectory);
                    //        // HACK to allow playing alternate songs not in custom song directory
                    //        CopyFilesRecursively(new DirectoryInfo(map.path),new DirectoryInfo( currentSongDirectory));

                    //        goto here;
                    //    }
                    //}

                    //Plugin.Log("Downloading");

                    if (Directory.Exists(currentSongDirectory))
                    {
                        Utilities.EmptyDirectory(currentSongDirectory, true);
                        Plugin.Log($"Deleting {currentSongDirectory}");
                    }

                    string localPath = Path.Combine(Environment.CurrentDirectory, ".requestcache", $"{request.song["id"].Value}.zip");
                    //string dl = $"https://beatsaver.com {request.song["downloadURL"].Value}";
                    //Instance.QueueChatMessage($"Download url: {dl}, {request.song}");

                    yield return(Utilities.DownloadFile($"https://beatsaver.com{request.song["downloadURL"].Value}", localPath));

                    yield return(Utilities.ExtractZip(localPath, currentSongDirectory));

here:

                    yield return(new WaitUntil(() => SongCore.Loader.AreSongsLoaded && !SongCore.Loader.AreSongsLoading));

                    Loader.Instance.RefreshSongs();
                    yield return(new WaitUntil(() => SongCore.Loader.AreSongsLoaded && !SongCore.Loader.AreSongsLoading));

                    Utilities.EmptyDirectory(".requestcache", true);
                    //levels = SongLoader.CustomLevels.Where(l => l.levelID.StartsWith(songHash)).ToArray();
                }
                else
                {
                    //Instance.QueueChatMessage($"Directory exists: {currentSongDirectory}");

                    Plugin.Log($"Song {songName} already exists!");
                }

                // Dismiss the song request viewcontroller now
                _songRequestMenu.Dismiss();

                if (true)
                {
                    //Plugin.Log($"Scrolling to level {levels[0].levelID}");

                    bool success = false;
                    yield return(SongListUtils.ScrollToLevel(request.song["hash"].Value.ToUpper(), (s) => success = s, false));

                    yield return(null);

                    // Redownload the song if we failed to scroll to it
                }
                else
                {
                    Plugin.Log("Failed to find new level!");
                }

                if (!request.song.IsNull)
                {
                    new DynamicText().AddUser(ref request.requestor).AddSong(request.song).QueueMessage(NextSonglink.ToString());                       // Display next song message
                }
                #if UNRELEASED
                if (!request.song.IsNull) // Experimental!
                {
                    TwitchWebSocketClient.SendCommand("/marker " + new DynamicText().AddUser(ref request.requestor).AddSong(request.song).Parse(NextSonglink.ToString()));
                }
                #endif
            }
        }
예제 #13
0
 /// <summary>
 /// Event triggered when the "OK" button from the result screen is clicked
 /// </summary>
 private void _OKResultButtonClicked()
 {
     _CustomMenu.Dismiss();
     _OKResultButton.onClick.RemoveListener(_OKResultButtonClicked);
 }
예제 #14
0
        public static void Init()
        {
            if (Instance == null)
            {
                try
                {
                    Instance = BeatSaberUI.CreateCustomMenu <CustomMenu>("Multiplayer Lobby");

                    CustomViewController middleViewController = BeatSaberUI.CreateViewController <CustomViewController>();
                    ListViewController   leftViewController   = BeatSaberUI.CreateViewController <ListViewController>();
                    rightViewController = BeatSaberUI.CreateViewController <TableViewController>();

                    Instance.SetMainViewController(middleViewController, true, (firstActivation, type) =>
                    {
                        if (firstActivation)
                        {
                            try
                            {
                                Button host = middleViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x, BASE.y + 2.5f), new Vector2(25f, 7f));
                                host.SetButtonTextSize(3f);
                                host.ToggleWordWrapping(false);
                                host.SetButtonText("Disconnect");
                                host.onClick.AddListener(delegate
                                {
                                    try
                                    {
                                        SteamAPI.Disconnect();
                                        Instance.Dismiss();
                                        MultiplayerListing.Instance.Present();
                                    }
                                    catch (Exception e)
                                    {
                                        Logger.Error(e);
                                    }
                                });
                                float offs = 0;
                                offs      += 10f;
                                Button vc  = middleViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x, BASE.y + 2.5f - offs), new Vector2(25f, 7f));
                                vc.SetButtonTextSize(3f);
                                vc.ToggleWordWrapping(false);
                                vc.SetButtonText(VoiceChatWorker.VoipEnabled ? "Disable Voice Chat" : "Enable Voice Chat");
                                vc.onClick.AddListener(delegate
                                {
                                    try
                                    {
                                        if (!VoiceChatWorker.VoipEnabled)
                                        {
                                            vc.SetButtonText("Disable Voice Chat");
                                            VoiceChatWorker.VoipEnabled = true;
                                            SteamUser.StartVoiceRecording();
                                        }
                                        else
                                        {
                                            vc.SetButtonText("Enable Voice Chat");
                                            VoiceChatWorker.VoipEnabled = false;
                                            SteamUser.StopVoiceRecording();
                                        }
                                    }
                                    catch (Exception e)
                                    {
                                        Logger.Error(e);
                                    }
                                });
                                offs  += 10f;
                                rejoin = middleViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x, BASE.y + 2.5f - offs), new Vector2(25f, 7f));
                                rejoin.SetButtonTextSize(3f);
                                rejoin.ToggleWordWrapping(false);
                                rejoin.SetButtonText("Re-Join Song");
                                rejoin.interactable = false;
                                rejoin.onClick.AddListener(delegate
                                {
                                    if (SteamAPI.GetLobbyData().Screen == LobbyPacket.SCREEN_TYPE.IN_GAME && SteamAPI.GetLobbyData().CurrentSongOffset > 0f)
                                    {
                                        WaitingMenu.autoReady             = true;
                                        WaitingMenu.timeRequestedToLaunch = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeSeconds();
                                        WaitingMenu.Instance.Present();
                                    }
                                });
                                bodyText           = middleViewController.CreateText("You can use Online Lobby in the Main Menu to choose songs for your lobby. \n\nYou can also control all the default Game Modifiers for the lobby through the Online Lobby Menu as well.", new Vector2(0, BASE.y - 10f));
                                var tt             = middleViewController.CreateText("If something goes wrong, click the disconnect button above and just reconnect to the lobby.", new Vector2(0, 0 - BASE.y));
                                bodyText.alignment = TMPro.TextAlignmentOptions.Center;
                                tt.alignment       = TMPro.TextAlignmentOptions.Center;
                            } catch (Exception e)
                            {
                                Logger.Error(e);
                            }
                        }
                    });
                    Instance.SetLeftViewController(leftViewController, false, (firstActivation, type) =>
                    {
                        if (firstActivation)
                        {
                            refreshFriendsList(leftViewController);
                            leftViewController.CreateText("Invite Friends", new Vector2(BASE.x + 62.5f, BASE.y));

                            Button b = leftViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x + 80f, BASE.y + 2.5f), new Vector2(25f, 7f));
                            b.SetButtonText("Refresh");
                            b.SetButtonTextSize(3f);
                            b.ToggleWordWrapping(false);
                            b.onClick.AddListener(delegate()
                            {
                                refreshFriendsList(leftViewController);
                            });


                            invite = leftViewController.CreateUIButton("CreditsButton", new Vector2(BASE.x + 80f, 0 - BASE.y + 2.5f), new Vector2(25f, 7f));
                            invite.SetButtonText("Invite");
                            invite.SetButtonTextSize(3f);
                            invite.ToggleWordWrapping(false);
                            invite.interactable = false;
                            invite.onClick.AddListener(delegate()
                            {
                                if (selectedPlayer > 0)
                                {
                                    SteamAPI.InviteUserToLobby(new CSteamID(selectedPlayer));
                                }
                            });
                        }
                    });
                    Instance.SetRightViewController(rightViewController, false, (firstActivation, type) => {
                        if (firstActivation)
                        {
                            rightViewController.CreateText("Lobby Leaderboard", new Vector2(BASE.x + 62.5f, BASE.y));
                        }
                        RefreshScores();
                    });
                } catch (Exception e)
                {
                    Logger.Error(e);
                }
            }
        }
예제 #15
0
        public void Initialize(CustomMenu customMenu, Color color)
        {
            RectTransform colorContainer = new GameObject("ColorPickerContainer", typeof(RectTransform)).transform as RectTransform;

            colorContainer.SetParent(customMenu.mainViewController.rectTransform, false);
            colorContainer.sizeDelta = new Vector2(60f, 0f);

            //ColorPickerPreview initialization
            ColorPickerPreview = new GameObject("ColorPickerPreview").AddComponent <ColorPickerPreview>();
            if (ColorPickerPreview != null)
            {
                ColorPickerPreview.transform.SetParent(colorContainer, false);
                (ColorPickerPreview.transform as RectTransform).sizeDelta     = new Vector2(8.5f, 8.5f);
                (ColorPickerPreview.transform as RectTransform).localPosition = new Vector3(55f, -20, 0);
                TextMeshProUGUI previewText = BeatSaberUI.CreateText(colorContainer, "Preview", new Vector2(0, 0), new Vector2(0, 0));
                previewText.enableWordWrapping     = false;
                previewText.rectTransform.position = ColorPickerPreview.transform.TransformPoint(new Vector3(-previewText.preferredWidth * 1.5f - 2f, 2.5f, 0));
            }
            else
            {
                Console.WriteLine("[BeatSaberCustomUI.ColorPicker]: The 'ColorPickerPreview' instance was null.");
            }
            //ColorPickerCore initialization
            ColorPickerCore = new GameObject("ColorPickerCore").AddComponent <ColorPickerCore>();
            if (ColorPickerCore != null)
            {
                ColorPickerCore.ColorPickerPreview = ColorPickerPreview;
                ColorPickerCore.Initialize(SetPreviewColor);
                ColorPickerCore.transform.SetParent(transform, false);
                (ColorPickerCore.transform as RectTransform).sizeDelta     = new Vector2(60, 60);
                (ColorPickerCore.transform as RectTransform).localPosition = new Vector3(0, 15f);
            }
            else
            {
                Console.WriteLine("[BeatSaberCustomUI.ColorPicker]: The 'ColorPickerCore' instance was null.");
            }

            var previewImg = ColorPickerPreview.ImagePreview;

            _sliderR = BeatSaberUI.CreateUISlider(transform, 0, 3000, 1, true, (val) =>
            {
                previewImg.color = new Color(val / 255f, _currentColor.g, _currentColor.b, _currentColor.a);
                _currentColor    = previewImg.color;
            });
            (_sliderR.Scrollbar.transform as RectTransform).sizeDelta     = new Vector2(60f, 4.5f);
            (_sliderR.Scrollbar.transform as RectTransform).localPosition = new Vector3(70f, 28, 0);
            TextMeshProUGUI rText = BeatSaberUI.CreateText(colorContainer, "R", new Vector2(0, 0), new Vector2(0, 0));

            rText.rectTransform.position = _sliderR.Scrollbar.transform.TransformPoint(new Vector3(-34, 3.74f, 0));

            _sliderG = BeatSaberUI.CreateUISlider(transform, 0, 3000, 1, true, (val) =>
            {
                previewImg.color = new Color(_currentColor.r, val / 255f, _currentColor.b, _currentColor.a);
                _currentColor    = previewImg.color;
            });
            (_sliderG.Scrollbar.transform as RectTransform).sizeDelta     = new Vector2(60f, 4.5f);
            (_sliderG.Scrollbar.transform as RectTransform).localPosition = new Vector3(70f, 20, 0);
            TextMeshProUGUI gText = BeatSaberUI.CreateText(colorContainer, "G", new Vector2(0, 0), new Vector2(0, 0));

            gText.rectTransform.position = _sliderG.Scrollbar.transform.TransformPoint(new Vector3(-34, 3.74f, 0));

            _sliderB = BeatSaberUI.CreateUISlider(transform, 0, 3000, 1, true, (val) =>
            {
                previewImg.color = new Color(_currentColor.r, _currentColor.g, val / 255f, _currentColor.a);
                _currentColor    = previewImg.color;
            });
            (_sliderB.Scrollbar.transform as RectTransform).sizeDelta     = new Vector2(60f, 4.5f);
            (_sliderB.Scrollbar.transform as RectTransform).localPosition = new Vector3(70f, 12, 0);
            TextMeshProUGUI bText = BeatSaberUI.CreateText(colorContainer, "B", new Vector2(0, 0), new Vector2(0, 0));

            bText.rectTransform.position = _sliderB.Scrollbar.transform.TransformPoint(new Vector3(-34, 3.74f, 0));

            _sliderA = BeatSaberUI.CreateUISlider(transform, 0, 255, 1, true, (val) =>
            {
                previewImg.color = new Color(_currentColor.r, _currentColor.g, _currentColor.b, val / 255f);
                _currentColor    = previewImg.color;
            });
            (_sliderA.Scrollbar.transform as RectTransform).sizeDelta     = new Vector2(60f, 4.5f);
            (_sliderA.Scrollbar.transform as RectTransform).localPosition = new Vector3(70f, 4, 0);
            TextMeshProUGUI aText = BeatSaberUI.CreateText(colorContainer, "A", new Vector2(0, 0), new Vector2(0, 0));

            aText.rectTransform.position = _sliderA.Scrollbar.transform.TransformPoint(new Vector3(-34, 3.74f, 0));

            // Ok button
            _okButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(x => (x.name == "QuitButton")), colorContainer, false);
            _okButton.ToggleWordWrapping(false);
            (_okButton.transform as RectTransform).anchoredPosition = new Vector2(40f, -30f);
            _okButton.SetButtonText("Ok");
            _okButton.onClick.RemoveAllListeners();
            _okButton.onClick.AddListener(delegate()
            {
                customMenu.Dismiss();
            });

            // Cancel button
            _cancelButton = Instantiate(Resources.FindObjectsOfTypeAll <Button>().First(x => (x.name == "QuitButton")), colorContainer, false);
            _cancelButton.ToggleWordWrapping(false);
            (_cancelButton.transform as RectTransform).anchoredPosition = new Vector2(15f, -30f);
            _cancelButton.SetButtonText("Cancel");
            _cancelButton.onClick.RemoveAllListeners();
            _cancelButton.onClick.AddListener(delegate()
            {
                SetPreviewColor(_originalColor);
                customMenu.Dismiss();
            });

            SetPreviewColor(color);
        }