From 94707cf118269ed22b81a55db83045d44f629dc8 Mon Sep 17 00:00:00 2001 From: Phantomical Date: Tue, 21 Oct 2025 19:53:20 -0700 Subject: [PATCH 1/6] perf: Minimal change to avoid iterating over every PART node --- Source/RocketSoundEnhancement/AudioUtility.cs | 21 ------------------- .../PartModules/RSE_Module.cs | 18 +++++++++++++++- .../PartModules/RSE_RotorEngines.cs | 4 ++-- 3 files changed, 19 insertions(+), 24 deletions(-) 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_Module.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs index 208a915..812adad 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs @@ -53,7 +53,6 @@ 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; @@ -338,5 +337,22 @@ public virtual void OnDestroy() } Destroy(AudioParent); } + + public override void OnLoad(ConfigNode node) + { + base.OnLoad(node); + + if (part.partInfo is null) + { + PartConfigNode = node; + } + else + { + PartConfigNode = part.partInfo.partPrefab + .FindModuleImplementing() + .PartConfigNode; + } + } + } } diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_RotorEngines.cs b/Source/RocketSoundEnhancement/PartModules/RSE_RotorEngines.cs index dd16db9..f26d368 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_RotorEngines.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_RotorEngines.cs @@ -58,8 +58,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) { From 10444f5cee1af7a2467b4de3b599d5cd501b3395 Mon Sep 17 00:00:00 2001 From: Phantomical Date: Tue, 21 Oct 2025 20:00:06 -0700 Subject: [PATCH 2/6] chore: Move defaults to module constructors --- .../PartModules/RSE_Coupler.cs | 8 ++++++-- .../PartModules/RSE_Engines.cs | 12 ++++++++---- .../PartModules/RSE_KerbalEVA.cs | 6 +++++- .../RocketSoundEnhancement/PartModules/RSE_Module.cs | 1 - Source/RocketSoundEnhancement/PartModules/RSE_RCS.cs | 7 ++++++- .../PartModules/RSE_RotorEngines.cs | 10 +++++++--- .../RocketSoundEnhancement/PartModules/RSE_Wheels.cs | 6 +++++- .../PartModules/ShipEffectsCollisions.cs | 9 ++++++--- 8 files changed, 43 insertions(+), 16 deletions(-) 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 812adad..96526f0 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs @@ -353,6 +353,5 @@ public override void OnLoad(ConfigNode node) .PartConfigNode; } } - } } 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 f26d368..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(); diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs index 7850d74..1ce772b 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs @@ -23,12 +23,16 @@ 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")) diff --git a/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs b/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs index ec4a954..80c2162 100644 --- a/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs +++ b/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs @@ -21,13 +21,16 @@ 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()) From 984e043cc37000381172226f07f721ffbfa263d7 Mon Sep 17 00:00:00 2001 From: Phantomical Date: Tue, 21 Oct 2025 20:24:59 -0700 Subject: [PATCH 3/6] perf: Move config parsing to the LOADING scene This moves the entire config node parsing process to happen only during part compilation. --- .../PartModules/RSE_Module.cs | 100 +++++++++--------- .../PartModules/RSE_Wheels.cs | 57 ++++++---- .../PartModules/ShipEffectsCollisions.cs | 35 ++++-- 3 files changed, 111 insertions(+), 81 deletions(-) diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs index 96526f0..e4030b1 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; @@ -54,49 +54,8 @@ public override void OnStart(StartState state) string partParentName = part.name + "_" + this.moduleName; AudioParent = AudioUtility.CreateAudioParent(part, partParentName); - 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) @@ -262,7 +221,7 @@ public void PlaySoundLayer(SoundLayer soundLayer, float control, float volume, b if (source.isPlaying && soundLayer.loop) source.volume = 0; - + return; } @@ -342,15 +301,58 @@ public override void OnLoad(ConfigNode node) { base.OnLoad(node); - if (part.partInfo is null) + if (part?.partInfo?.partPrefab != null) + { + var prefab = part.partInfo.partPrefab.FindModuleImplementing(); + + 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)) { - PartConfigNode = node; + 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); } - else + + UseAirSimulation = !(!EnableLowpassFilter && !EnableCombFilter && !EnableDistortionFilter); + + if (PrepareSoundLayers) { - PartConfigNode = part.partInfo.partPrefab - .FindModuleImplementing() - .PartConfigNode; + 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_Wheels.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs index 1ce772b..d1e2728 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs @@ -35,27 +35,6 @@ public override void OnStart(StartState state) 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(); @@ -192,5 +171,41 @@ 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) + { + var prefab = part.partInfo.partPrefab.FindModuleImplementing(); + 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 80c2162..45efc95 100644 --- a/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs +++ b/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs @@ -31,18 +31,8 @@ public override void OnStart(StartState state) { if (state == StartState.Editor || state == StartState.None) return; - 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)); - } - } + base.OnStart(state); if (SoundLayerCollisionGroups.Count > 0) { @@ -124,5 +114,28 @@ public void OnCollisionExit(Collision col) collisionType = CollisionType.CollisionExit; collision = col; } + + public override void OnLoad(ConfigNode node) + { + base.OnLoad(node); + + if (part?.partInfo?.partPrefab != null) + { + var prefab = part.partInfo.partPrefab.FindModuleImplementing(); + + 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)); + } + } + } } } From 9dadb3f64146a6c142fcd43ede8e33c67323e86e Mon Sep 17 00:00:00 2001 From: JonnyOThan Date: Wed, 22 Oct 2025 10:18:08 -0400 Subject: [PATCH 4/6] look up module prefab by index --- Source/RocketSoundEnhancement/PartModules/RSE_Module.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs index e4030b1..18994c5 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs @@ -303,7 +303,8 @@ public override void OnLoad(ConfigNode node) if (part?.partInfo?.partPrefab != null) { - var prefab = part.partInfo.partPrefab.FindModuleImplementing(); + int moduleIndex = part.Modules.IndexOf(this); + var prefab = part.partInfo.partPrefab.modules[moduleIndex] as RSE_Module; SoundLayerGroups = prefab.SoundLayerGroups; SoundLayers = prefab.SoundLayers; From b8013f46ed0456fe12af06b77e4a42def041a06f Mon Sep 17 00:00:00 2001 From: JonnyOThan Date: Wed, 22 Oct 2025 10:19:22 -0400 Subject: [PATCH 5/6] add a comment for future concerns --- Source/RocketSoundEnhancement/PartModules/RSE_Module.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs index 18994c5..d628882 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Module.cs @@ -301,6 +301,7 @@ 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); From 2aed7648a2343cd0280d8fa3e5f65727dbb81efa Mon Sep 17 00:00:00 2001 From: JonnyOThan Date: Wed, 22 Oct 2025 10:25:07 -0400 Subject: [PATCH 6/6] more use of moduleindex --- Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs | 5 +++-- .../PartModules/ShipEffectsCollisions.cs | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs b/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs index d1e2728..bf37657 100644 --- a/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs +++ b/Source/RocketSoundEnhancement/PartModules/RSE_Wheels.cs @@ -178,8 +178,9 @@ public override void OnLoad(ConfigNode node) if (part?.partInfo?.partPrefab != null) { - var prefab = part.partInfo.partPrefab.FindModuleImplementing(); - offLoadVolumeScale = prefab.offLoadVolumeScale; + int moduleIndex = part.modules.IndexOf(this); + var prefab = part.partInfo.partPrefab.modules[moduleIndex] as RSE_Wheels; + offLoadVolumeScale = prefab.offLoadVolumeScale; return; } diff --git a/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs b/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs index 45efc95..24bc4db 100644 --- a/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs +++ b/Source/RocketSoundEnhancement/PartModules/ShipEffectsCollisions.cs @@ -121,9 +121,10 @@ public override void OnLoad(ConfigNode node) if (part?.partInfo?.partPrefab != null) { - var prefab = part.partInfo.partPrefab.FindModuleImplementing(); + int moduleIndex = part.modules.IndexOf(this); + var prefab = part.partInfo.partPrefab.modules[moduleIndex] as ShipEffectsCollisions; - SoundLayerCollisionGroups = prefab.SoundLayerCollisionGroups; + SoundLayerCollisionGroups = prefab.SoundLayerCollisionGroups; return; }