using System; using System.Collections; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using FMOD; using FMODUnity; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("LeopoldsTavernMusic")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("LeopoldsTavernMusic")] [assembly: AssemblyTitle("LeopoldsTavernMusic")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace LastPirates.LeopoldsTavernMusic { [BepInPlugin("com.bwadd.lastpirates.leopoldstavernmusic", "Leopold's Tavern Level Music", "1.1.0")] public sealed class Plugin : BaseUnityPlugin { public const string PluginGuid = "com.bwadd.lastpirates.leopoldstavernmusic"; public const string PluginName = "Leopold's Tavern Level Music"; public const string PluginVersion = "1.1.0"; private const string TrackFileName = "LeopoldsTavern.wav"; private ConfigEntry _volume; private ConfigEntry _loop; private ConfigEntry _scenePrefix; private Sound _sound; private Channel _channel; private bool _soundReady; private bool _pendingLevelStart; private float _lastStartTime = -100f; private string _trackPath; private void Awake() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown _volume = ((BaseUnityPlugin)this).Config.Bind("Audio", "Volume", 0.7f, new ConfigDescription("Playback volume.", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 1f), Array.Empty())); _loop = ((BaseUnityPlugin)this).Config.Bind("Audio", "Loop", false, "Loop the track during a level."); _scenePrefix = ((BaseUnityPlugin)this).Config.Bind("Trigger", "SceneNamePrefix", "Level_", "Play when a loaded scene name begins with this text."); _trackPath = Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "LeopoldsTavern.wav"); SceneManager.sceneLoaded += OnSceneLoaded; ((MonoBehaviour)this).StartCoroutine(LoadTrackThroughFmod()); } private void OnDestroy() { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) SceneManager.sceneLoaded -= OnSceneLoaded; if (((Channel)(ref _channel)).hasHandle()) { ((Channel)(ref _channel)).stop(); ((Channel)(ref _channel)).clearHandle(); } if (((Sound)(ref _sound)).hasHandle()) { ((Sound)(ref _sound)).release(); ((Sound)(ref _sound)).clearHandle(); } } private IEnumerator LoadTrackThroughFmod() { if (!File.Exists(_trackPath)) { ((BaseUnityPlugin)this).Logger.LogError((object)("Music file not found: " + _trackPath)); yield break; } float deadline = Time.realtimeSinceStartup + 30f; string lastError = "FMOD has not initialized yet."; while (Time.realtimeSinceStartup < deadline) { if (TryCreateFmodSound(out lastError)) { _soundReady = true; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Loaded LeopoldsTavern.wav through the game's FMOD Core system."); if (_pendingLevelStart) { _pendingLevelStart = false; PlayTrack(); } yield break; } yield return (object)new WaitForSecondsRealtime(0.5f); } ((BaseUnityPlugin)this).Logger.LogError((object)("Could not load LeopoldsTavern.wav through FMOD within 30 seconds: " + lastError)); } private bool TryCreateFmodSound(out string error) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) error = null; try { System coreSystem = RuntimeManager.CoreSystem; if (!((System)(ref coreSystem)).hasHandle()) { error = "FMOD Core system has no handle."; return false; } RESULT val = ((System)(ref coreSystem)).createSound(_trackPath, (MODE)137, ref _sound); if ((int)val != 0) { error = $"createSound returned {val}: {Error.String(val)}"; return false; } uint num = default(uint); val = ((Sound)(ref _sound)).getLength(ref num, (TIMEUNIT)1); if ((int)val == 0) { ((BaseUnityPlugin)this).Logger.LogInfo((object)$"FMOD track duration: {(float)num / 1000f:F1} seconds."); } return true; } catch (Exception ex) { error = ex.ToString(); return false; } } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (((Scene)(ref scene)).name.StartsWith(_scenePrefix.Value, StringComparison.OrdinalIgnoreCase)) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("Matched level scene '" + ((Scene)(ref scene)).name + "'.")); if (!_soundReady) { _pendingLevelStart = true; ((BaseUnityPlugin)this).Logger.LogInfo((object)"FMOD audio is not ready yet; playback is queued."); } else { PlayTrack(); } } } private void PlayTrack() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) if (_soundReady && !(Time.realtimeSinceStartup - _lastStartTime < 3f)) { if (((Channel)(ref _channel)).hasHandle()) { ((Channel)(ref _channel)).stop(); ((Channel)(ref _channel)).clearHandle(); } MODE val = (MODE)((!_loop.Value) ? 1 : 2); RESULT val2 = ((Sound)(ref _sound)).setMode((MODE)(0x88 | val)); if ((int)val2 == 0) { System coreSystem = RuntimeManager.CoreSystem; val2 = ((System)(ref coreSystem)).playSound(_sound, default(ChannelGroup), false, ref _channel); } if ((int)val2 != 0) { ((BaseUnityPlugin)this).Logger.LogError((object)$"FMOD playback failed: {val2}: {Error.String(val2)}"); return; } ((Channel)(ref _channel)).setVolume(_volume.Value); _lastStartTime = Time.realtimeSinceStartup; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Playing Leopold's Tavern through FMOD for level start."); } } } }