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