From 97331a824ea8c324fcee8aedca253b98baa9fa4f Mon Sep 17 00:00:00 2001 From: bimo1d <87145105+bimo1d@users.noreply.github.com> Date: Thu, 7 May 2026 08:19:29 +0300 Subject: [PATCH 1/2] ShipEffects: skip heavy Initialize for debris vessels Adds an early-exit for vesselType Debris/SpaceObject/DroppedPart in Initialize. Avoids ~150-200ms main-thread hitch on every multi-part separation in vacuum (5 new vessels x 33 sound layers each). Subscribes to GameEvents.onVesselTypeChange so debris that promotes to a real vessel (kerbal boarding a stranded vessel etc.) gets a clean reinit. --- Source/RocketSoundEnhancement/ShipEffects.cs | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Source/RocketSoundEnhancement/ShipEffects.cs b/Source/RocketSoundEnhancement/ShipEffects.cs index 2dee3d5..22736f6 100644 --- a/Source/RocketSoundEnhancement/ShipEffects.cs +++ b/Source/RocketSoundEnhancement/ShipEffects.cs @@ -65,6 +65,16 @@ public bool Initialize() noPhysics = vessel.Parts[0].PhysicsSignificance == 1; return true; } + // Debris vessels have no engines, no command modules — nothing useful to play sounds for. + // Reinit if vesselType promotes (e.g. kerbal boards a stranded vessel). + if (vessel.vesselType == VesselType.Debris || + vessel.vesselType == VesselType.SpaceObject || + vessel.vesselType == VesselType.DroppedPart) + { + ignoreVessel = true; + GameEvents.onVesselTypeChange.Add(OnVesselTypeChange); + return true; + } if (ShipEffectsConfig.ShipEffectsConfigNode.Count > 0) { @@ -138,6 +148,19 @@ private void OnVesselPartCountChanged(Vessel data) CacheVesselData(); } + private void OnVesselTypeChange(Vessel data, VesselType newType) + { + if (data != vessel) return; + if (newType == VesselType.Debris || + newType == VesselType.SpaceObject || + newType == VesselType.DroppedPart) + return; + + GameEvents.onVesselTypeChange.Remove(OnVesselTypeChange); + ignoreVessel = false; + initialized = false; + initialized = Initialize(); + } IEnumerator SetupAudioSources(List soundLayers, bool hasAirSimFilter = true) { @@ -189,6 +212,7 @@ public void Unload() asteroidParts.Clear(); engines.Clear(); GameEvents.onVesselPartCountChanged.Remove(OnVesselPartCountChanged); + GameEvents.onVesselTypeChange.Remove(OnVesselTypeChange); initialized = false; } From 62a37a620ed0e45fa6d2e80af330bf4ade0c035a Mon Sep 17 00:00:00 2001 From: bimo1d <87145105+bimo1d@users.noreply.github.com> Date: Thu, 7 May 2026 21:48:02 +0300 Subject: [PATCH 2/2] Drop onVesselTypeChange handler - no such GameEvent in KSP API Removed the re-init handler. Promoted debris (kerbal boarding a stranded vessel) will stay silent until vessel reload - accepted as edge case. Matches existing single-part asteroid behavior, which also doesn't reinit on promotion. --- Source/RocketSoundEnhancement/ShipEffects.cs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/Source/RocketSoundEnhancement/ShipEffects.cs b/Source/RocketSoundEnhancement/ShipEffects.cs index 22736f6..5997340 100644 --- a/Source/RocketSoundEnhancement/ShipEffects.cs +++ b/Source/RocketSoundEnhancement/ShipEffects.cs @@ -65,14 +65,13 @@ public bool Initialize() noPhysics = vessel.Parts[0].PhysicsSignificance == 1; return true; } - // Debris vessels have no engines, no command modules — nothing useful to play sounds for. - // Reinit if vesselType promotes (e.g. kerbal boards a stranded vessel). + + // Debris vessels have no engines, no command modules — nothing useful to play sounds for. if (vessel.vesselType == VesselType.Debris || vessel.vesselType == VesselType.SpaceObject || vessel.vesselType == VesselType.DroppedPart) { ignoreVessel = true; - GameEvents.onVesselTypeChange.Add(OnVesselTypeChange); return true; } @@ -148,19 +147,6 @@ private void OnVesselPartCountChanged(Vessel data) CacheVesselData(); } - private void OnVesselTypeChange(Vessel data, VesselType newType) - { - if (data != vessel) return; - if (newType == VesselType.Debris || - newType == VesselType.SpaceObject || - newType == VesselType.DroppedPart) - return; - - GameEvents.onVesselTypeChange.Remove(OnVesselTypeChange); - ignoreVessel = false; - initialized = false; - initialized = Initialize(); - } IEnumerator SetupAudioSources(List soundLayers, bool hasAirSimFilter = true) { @@ -212,7 +198,6 @@ public void Unload() asteroidParts.Clear(); engines.Clear(); GameEvents.onVesselPartCountChanged.Remove(OnVesselPartCountChanged); - GameEvents.onVesselTypeChange.Remove(OnVesselTypeChange); initialized = false; }