Пример #1
0
        private void SceneManagerOnSceneLoaded(Scene newScene, LoadSceneMode mode)
        {
            if (newScene.name == MenuSceneName)
            {
                //Menu scene loaded
                Presence.details        = "In Menu";
                Presence.state          = string.Empty;
                Presence.startTimestamp = default(long);
                Presence.largeImageKey  = "default";
                Presence.largeImageText = "Beat Saber";
                Presence.smallImageKey  = "solo";
                Presence.smallImageText = "Solo Standard";
                DiscordRpc.UpdatePresence(Presence);
            }
            else if (newScene.name == GameSceneName)
            {
                _mainSetupData = Resources.FindObjectsOfTypeAll <MainGameSceneSetupData>().FirstOrDefault();
                if (_mainSetupData == null)
                {
                    Console.WriteLine("Discord Presence: Error finding the scriptable objects required to update presence.");
                    return;
                }
                //Main game scene loaded;

                var diff  = _mainSetupData.difficultyLevel;
                var level = diff.level;

                Presence.details = $"{level.songName} | {diff.difficulty.Name()}";
                Presence.state   = "";
                if (level.levelID.Contains('∎'))
                {
                    Presence.state = "Custom | ";
                }

                var gameplayModeText = GetGameplayModeName(_mainSetupData.gameplayMode);
                Presence.state += gameplayModeText;
                if (_mainSetupData.gameplayOptions.noEnergy)
                {
                    Presence.state += " [No Fail]";
                }

                if (_mainSetupData.gameplayOptions.mirror)
                {
                    Presence.state += " [Mirrored]";
                }

                Presence.largeImageKey  = "default";
                Presence.largeImageText = "Beat Saber";
                Presence.smallImageKey  = GetGameplayModeImage(_mainSetupData.gameplayMode);
                Presence.smallImageText = gameplayModeText;
                Presence.startTimestamp = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
                DiscordRpc.UpdatePresence(Presence);
            }
        }
Пример #2
0
        public void OnApplicationStart()
        {
            logger.Info("Looking for BeatSaberMultiplayer");
            PluginLoader.PluginInfo beatsabermultiplayer = PluginManager.GetPluginFromId("BeatSaberMultiplayer");
            if (beatsabermultiplayer != null)
            {
                Type multiplayerClientType = beatsabermultiplayer.Metadata.Assembly.GetType("BeatSaberMultiplayer.Client");
                if (multiplayerClientType != null)
                {
                    clientInstanceField       = multiplayerClientType.GetField("instance", (BindingFlags)(-1));
                    clientInstanceInroomField = multiplayerClientType.GetField("inRoom", (BindingFlags)(-1));
                    logger.Info("BeatSaberMultiplayer found and linked.");
                }
                else
                {
                    logger.Warn("Found BeatSaberMultiplayer, but not type BeatSaberMultiplayer.Client. Multiplayer won't be shown on discord.");
                }
            }
            logger.Info("Looking for YURFit (IPA)");
#pragma warning disable CS0618
            IPlugin yurfit = PluginManager.Plugins.FirstOrDefault((IPlugin x) => x.Name == "YURfitMod");
            if (yurfit != null)
            {
                Type yurpresence = yurfit.GetType().Assembly.GetType("YURfitMod.RPC.YURpresence");
                if (yurpresence != null)
                {
                    harmonyInstance.Patch(yurpresence.GetMethod("Awake", (BindingFlags)(-1)), GetVoidPatch(), null, null);
                    harmonyInstance.Patch(yurpresence.GetMethod("Menu", (BindingFlags)(-1)), GetVoidPatch(), null, null);
                    logger.Info("YURFit found as IPA Plugin and patched.");
                }
                else
                {
                    logger.Warn("Found YURFit as IPA Plugin, but not type YURfitMod.RPC.YURpresence. There may be some conflivts between the two mods.");
                }
            }
            //Menu scene loaded
            Presence.details        = "In Menu";
            Presence.state          = string.Empty;
            Presence.startTimestamp = default(long);
            Presence.largeImageKey  = "default";
            Presence.largeImageText = "Beat Saber";
            Presence.smallImageKey  = "";
            Presence.smallImageText = "";
            DiscordRpc.UpdatePresence(Presence);
#pragma warning restore CS0618
        }
