diff --git a/Source/RocketSoundEnhancement/AudioUtility.cs b/Source/RocketSoundEnhancement/AudioUtility.cs index c6fd9c8..b258f85 100644 --- a/Source/RocketSoundEnhancement/AudioUtility.cs +++ b/Source/RocketSoundEnhancement/AudioUtility.cs @@ -70,27 +70,6 @@ public static class AudioUtility public static AnimationCurve SmoothControl = AnimationCurve.EaseInOut(0f, 0.04f, 1f, 1f); public static string RSETag = "RSE"; - public static ConfigNode GetConfigNode(string partInfoName, string moduleName, string moduleID = "") - { - var configs = GameDatabase.Instance.GetConfigs("PART"); - - foreach (var configNode in configs) - { - if (configNode.name.Replace("_", ".") == partInfoName) - { - if (moduleID == "") - { - return Array.FindAll(configNode.config.GetNodes("MODULE"), x => x.GetValue("name") == moduleName).FirstOrDefault(); - } - else - { - return Array.FindAll(configNode.config.GetNodes("MODULE"), x => x.GetValue("name") == moduleName && x.GetValue("moduleID") == moduleID).FirstOrDefault(); - } - } - } - return null; - } - public static List CreateSoundLayerGroup(ConfigNode[] groupNodes) { var group = new List(); diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Coupler.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Coupler.cs index 8f215ac..fe5bb34 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Coupler.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Coupler.cs @@ -11,13 +11,17 @@ public class RSE_Coupler : RSE_Module private bool isDecoupler; private bool hasDecoupled; + public RSE_Coupler() + { + EnableLowpassFilter = true; + EnableDistortionFilter = true; + } + public override void OnStart(StartState state) { if (state == StartState.Editor || state == StartState.None) return; - EnableLowpassFilter = true; - EnableDistortionFilter = true; base.OnStart(state); if(part.GetComponent()) { diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Engines.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Engines.cs index 55c4cc1..4bd02f6 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Engines.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Engines.cs @@ -12,14 +12,18 @@ public class RSE_Engines : RSE_Module public Dictionary sharedSoundLayers = new Dictionary(); private List engineModules = new List(); - public override void OnStart(StartState state) + public RSE_Engines() { - if(state == StartState.Editor || state == StartState.None) - return; - EnableLowpassFilter = true; EnableCombFilter = true; EnableDistortionFilter = true; + } + + public override void OnStart(StartState state) + { + if (state == StartState.Editor || state == StartState.None) + return; + base.OnStart(state); var soundLayersCache = new HashSet(); diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_KerbalEVA.cs b/Source/RocketSoundEnhancement/PartModules/RSE_KerbalEVA.cs index e46df9f..151b42c 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_KerbalEVA.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_KerbalEVA.cs @@ -5,12 +5,16 @@ namespace RocketSoundEnhancement.PartModules { public class RSE_KerbalEVA : RSE_Module { + public RSE_KerbalEVA() + { + EnableLowpassFilter = true; + } + public override void OnStart(StartState state) { if (state == StartState.Editor || state == StartState.None) return; - EnableLowpassFilter = true; base.OnStart(state); Initialized = true; diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs index 208a915..d628882 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Collections.Generic; +using System.Runtime.InteropServices; using RocketSoundEnhancement.AudioFilters; using RocketSoundEnhancement.Unity; using UnityEngine; @@ -17,7 +18,6 @@ public class RSE_Module : PartModule public GameObject AudioParent { get; protected set; } - public ConfigNode PartConfigNode; public bool PrepareSoundLayers = true; public bool Initialized; public bool GamePaused; @@ -53,51 +53,9 @@ public override void OnStart(StartState state) { string partParentName = part.name + "_" + this.moduleName; AudioParent = AudioUtility.CreateAudioParent(part, partParentName); - PartConfigNode = AudioUtility.GetConfigNode(part.partInfo.name, this.moduleName); - - if (!float.TryParse(PartConfigNode.GetValue("volume"), out Volume)) Volume = 1; - if (!float.TryParse(PartConfigNode.GetValue("DopplerFactor"), out DopplerFactor)) DopplerFactor = 0.5f; - - if (PartConfigNode.HasNode("AIRSIMULATION")) - { - var node = PartConfigNode.GetNode("AIRSIMULATION"); - - if (node.HasValue("EnableCombFilter")) bool.TryParse(node.GetValue("EnableCombFilter"), out EnableCombFilter); - if (node.HasValue("EnableLowpassFilter")) bool.TryParse(node.GetValue("EnableLowpassFilter"), out EnableLowpassFilter); - if (node.HasValue("EnableDistortionFilter")) bool.TryParse(node.GetValue("EnableDistortionFilter"), out EnableDistortionFilter); - - if (node.HasValue("UpdateMode")) node.TryGetEnum("UpdateMode", ref AirSimUpdateMode, AirSimulationUpdate.Full); - - if (node.HasValue("FarLowpass")) FarLowpass = float.Parse(node.GetValue("FarLowpass")); - if (node.HasValue("MaxCombDelay")) MaxCombDelay = float.Parse(node.GetValue("MaxCombDelay")); - if (node.HasValue("MaxCombMix")) MaxCombMix = float.Parse(node.GetValue("MaxCombMix")); - if (node.HasValue("MaxDistortion")) MaxDistortion = float.Parse(node.GetValue("MaxDistortion")); - if (node.HasValue("AngleHighpass")) AngleHighpass = float.Parse(node.GetValue("AngleHighpass")); - } - - UseAirSimulation = !(!EnableLowpassFilter && !EnableCombFilter && !EnableDistortionFilter); if (PrepareSoundLayers) { - foreach (var node in PartConfigNode.GetNodes()) - { - var soundLayers = AudioUtility.CreateSoundLayerGroup(node.GetNodes("SOUNDLAYER")); - if (soundLayers.Count == 0) continue; - - var groupName = node.name; - - if(node.name == "SOUNDLAYERGROUP") - { - groupName = node.GetValue("name"); - } - - if (SoundLayerGroups.ContainsKey(groupName)) { SoundLayerGroups[groupName].AddRange(soundLayers); continue; } - - SoundLayerGroups.Add(groupName, soundLayers); - } - - SoundLayers = AudioUtility.CreateSoundLayerGroup(PartConfigNode.GetNodes("SOUNDLAYER")); - if (SoundLayerGroups.Count > 0) { foreach (var soundLayerGroup in SoundLayerGroups) @@ -263,7 +221,7 @@ public void PlaySoundLayer(SoundLayer soundLayer, float control, float volume, b if (source.isPlaying && soundLayer.loop) source.volume = 0; - + return; } @@ -338,5 +296,66 @@ public virtual void OnDestroy() } Destroy(AudioParent); } + + public override void OnLoad(ConfigNode node) + { + base.OnLoad(node); + + // This likely doesn't work correctly with B9PS which can call OnLoad at unexpected times + if (part?.partInfo?.partPrefab != null) + { + int moduleIndex = part.Modules.IndexOf(this); + var prefab = part.partInfo.partPrefab.modules[moduleIndex] as RSE_Module; + + SoundLayerGroups = prefab.SoundLayerGroups; + SoundLayers = prefab.SoundLayers; + return; + } + + // Do the actual parsing during part compilation. + + node.TryGetValue("volume", ref Volume); + node.TryGetValue("DopplerFactor", ref DopplerFactor); + + ConfigNode sim = null; + if (node.TryGetNode("AIRSIMULATION", ref sim)) + { + sim.TryGetValue("EnableCombFilter", ref EnableCombFilter); + sim.TryGetValue("EnableLowpassFilter", ref EnableLowpassFilter); + sim.TryGetValue("EnableDistortionFilter", ref EnableDistortionFilter); + + sim.TryGetEnum("UpdateMode", ref AirSimUpdateMode, AirSimulationUpdate.Full); + + sim.TryGetValue("FarLowpass", ref FarLowpass); + sim.TryGetValue("MaxCombDelay", ref MaxCombDelay); + sim.TryGetValue("MaxCombMix", ref MaxCombMix); + sim.TryGetValue("MaxDistortion", ref MaxDistortion); + sim.TryGetValue("AngleHighpass", ref AngleHighpass); + } + + UseAirSimulation = !(!EnableLowpassFilter && !EnableCombFilter && !EnableDistortionFilter); + + if (PrepareSoundLayers) + { + foreach (var lnode in node.GetNodes()) + { + var soundLayers = AudioUtility.CreateSoundLayerGroup(lnode.GetNodes("SOUNDLAYER")); + if (soundLayers.Count == 0) continue; + + var groupName = lnode.name; + + if (lnode.name == "SOUNDLAYERGROUP") + { + groupName = lnode.GetValue("name"); + } + + if (SoundLayerGroups.ContainsKey(groupName)) { SoundLayerGroups[groupName].AddRange(soundLayers); continue; } + + SoundLayerGroups.Add(groupName, soundLayers); + } + + SoundLayers = AudioUtility.CreateSoundLayerGroup(node.GetNodes("SOUNDLAYER")); + } + } } } diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_RCS.cs b/Source/RocketSoundEnhancement/PartModules/RSE_RCS.cs index 129f04e..f5d7b6a 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_RCS.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_RCS.cs @@ -7,12 +7,17 @@ public class RSE_RCS : RSE_Module { private ModuleRCSFX moduleRCSFX; + public RSE_RCS() + { + EnableLowpassFilter = true; + } + + public override void OnStart(StartState state) { if (state == StartState.Editor || state == StartState.None) return; - EnableLowpassFilter = true; base.OnStart(state); moduleRCSFX = part.Modules.GetModule(); diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_RotorEngines.cs b/Source/RocketSoundEnhancement/PartModules/RSE_RotorEngines.cs index dd16db9..5b5f70a 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_RotorEngines.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_RotorEngines.cs @@ -24,14 +24,18 @@ public class RSE_RotorEngines : RSE_Module private ModuleResourceIntake resourceIntake; private int childPartsCount = 0; + public RSE_RotorEngines() + { + EnableLowpassFilter = true; + EnableCombFilter = true; + EnableDistortionFilter = true; + } + public override void OnStart(StartState state) { if(state == StartState.Editor || state == StartState.None) return; - EnableLowpassFilter = true; - EnableCombFilter = true; - EnableDistortionFilter = true; base.OnStart(state); rotorModule = part.GetComponent(); @@ -58,8 +62,8 @@ public void SetupBlades() childPartsCount = childParts.Count; foreach (var childPart in childParts) { - var configNode = GameDatabase.Instance.GetConfigs("PART").FirstOrDefault(x => x.name.Replace("_", ".") == childPart.partInfo.name); - var propConfig = configNode.config.GetNode("RSE_Propellers"); + var configNode = childPart.partInfo.partConfig; + var propConfig = configNode.GetNode("RSE_Propellers"); if (propConfig != null) { diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs index 7850d74..bf37657 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs @@ -23,35 +23,18 @@ public class RSE_Wheels : RSE_Module private float wheelSpeed = 0; private float slipDisplacement = 0; + public RSE_Wheels() + { + EnableLowpassFilter = true; + } + public override void OnStart(StartState state) { if (state == StartState.Editor || state == StartState.None) return; - EnableLowpassFilter = true; base.OnStart(state); - if (PartConfigNode.HasNode("Motor")) - { - ConfigNode offLoadVolumeScaleNode; - if ((offLoadVolumeScaleNode = PartConfigNode.GetNode("Motor").GetNode("offLoadVolumeScale")) != null && offLoadVolumeScaleNode.HasValues()) - { - foreach (ConfigNode.Value node in offLoadVolumeScaleNode.values) - { - string soundLayerName = node.name; - float value = float.Parse(node.value); - - if (offLoadVolumeScale.ContainsKey(soundLayerName)) - { - offLoadVolumeScale[soundLayerName] = value; - continue; - } - - offLoadVolumeScale.Add(soundLayerName, value); - } - } - } - moduleWheel = part.GetComponent(); moduleMotor = part.GetComponent(); moduleDeploy = part.GetComponent(); @@ -188,5 +171,42 @@ public override void FixedUpdate() slipDisplacement = Mathf.Sqrt(x * x + y * y); } + + public override void OnLoad(ConfigNode node) + { + base.OnLoad(node); + + if (part?.partInfo?.partPrefab != null) + { + int moduleIndex = part.modules.IndexOf(this); + var prefab = part.partInfo.partPrefab.modules[moduleIndex] as RSE_Wheels; + offLoadVolumeScale = prefab.offLoadVolumeScale; + return; + } + + ConfigNode motor = null; + if (node.TryGetNode("Motor", ref motor)) + { + ConfigNode offLoadVolumeScaleNode = motor.GetNode("offLoadVolumeScale"); + + if (offLoadVolumeScaleNode != null && offLoadVolumeScaleNode.HasValue()) + { + foreach (ConfigNode.Value vnode in offLoadVolumeScaleNode.values) + { + string soundLayerName = vnode.name; + float value = float.Parse(vnode.value); + + if (offLoadVolumeScale.ContainsKey(soundLayerName)) + { + offLoadVolumeScale[soundLayerName] = value; + continue; + } + + offLoadVolumeScale.Add(soundLayerName, value); + } + } + } + } + } } diff --git a/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs b/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs index ec4a954..24bc4db 100644 --- a/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs +++ b/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs @@ -21,26 +21,19 @@ public class ShipEffectsCollisions : RSE_Module private CollidingObject collidingObject; private CollisionType collisionType; + public ShipEffectsCollisions() + { + PrepareSoundLayers = false; + EnableLowpassFilter = true; + } + public override void OnStart(StartState state) { if (state == StartState.Editor || state == StartState.None) return; - PrepareSoundLayers = false; - EnableLowpassFilter = true; base.OnStart(state); - foreach (var node in PartConfigNode.GetNodes()) - { - var soundLayerNodes = node.GetNodes("SOUNDLAYER"); - CollisionType collisionType; - - if (Enum.TryParse(node.name, out collisionType)) - { - SoundLayerCollisionGroups.Add(collisionType, AudioUtility.CreateSoundLayerGroup(soundLayerNodes)); - } - } - if (SoundLayerCollisionGroups.Count > 0) { foreach (var soundLayerGroup in SoundLayerCollisionGroups) @@ -121,5 +114,29 @@ public void OnCollisionExit(Collision col) collisionType = CollisionType.CollisionExit; collision = col; } + + public override void OnLoad(ConfigNode node) + { + base.OnLoad(node); + + if (part?.partInfo?.partPrefab != null) + { + int moduleIndex = part.modules.IndexOf(this); + var prefab = part.partInfo.partPrefab.modules[moduleIndex] as ShipEffectsCollisions; + + SoundLayerCollisionGroups = prefab.SoundLayerCollisionGroups; + return; + } + + foreach (var child in node.GetNodes()) + { + var soundLayerNodes = child.GetNodes("SOUNDLAYER"); + + if (Enum.TryParse(child.name, out CollisionType collisionType)) + { + SoundLayerCollisionGroups.Add(collisionType, AudioUtility.CreateSoundLayerGroup(soundLayerNodes)); + } + } + } } }