public static bool PlayTrack(string trackName, float fadeTimeMs = 2000f, bool force = false) { if (G.Sys.AudioManager_.CurrentMusicState_ == AudioManager.MusicState.CustomMusic) { return(false); } if (!Enabled) { StopCustomMusic(); return(false); } if (trackName == null) { StopCustomMusic(); return(false); } var track = GetTrack(trackName); if (track == null || string.IsNullOrEmpty(track.FileLocation)) { StopCustomMusic(); return(false); } if (!force && PlayingMusic && AudioManager.CurrentAudioFile_ != null && AudioManager.CurrentAudioFile_.FileName == track.FileLocation) { return(true); } typeof(AudioManager).GetField("perLevelMusicOverride_", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(G.Sys.AudioManager_, false); var failed = false; Events.StaticEvent <Events.Audio.MusicSegmentEnd.Data> .Delegate func = data => { failed = true; }; Events.StaticEvent <Events.Audio.MusicSegmentEnd.Data> .Subscribe(func); try { G.Sys.AudioManager_.PlayMP3(track.FileLocation, PlayingMusic ? 0f : fadeTimeMs); } catch (Exception e) { Events.StaticEvent <Events.Audio.MusicSegmentEnd.Data> .Unsubscribe(func); UnityEngine.Debug.Log($"Failed to play track {trackName} because: {e}"); StopCustomMusic(); return(false); } Events.StaticEvent <Events.Audio.MusicSegmentEnd.Data> .Unsubscribe(func); if (failed || AudioManager.CurrentAudioFile_ == null || AudioManager.CurrentAudioFile_.FileName != track.FileLocation) { UnityEngine.Debug.Log($"Failed to play track {trackName}"); StopCustomMusic(); return(false); } typeof(AudioManager).GetField("perLevelMusicOverride_", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(G.Sys.AudioManager_, true); typeof(AudioManager).GetField("currentMusicState_", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(G.Sys.AudioManager_, AudioManager.MusicState.PerLevel); CurrentTrackName = trackName; PlayingMusic = true; AudioManager.PostEvent("Mute_All_Music"); return(true); }
public static void PatchPostLoad(bool subscribe) { var manager = G.Sys.AudioManager_; EditorPatches.removeParticularSubscriber <Events.Level.PostLoad.Data>(manager); var list = (Events.SubscriberList) typeof(AudioManager).GetField("subscriberList_", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(manager); var item = new Events.StaticEvent <Events.Level.PostLoad.Data> .Subscriber(new Events.StaticEvent <Events.Level.PostLoad.Data> .Delegate(data => { UnityEngine.Debug.Log("Running PostLoad"); typeof(AudioManager).GetMethod("OnEventPostLoad", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(G.Sys.AudioManager_, new object[] { data }); })); list.Add(item); if (subscribe) { (item as Events.IEventSubscriber).Subscribe(); } }