Пример #3
0
 private void UpdatePresence(Scene newScene)
 {
     if (newScene.name == MenuSceneName)
     {
         //Menu scene loaded
         Presence.details        = "In Menu";
         Presence.state          = string.Empty;
         Presence.startTimestamp = default(long);
         Presence.largeImageKey  = "default";
         Presence.largeImageText = "Beat Saber";
         Presence.smallImageKey  = "";
         Presence.smallImageText = "";
         DiscordRpc.UpdatePresence(Presence);
     }
     else if (newScene.name == GameSceneName)
     {
         gameObject.StartCoroutine(UpdatePresenceAfterFrame());
     }
 }
Пример #4
0
        private void updatePresence(Scene newScene)
        {
            switch (newScene.name)
            {
            case MenuSceneName:
                //Menu scene loaded
                Presence.details        = "In Main Menu";
                Presence.state          = string.Empty;
                Presence.startTimestamp = default;
                Presence.largeImageKey  = "default";
                Presence.largeImageText = "Beat Saber";
                Presence.smallImageKey  = "";
                Presence.smallImageText = "";
                DiscordRpc.UpdatePresence(Presence);
                break;

            case GameSceneName:
                gameObject.StartCoroutine(updatePresenceAfterFrame());
                Presence.details        = _gameplaySetup.difficultyBeatmap.level.songName;
                Presence.state          = gameObject.enabled ? "Playing" : "Paused";
                Presence.startTimestamp = DateTime.Now.ToUnixTime();
                Presence.largeImageKey  = "solo";
                Presence.largeImageText = "Beat Saber";
                Presence.smallImageKey  = "";
                Presence.smallImageText = "";
                DiscordRpc.UpdatePresence(Presence);
                break;

            default:
                gameObject.StartCoroutine(updatePresenceAfterFrame());
                Presence.details = newScene.name;
                //Presence.details = _gameplaySetup.difficultyBeatmap.level.songName;
                Presence.state          = gameObject.enabled ? "Playing" : "Paused";
                Presence.startTimestamp = DateTime.Now.ToUnixTime();
                Presence.largeImageKey  = "solo";
                Presence.largeImageText = "Beat Saber";
                Presence.smallImageKey  = "";
                Presence.smallImageText = "";
                DiscordRpc.UpdatePresence(Presence);
                break;
            }
        }
Пример #5
0
        public void OnEnable()
        {
            new GameObject("BeatSaberDiscordPresenceController").AddComponent <BeatSaberDiscordPresenceController>();
            //ApplyHarmonyPatches();

            logger.Info("Looking for BeatSaberMultiplayer");
            var beatSaberMultiplayer = PluginManager.GetPluginFromId("BeatSaberMultiplayer");

            if (beatSaberMultiplayer != null)
            {
                var multiplayerClientType = beatSaberMultiplayer.Assembly.GetType("BeatSaberMultiplayer.Client");
                if (multiplayerClientType != null)
                {
                    clientInstanceField       = multiplayerClientType.GetField("instance", (BindingFlags)(-1));
                    clientInstanceInroomField = multiplayerClientType.GetField("inRoom", (BindingFlags)(-1));
                    logger.Info("BeatSaberMultiplayer found and linked.");
                }
                else
                {
                    logger.Warn(
                        "Found BeatSaberMultiplayer, but not type BeatSaberMultiplayer.Client. Multiplayer won't be shown on discord.");
                }
            }

            //add the OnActiveSceneChanged method to the scene manager's activeSceneChanged
            SceneManager.activeSceneChanged += OnActiveSceneChanged;
            OnApplicationStart();

            //Menu scene loaded
            Presence.details        = "In Menu";
            Presence.state          = string.Empty;
            Presence.startTimestamp = default;
            Presence.largeImageKey  = "default";
            Presence.largeImageText = "Beat Saber";
            Presence.smallImageKey  = "";
            Presence.smallImageText = "";
            DiscordRpc.UpdatePresence(Presence);
        }
