DigitalzombieTLD 2 vuotta sitten
vanhempi
sitoutus
2d960aa84d

+ 1 - 0
AudioMain.cs

@@ -30,6 +30,7 @@ namespace AudioMgr
             if (sceneName.Contains("Boot"))
             {
                 AudioMaster.CreateMasterParent();
+                RadioMaster.Initialize();
                 
                 //myClipManager = new ClipManager();
                 //myClipManager2 = new ClipManager();

+ 31 - 4
AudioManagerSettings.cs

@@ -5,8 +5,15 @@ using MelonLoader;
 namespace AudioMgr
 {
     internal class AudioManagerSettings : JsonModSettings
-    {     
-		[Section("Aurora Audio")]
+    {
+        [Section("Custom Audio")]
+
+        [Name("Volume")]
+        [Description("Volume of custom audio sources")]
+        [Slider(0, 1)]
+        public float customVolume = 1;
+
+        [Section("Aurora Audio")]
 
         [Name("Limit Volume")]
         [Description("Limit Volume to Value below")]
@@ -17,6 +24,25 @@ namespace AudioMgr
 		[Slider(0, 100)]
 		public int auroraVolume = 0;
 
+        [Section("Radio")]
+
+        [Name("Custom Radio Music")]
+        [Description("Play custom ogg files instead of the standard classical music")]
+        public bool customRadioMusic = false;
+
+        [Name("Radio Works Without Auroa")]
+        [Description("Makes radios functional at any time")]
+        public bool radioWorksWithoutAurora = true;
+
+        [Name("Randomize Playback Order")]
+        [Description("Plays audiofiles in alphabetical order if disabled")]
+        public bool randomRadioMusic = true;
+
+        [Name("Radio Volume")]
+        [Description("Left: Silent / Right: Maximum Volume")]
+        [Slider(0, 1)]
+        public float customRadioVolume = 1;
+
         [Section("Wind Audio Indoor (clattering)")]
 
         [Name("Limit Volume")]
@@ -43,7 +69,7 @@ namespace AudioMgr
         protected override void OnConfirm()
         {
             base.OnConfirm();
-         
+            VolumeMaster.SetVolume(AudioMaster.SourceType.AuroraRadio, customRadioVolume);
         }
     }
 
@@ -54,7 +80,8 @@ namespace AudioMgr
         public static void OnLoad()
         {
             options = new AudioManagerSettings();
-            options.AddToModSettings("AudioManager");           
+            options.AddToModSettings("AudioManager");
+            VolumeMaster.SetVolume(AudioMaster.SourceType.AuroraRadio, Settings.options.customRadioVolume);
         }
     }
 }

+ 28 - 3
Components/Queue.cs

@@ -38,12 +38,13 @@ namespace AudioMgr
         public void Setup(ClipManager assignedClipManager, float timeGap, Loop loopType, AudioMaster.SourceType sourceType)
         {
             _assignedClipManager = assignedClipManager;
+            _sourceType = sourceType;
             _timeGap = timeGap;
             _loop = loopType;
             _audioSources = new Dictionary<bool, AudioSource>();
             _audioSources.Add(true, gameObject.AddComponent<AudioSource>());
             _audioSources.Add(false, gameObject.AddComponent<AudioSource>());
-
+         
             _audioSources[true].playOnAwake = false;
             _audioSources[false].playOnAwake = false;
 
@@ -55,6 +56,28 @@ namespace AudioMgr
             ApplySettings(SettingMaster.Defaults(sourceType));
         }
 
+        [HideFromIl2Cpp]
+        public void Setup(ClipManager assignedClipManager, float timeGap, Loop loopType, Setting sourceSetting)
+        {
+            _assignedClipManager = assignedClipManager;
+            _timeGap = timeGap;
+            _loop = loopType;
+            _sourceType = AudioMaster.SourceType.Custom;
+            _audioSources = new Dictionary<bool, AudioSource>();
+            _audioSources.Add(true, gameObject.AddComponent<AudioSource>());
+            _audioSources.Add(false, gameObject.AddComponent<AudioSource>());
+
+            _audioSources[true].playOnAwake = false;
+            _audioSources[false].playOnAwake = false;
+
+            _audioSources[true].volume = VolumeMaster.GetVolume(_sourceType);
+            _audioSources[false].volume = VolumeMaster.GetVolume(_sourceType);
+
+            VolumeMaster.onVolumeChange += ResetVolume;
+
+            ApplySettings(sourceSetting);
+        }
+
         [HideFromIl2Cpp]
         public int GetNextClip()
         {
@@ -140,7 +163,7 @@ namespace AudioMgr
             double _startTime;
             double _timeToNext = 0;
             int _nextClip = 0;
-                      
+
             _startTime = AudioSettings.dspTime + 0.5;
 
             if (_randomGap)
@@ -246,7 +269,9 @@ namespace AudioMgr
             _audioSources[audioSource].pitch = _activeSetting.pitch;
             _audioSources[audioSource].spatialBlend = _activeSetting.spatialBlend;
             _audioSources[audioSource].spatialize = _activeSetting.spatialize;
-            //_audioSources[audioSource].rolloffFactor = _activeSetting.rolloffFactor;
+            _audioSources[audioSource].rolloffFactor = _activeSetting.rolloffFactor;
+            _audioSources[audioSource].maxVolume = _activeSetting.maxVolume;
+            _audioSources[audioSource].maxVolume = _activeSetting.minVolume;
             _audioSources[audioSource].rolloffMode = _activeSetting.rolloffMode;
             //_audioSources[audioSource].SetCustomCurve(AudioSourceCurveType.CustomRolloff, _activeSetting.rollOffCurve);
 

+ 15 - 9
Components/Shot.cs

@@ -25,6 +25,7 @@ namespace AudioMgr
         [HideFromIl2Cpp]
         public void Setup(AudioMaster.SourceType sourceType)
         {
+            _sourceType = sourceType;
             _audioSource = gameObject.AddComponent<AudioSource>();
             _audioSource.playOnAwake = false;
             _audioSource.volume = VolumeMaster.GetVolume(sourceType);
@@ -32,6 +33,17 @@ namespace AudioMgr
             ApplySettings(SettingMaster.Defaults(sourceType));
         }
 
+        [HideFromIl2Cpp]
+        public void Setup(Setting sourceSetting)
+        {
+            _sourceType = AudioMaster.SourceType.Custom;
+            _audioSource = gameObject.AddComponent<AudioSource>();
+            _audioSource.playOnAwake = false;
+            _audioSource.volume = VolumeMaster.GetVolume(_sourceType);
+            VolumeMaster.onVolumeChange += ResetVolume;
+            ApplySettings(sourceSetting);
+        }
+
         [HideFromIl2Cpp]
         private void OnEnable()
         {
@@ -53,11 +65,8 @@ namespace AudioMgr
 
         [HideFromIl2Cpp]
         public void SetVolume(float newVolume)
-        {
-            if (_sourceType == AudioMaster.SourceType.Custom)
-            {
-                _audioSource.volume = newVolume;
-            }
+        {          
+            _audioSource.volume = newVolume;            
         }
 
         [HideFromIl2Cpp]
@@ -113,10 +122,7 @@ namespace AudioMgr
         [HideFromIl2Cpp]
         public void ResetVolume()
         {
-            if(_sourceType != AudioMaster.SourceType.Custom)
-            {
-                _audioSource.volume = VolumeMaster.GetVolume(_sourceType);
-            }            
+            _audioSource.volume = VolumeMaster.GetVolume(_sourceType);
         }
 
         [HideFromIl2Cpp]

+ 72 - 0
Harmony/AuroraPatches.cs

@@ -0,0 +1,72 @@
+using Il2Cpp;
+using MelonLoader;
+using UnityEngine;
+
+namespace AudioMgr
+{   
+    
+    [HarmonyLib.HarmonyPatch(typeof(AuroraActivatedToggle), "SetState", new Type[] { typeof(AuroraActivatedToggleState) })]
+    public class TurnOnPatch
+    {
+        public static void Prefix(ref AuroraActivatedToggle __instance, ref AuroraActivatedToggleState state)
+        {           
+            if (Settings.options.customRadioMusic)
+            {
+                if (__instance.m_ToggleOffAudio == "Stop_RadioAurora" && state == AuroraActivatedToggleState.On)
+                {
+                    if (Settings.options.radioWorksWithoutAurora)
+                    {
+                        __instance.m_RequiresAuroraField = false;
+                       
+                        for (int i = 0; i < __instance.transform.childCount; i++)
+                        {
+                            __instance.transform.GetChild(i).gameObject.SetActive(true);
+                        }
+                        __instance.m_ChildrenEnabled = true;
+                        //__instance.UpdateChildStatus(true);
+
+                        MelonLogger.Msg("StartPlay");
+                        RadioMaster.StartPlay(__instance.gameObject);
+                    }
+                }
+
+                if (__instance.m_ToggleOffAudio == "Stop_RadioAurora" && state == AuroraActivatedToggleState.Off)
+                {
+                    if (Settings.options.radioWorksWithoutAurora)
+                    {
+                        MelonLogger.Msg("StopPlay");
+                        RadioMaster.StopPlay(__instance.gameObject);
+                    }
+                }
+            }
+        }
+    }
+
+    [HarmonyLib.HarmonyPatch(typeof(AuroraActivatedToggle), "Update")]
+    public class LightingPatch
+    {
+        public static bool Prefix(ref AuroraActivatedToggle __instance)
+        {
+            if (Settings.options.customRadioMusic && Settings.options.radioWorksWithoutAurora)
+            {
+                __instance.m_RequiresAuroraField = false;
+                return false;
+            }
+
+            return true;
+        }
+    }
+
+    [HarmonyLib.HarmonyPatch(typeof(AuroraActivatedToggle), "ShouldEnableChildren")]
+    public class ShouldEnableEffectPatch
+    {
+        public static void Postfix(ref AuroraActivatedToggle __instance, ref bool __result)
+        {
+            if (Settings.options.customRadioMusic && Settings.options.radioWorksWithoutAurora)
+            {
+                __result = true;
+            }           
+        }
+    }
+
+}

+ 2 - 2
Manager/ClipManager.cs

@@ -88,7 +88,7 @@ namespace AudioMgr
                 }
             }
         }
-
+        
         //private IEnumerator LoadClipFromBundleRoutine(string newClipName, string clipInBundle, AssetBundle assetBundle)
         private void LoadClipFromBundleRoutine(string newClipName, string clipInBundle, AssetBundle assetBundle)
         {
@@ -151,7 +151,7 @@ namespace AudioMgr
 
             if (!www.isNetworkError && !www.isHttpError)
             {
-                _loadedClips[clipName] = new Clip(WebRequestWWW.InternalCreateAudioClipUsingDH(www.downloadHandler, www.url, stream, compressed, AudioType.UNKNOWN), clipName);
+                _loadedClips[clipName] = new Clip(WebRequestWWW.InternalCreateAudioClipUsingDH(www.downloadHandler, www.url, stream, compressed, AudioType.UNKNOWN), clipName);                    
             }
             else
             {

+ 37 - 41
Master/AudioMaster.cs

@@ -16,7 +16,7 @@ namespace AudioMgr
         private static bool _isVanillaMusicDisabled = false;
 
 
-        public enum SourceType { SFX, BGM, Voice, Ambience, Custom };
+        public enum SourceType { SFX, BGM, Voice, Ambience, Custom, AuroraRadio };
 
         public static void MoveMasterToPlayer()
         {           
@@ -50,10 +50,7 @@ namespace AudioMgr
 
 
 
-        /// <summary>
-        /// Creates a new ClipManager instance for loading audioclips from files or bundles.
-        /// </summary>
-        /// <returns>New "ClipManager" class instance. Manage yourself</returns>
+
         public static ClipManager NewClipManager()
         {
             ClipManager newManager = new ClipManager();
@@ -61,13 +58,7 @@ namespace AudioMgr
             return newManager;
         }
 
-        /// <summary>
-        /// Creates a new AudioSource on targetobject. Used for single short audioclips.
-        /// </summary>
-        /// <returns>New "Shot" class instance. Manage yourself</returns>
-        /// <param name="targetObject">Parentobject for new audiosource</param>
-        /// <param name="sourceType">Enum AudioMaster.SourceType.* - Affects volume and 3d audio settings</param>
-        /// 
+  
         public static Shot CreateShot(GameObject targetObject, SourceType sourceType)
         {
             Shot newAudioSource = targetObject.AddComponent<Shot>();
@@ -76,12 +67,15 @@ namespace AudioMgr
             return newAudioSource;
         }
 
-        /// <summary>
-        /// Creates a new AudioSource on the player. Used for single short audioclips that emit from the player (eg. voice)
-        /// </summary>
-        /// <returns>New "Shot" class instance. Manage yourself</returns>
-        /// <param name="sourceType">Enum AudioMaster.SourceType.* - Affects volume and 3d audio settings</param>
-        /// 
+        public static Shot CreateShot(GameObject targetObject, Setting sourceSetting)
+        {
+            Shot newAudioSource = targetObject.AddComponent<Shot>();
+            newAudioSource.Setup(sourceSetting);
+
+            return newAudioSource;
+        }
+
+
         public static Shot CreatePlayerShot(SourceType sourceType)
         {
             Shot newAudioSource = _masterParent.AddComponent<Shot>();
@@ -90,16 +84,15 @@ namespace AudioMgr
             return newAudioSource;
         }
 
-        /// <summary>
-        /// Creates a new AudioSource on targetobject. Used for playing a list of audioclips.
-        /// </summary>
-        /// <returns>New "Queue" class instance. Manage yourself</returns>
-        /// <param name="targetObject">Parentobject for new audiosource</param>
-        /// <param name="clipManager">ClipManager that acts as the playlist</param>
-        /// <param name="timeGap">Pause between clips. Use 0f for gapless playback</param>
-        /// <param name="loopType">Enum Queue.Loop.* - Loop single clip / Loop complete list / Randomize play order (never stop)</param>
-        /// <param name="sourceType">Enum AudioMaster.SourceType.* - Affects volume and 3d audio settings</param>
-        /// 
+        public static Shot CreatePlayerShot(Setting sourceSetting)
+        {
+            Shot newAudioSource = _masterParent.AddComponent<Shot>();
+            newAudioSource.Setup(sourceSetting);
+
+            return newAudioSource;
+        }
+
+
         public static Queue CreateQueue(GameObject targetObject, ClipManager clipManager, float timeGap, Queue.Loop loopType, SourceType sourceType)
         {
             Queue newAudioSource = targetObject.AddComponent<Queue>();
@@ -108,15 +101,14 @@ namespace AudioMgr
             return newAudioSource;
         }
 
-        /// <summary>
-        /// Creates a new AudioSource on the player. Used for playing a list of audioclips.
-        /// </summary>
-        /// <returns>New "Queue" class instance. Manage yourself</returns>
-        /// <param name="clipManager">ClipManager that acts as the playlist</param>
-        /// <param name="timeGap">Pause between clips. Use 0f for gapless playback</param>
-        /// <param name="loopType">Enum Queue.Loop.* - Loop single clip / Loop complete list / Randomize play order (never stop)</param>
-        /// <param name="sourceType">Enum AudioMaster.SourceType.* - Affects volume and 3d audio settings</param>
-        /// 
+        public static Queue CreateQueue(GameObject targetObject, ClipManager clipManager, float timeGap, Queue.Loop loopType, Setting sourceSetting)
+        {
+            Queue newAudioSource = targetObject.AddComponent<Queue>();
+            newAudioSource.Setup(clipManager, timeGap, loopType, sourceSetting);
+
+            return newAudioSource;
+        }
+
         public static Queue CreatePlayerQueue(ClipManager clipManager, float timeGap, Queue.Loop loopType, SourceType sourceType)
         {
             if (_playerGotBGMQueue && sourceType == SourceType.BGM)
@@ -141,11 +133,15 @@ namespace AudioMgr
             return newAudioSource;
         }
 
+        public static Queue CreatePlayerQueue(ClipManager clipManager, float timeGap, Queue.Loop loopType, Setting sourceSetting)
+        {
+             Queue newAudioSource = _masterParent.AddComponent<Queue>();
+            newAudioSource.Setup(clipManager, timeGap, loopType, sourceSetting);
+
+            return newAudioSource;
+        }
+
 
-        /// <summary>
-        /// Removes any Queue on the player with the source type BGM.
-        /// </summary>
-        /// 
         public static void RemovePlayerBGMQueue()
         {
             if (_playerGotBGMQueue)

+ 56 - 0
Master/RadioMaster.cs

@@ -0,0 +1,56 @@
+using UnityEngine;
+using static Il2Cpp.BaseAi;
+
+namespace AudioMgr
+{
+    public static class RadioMaster
+    {
+        public static string musicPath = @"file:///" + Application.dataPath + @"/../Mods/AuroraRadio";
+        public static ClipManager auroraClipManager;
+
+        public static void Initialize()
+        {
+            auroraClipManager = new ClipManager();
+
+            auroraClipManager.LoadClipsFromDir("AuroraRadio", ClipManager.LoadType.Stream);
+        }
+
+        private static Queue GetOrAddQueueToRadio(GameObject radioObject)
+        {
+            Queue radioQueue = radioObject.GetComponent<Queue>();
+
+            if (radioQueue == null) 
+            {
+                if(Settings.options.randomRadioMusic) 
+                {
+                    radioQueue = AudioMaster.CreateQueue(radioObject, auroraClipManager, 3f, Queue.Loop.Randomize, AudioMaster.SourceType.AuroraRadio);
+                }
+                else
+                {
+                    radioQueue = AudioMaster.CreateQueue(radioObject, auroraClipManager, 3f, Queue.Loop.All, AudioMaster.SourceType.AuroraRadio);
+                }
+            }
+
+            return radioQueue;
+        }
+
+        public static void StartPlay(GameObject radioObject)
+        {
+            if (auroraClipManager.clipCount > 0)
+            {
+                Queue radioQueue = GetOrAddQueueToRadio(radioObject);
+                radioQueue.GetNextClip();
+                radioQueue.Play();
+            }
+        }
+
+        public static void StopPlay(GameObject radioObject)
+        {
+            if (auroraClipManager.clipCount > 0)
+            {
+                Queue radioQueue = GetOrAddQueueToRadio(radioObject);
+                radioQueue.Stop();
+            }
+        }
+    }
+}

+ 16 - 0
Master/SettingMaster.cs

@@ -36,6 +36,7 @@ namespace AudioMgr
             _defaultSetting.Add(AudioMaster.SourceType.Voice, new Setting(AudioMaster.SourceType.Voice));
             _defaultSetting.Add(AudioMaster.SourceType.BGM, new Setting(AudioMaster.SourceType.BGM));
             _defaultSetting.Add(AudioMaster.SourceType.Custom, new Setting(AudioMaster.SourceType.Custom));
+            _defaultSetting.Add(AudioMaster.SourceType.AuroraRadio, new Setting(AudioMaster.SourceType.AuroraRadio));
 
             _defaultSetting[AudioMaster.SourceType.SFX].spread = 0.0f;
             _defaultSetting[AudioMaster.SourceType.SFX].panStereo = 0.0f;
@@ -101,6 +102,21 @@ namespace AudioMgr
             _defaultSetting[AudioMaster.SourceType.Custom].rolloffMode = AudioRolloffMode.Linear;
             //_defaultSetting[AudioMaster.SourceType.Custom].rollOffCurve = stdRollOffCurve;
             _defaultSetting[AudioMaster.SourceType.Custom].priority = 80;
+
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].spread = 20f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].panStereo = 0.0f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].dopplerLevel = 0.1f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].maxDistance = 11.0f; 
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].minDistance = 0.01f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].pitch = 1.0f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].spatialBlend = 1.0f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].rolloffFactor = 1f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].spatialize = true;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].maxVolume = 0.5f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].minVolume = 0.1f;
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].rolloffMode = AudioRolloffMode.Linear;
+            
+            _defaultSetting[AudioMaster.SourceType.AuroraRadio].priority = 128;
         }
         public static Setting Defaults(AudioMaster.SourceType sourceType)
         {

+ 5 - 2
Master/VolumeMaster.cs

@@ -15,7 +15,8 @@ namespace AudioMgr
             { AudioMaster.SourceType.BGM, 1f },
             { AudioMaster.SourceType.Voice, 1f },
             { AudioMaster.SourceType.Ambience, 1f },
-            { AudioMaster.SourceType.Custom, 1f }
+            { AudioMaster.SourceType.Custom, 1f },
+            { AudioMaster.SourceType.AuroraRadio, 1f }
         };
 
         private static void VolumeChanged()
@@ -27,7 +28,9 @@ namespace AudioMgr
         }
 
         public static float GetVolume(AudioMaster.SourceType type)
-        {
+        {           
+            _globalVolumes[AudioMaster.SourceType.Custom] = Settings.options.customVolume;
+
             return ApplyMasterOffset(_globalVolumes[type]); 
         }
 

+ 2 - 0
Minions/Setting.cs

@@ -17,6 +17,8 @@ namespace AudioMgr
         public float rolloffFactor;
         public AudioRolloffMode rolloffMode;
         //public AnimationCurve rollOffCurve;
+        public float maxVolume;
+        public float minVolume;
         public int priority;
 
         public Setting(AudioMaster.SourceType sourcetype)

+ 3 - 3
Properties/AssemblyInfo.cs

@@ -3,7 +3,7 @@ using System.Reflection;
 
 [assembly: AssemblyTitle("AudioManager")]
 [assembly: AssemblyCopyright("Digitalzombie")]
-[assembly: AssemblyVersion("1.0.0")]
-[assembly: AssemblyFileVersion("1.0.0")]
-[assembly: MelonInfo(typeof(AudioMgr.AudioMain), "AudioManager", "1.0.0", "Digitalzombie", null)]
+[assembly: AssemblyVersion("1.1.0")]
+[assembly: AssemblyFileVersion("1.1.0")]
+[assembly: MelonInfo(typeof(AudioMgr.AudioMain), "AudioManager", "1.1.0", "Digitalzombie", null)]
 [assembly: MelonGame("Hinterland", "TheLongDark")]