Пример #6
0
        private IEnumerator UpdatePresenceAfterFrame()
        {
            // Wait for next frame
            yield return(true);

            // Fetch all required objects
            _mainFlowCoordinator = Resources.FindObjectsOfTypeAll <MainFlowCoordinator>().FirstOrDefault();
            _gameplaySetup       = Resources.FindObjectsOfTypeAll <GameplayCoreSceneSetup>().FirstOrDefault();

            if (_z == null)
            {
                _z = Resources.FindObjectsOfTypeAll <Component>().FirstOrDefault(c => c != null && c.GetType().Name == "Z");
                if (_z == null)
                {
                    logger.Warn("No element of type \"Z\" found. Maybe the game isn't running a version of ScoreSaber supporting replay ?");
                }
            }

            if (_gameplaySetup != null)
            {
                _mainSetupData = _gameplayCoreSceneSetupDataField.GetValue(_gameplaySetup) as GameplayCoreSceneSetupData;
            }
#if DEBUG
            logger.Debug("_gameplaySetup: " + _gameplaySetup);
            logger.Debug("_gameplayCoreSceneSetupDataField: " + _gameplayCoreSceneSetupDataField);
            logger.Debug("_mainSetupData: " + _mainSetupData);
            GetFlowTypeHumanReadable(); // Used to debug print values
#endif
            // Check if every required object is found
            if (_mainSetupData == null || _gameplaySetup == null || _mainFlowCoordinator == null)
            {
                logger.Error("Error finding the scriptable objects required to update presence. (_mainSetupData: " + (_mainSetupData == null ? "N/A" : "OK") + ", _gameplaySetup: " + (_gameplaySetup == null ? "N/A" : "OK") + ", _mainFlowCoordinator: " + (_mainFlowCoordinator == null ? "N/A" : "OK"));
                Presence.details = "Playing";
                DiscordRpc.UpdatePresence(Presence);
                yield break;
            }

            // Set presence main values
            IDifficultyBeatmap diff = _mainSetupData.difficultyBeatmap;

            Presence.details = $"{diff.level.songName} | {diff.difficulty.Name()}";
            Presence.state   = "";

            if (_z != null)
            {
                //Console.WriteLine("--------------------------");
                FieldInfo[] fields = _z.GetType().GetFields((BindingFlags)(-1));
                foreach (FieldInfo fi in fields)
                {
                    if (fi.FieldType.Name == "Mode" && fi.GetValue(_z).ToString() == "Playback")
                    {
                        Presence.state += "[Replay] ";
                    }
                    //logger.Debug("Discord Presence - [" + fi.Name + ": " + fi.FieldType.Name + "] => " + fi.GetValue(_z));
                }
            }

            if (diff.level.levelID.Contains('∎'))
            {
                Presence.state += "Custom | ";
            }

            if (_mainSetupData.practiceSettings != null)
            {
                Presence.state += "Practice | ";
            }

            Presence.state += GetFlowTypeHumanReadable() + " ";
#if DEBUG
            logger.Debug("Discord Presence - diff.parentDifficultyBeatmapSet.beatmapCharacteristic: " + diff.parentDifficultyBeatmapSet.beatmapCharacteristic);
            logger.Debug("Discord Presence - _gameplaySetup._oneColorBeatmapCharacteristic: " + typeof(GameplayCoreSceneSetup).GetField("_oneColorBeatmapCharacteristic", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(_gameplaySetup));
#endif
            // Update gamemode (Standard / One Saber / No Arrow)
            if (_mainSetupData.gameplayModifiers.noArrows || diff.parentDifficultyBeatmapSet.beatmapCharacteristic.ToString().ToLower().Contains("noarrow"))
            {
                _gamemode = GameMode.NoArrows;
            }
            else if (diff.parentDifficultyBeatmapSet.beatmapCharacteristic == (BeatmapCharacteristicSO)_oneColorBeatmapCharacteristic.GetValue(_gameplaySetup))
            {
                _gamemode = GameMode.OneSaber;
            }
            else if (diff.parentDifficultyBeatmapSet.beatmapCharacteristic.ToString().ToLower().Contains("90degree"))
            {
                _gamemode = GameMode.NinetyDegree;
            }
            else if (diff.parentDifficultyBeatmapSet.beatmapCharacteristic.ToString().ToLower().Contains("360degree"))
            {
                _gamemode = GameMode.ThreeSixtyDegree;
            }
            else
            {
                _gamemode = GameMode.Standard;
            }

            string gameplayModeText = _gamemode == GameMode.OneSaber ? "One Saber" : _gamemode == GameMode.NoArrows ? "No Arrow" : _gamemode == GameMode.NinetyDegree ? "90º" : _gamemode == GameMode.ThreeSixtyDegree ? "360º" : "Standard";
            Presence.state += gameplayModeText;

            // Set music speak
            if (_mainSetupData.practiceSettings != null)
            {
                if (_mainSetupData.practiceSettings.songSpeedMul != 1.0f)
                {
                    Presence.state += " | Speed x" + _mainSetupData.practiceSettings.songSpeedMul;
                }
            }
            else
            {
                if (_mainSetupData.gameplayModifiers.songSpeedMul != 1.0f)
                {
                    Presence.state += " | Speed x" + _mainSetupData.gameplayModifiers.songSpeedMul;
                }
            }

            // Set common gameplay modifiers
            if (_mainSetupData.gameplayModifiers.noFail)
            {
                Presence.state += " | No Fail";
            }
            if (_mainSetupData.gameplayModifiers.instaFail)
            {
                Presence.state += " | Instant Fail";
            }
            if (_mainSetupData.gameplayModifiers.disappearingArrows)
            {
                Presence.state += " | Disappearing Arrows";
            }
            if (_mainSetupData.gameplayModifiers.ghostNotes)
            {
                Presence.state += " | Ghost Notes";
            }


            Presence.largeImageKey  = "default";
            Presence.largeImageText = "Beat Saber";
            Presence.smallImageKey  = GetFlowTypeHumanReadable() == "Party" ? "party" : _gamemode == GameMode.OneSaber ? "one_saber" : _gamemode == GameMode.NoArrows ? "no_arrows" : _gamemode == GameMode.NinetyDegree ? "90" : _gamemode == GameMode.ThreeSixtyDegree ? "360" : "solo";
            Presence.smallImageText = gameplayModeText;
            Presence.startTimestamp = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;

            // Set startTimestamp offset if we are in training mode
            if (_mainSetupData.practiceSettings != null)
            {
#if DEBUG
                logger.Debug("Discord Presence - _mainSetupData.practiceSettings.startSongTime: " + _mainSetupData.practiceSettings.startSongTime);
#endif
                if (_mainSetupData.practiceSettings.startInAdvanceAndClearNotes)
                {
                    Presence.startTimestamp -= (long)Mathf.Max(0f, _mainSetupData.practiceSettings.startSongTime - 3f);
                }
                else
                {
                    Presence.startTimestamp -= (long)_mainSetupData.practiceSettings.startSongTime;
                }
            }

            DiscordRpc.UpdatePresence(Presence);
        }
Пример #7
0
        private IEnumerator updatePresenceAfterFrame()
        {
            yield return(true);

            _mainFlowCoordinator = Resources.FindObjectsOfTypeAll <MainFlowCoordinator>().FirstOrDefault();
            _gameplaySetup       = BS_Utils.Plugin.LevelData.GameplayCoreSceneSetupData;

            if (BS_Utils.Plugin.LevelData.IsSet)
            {
                if (_gameplaySetup != null)
                {
                    _mainSetupData =
                        _gameplayCoreSceneSetupDataField.GetValue(_gameplaySetup) as GameplayCoreSceneSetupData;
                }

                // Check if every required object is found
                if (_mainSetupData == null || _gameplaySetup == null || _mainFlowCoordinator == null)
                {
                    Presence.details = "Playing";
                    DiscordRpc.UpdatePresence(Presence);
                    yield break;
                }

                // Set presence main values
                var diff = _mainSetupData.difficultyBeatmap;

                Presence.details = $"{diff.level.songName} | {diff.difficulty.Name()}";
                Presence.state   = "";

                if (diff.level.levelID.Contains('∎'))
                {
                    Presence.state += "Custom | ";
                }

                if (_mainSetupData.practiceSettings != null)
                {
                    Presence.state += "Practice | ";
                }

                Presence.state += getFlowTypeHumanReadable() + " ";

                // Update gamemode (Standard / One Saber / No Arrow)
                if (_mainSetupData.gameplayModifiers.noArrows || diff.parentDifficultyBeatmapSet.beatmapCharacteristic
                    .ToString().ToLower().Contains("noarrow"))
                {
                    _gamemode = gameMode.NoArrows;
                }
                else if (diff.parentDifficultyBeatmapSet.beatmapCharacteristic ==
                         (BeatmapCharacteristicSO)_oneColorBeatmapCharacteristic.GetValue(_gameplaySetup))
                {
                    _gamemode = gameMode.OneSaber;
                }
                else if (diff.parentDifficultyBeatmapSet.beatmapCharacteristic.ToString().ToLower()
                         .Contains("90degree"))
                {
                    _gamemode = gameMode.NinetyDegree;
                }
                else if (diff.parentDifficultyBeatmapSet.beatmapCharacteristic.ToString().ToLower()
                         .Contains("360degree"))
                {
                    _gamemode = gameMode.ThreeSixtyDegree;
                }
                else
                {
                    _gamemode = gameMode.Standard;
                }

                var gameplayModeText = _gamemode == gameMode.OneSaber ? "One Saber" :
                                       _gamemode == gameMode.NoArrows ? "No Arrow" :
                                       _gamemode == gameMode.NinetyDegree ? "90º" :
                                       _gamemode == gameMode.ThreeSixtyDegree ? "360º" : "Standard";
                Presence.state += gameplayModeText;

                // Set music speak
                if (_mainSetupData.practiceSettings != null)
                {
                    if (Math.Abs(_mainSetupData.practiceSettings.songSpeedMul - 1.0f) > 9999999)
                    {
                        Presence.state += " | Speed x" + _mainSetupData.practiceSettings.songSpeedMul;
                    }
                }
                else
                {
                    if (Math.Abs(_mainSetupData.gameplayModifiers.songSpeedMul - 1.0f) > 99999999)
                    {
                        Presence.state += " | Speed x" + _mainSetupData.gameplayModifiers.songSpeedMul;
                    }
                }

                // Set common gameplay modifiers
                if (_mainSetupData.gameplayModifiers.noFailOn0Energy)
                {
                    Presence.state += " | No Fail";
                }
                if (_mainSetupData.gameplayModifiers.instaFail)
                {
                    Presence.state += " | Instant Fail";
                }
                if (_mainSetupData.gameplayModifiers.disappearingArrows)
                {
                    Presence.state += " | Disappearing Arrows";
                }
                if (_mainSetupData.gameplayModifiers.ghostNotes)
                {
                    Presence.state += " | Ghost Notes";
                }


                Presence.largeImageKey  = "default";
                Presence.largeImageText = "Beat Saber";
                Presence.smallImageKey  = getFlowTypeHumanReadable() == "Party" ? "party" :
                                          _gamemode == gameMode.OneSaber ? "one_saber" :
                                          _gamemode == gameMode.NoArrows ? "no_arrows" :
                                          _gamemode == gameMode.NinetyDegree ? "90" :
                                          _gamemode == gameMode.ThreeSixtyDegree ? "360" : "solo";
                Presence.smallImageText = gameplayModeText;
                Presence.startTimestamp = (long)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;

                // Set startTimestamp offset if we are in training mode
                if (_mainSetupData.practiceSettings != null)
                {
                    if (_mainSetupData.practiceSettings.startInAdvanceAndClearNotes)
                    {
                        Presence.startTimestamp -=
                            (long)Mathf.Max(0f, _mainSetupData.practiceSettings.startSongTime - 3f);
                    }
                    else
                    {
                        Presence.startTimestamp -= (long)_mainSetupData.practiceSettings.startSongTime;
                    }
                }

                DiscordRpc.UpdatePresence(Presence);
            }
        }