diff --git a/Source/Modules/ModuleCoPFollowTransform.cs b/Source/Modules/ModuleCoPFollowTransform.cs index 56277ee..8784762 100644 --- a/Source/Modules/ModuleCoPFollowTransform.cs +++ b/Source/Modules/ModuleCoPFollowTransform.cs @@ -15,21 +15,43 @@ public class ModuleCoPFollowTransform : PartModule [KSPField] public string transformName; + [SerializeField] private Transform followTransform; public override void OnLoad(ConfigNode node) { - base.OnLoad(node); - if (HighLogic.LoadedScene != GameScenes.LOADING) + if (followTransform == null || followTransform.name != transformName) { if (transformName != null) followTransform = part.FindModelTransform(transformName); - if (followTransform == null) Debug.LogError($"[{MODULENAME}] transformName was empty or does not exist."); + if (followTransform == null) Debug.LogError($"[{MODULENAME}] transformName '{transformName}' was empty or does not exist on part '{part.partInfo?.name}'"); } + + if (followTransform == null && part.partInfo != null) + { + // this may be important if someone is swapping out versions of this module with B9PS + // Note this probably isn't correct for parts that also have modules that mess with this field (e.g. ModuleProceduralFairing) + part.CoPOffset = part.partInfo.partPrefab.CoPOffset; + } + + // NOTE: isEnabled will be persisted to the save file, but we want to treat it purely as runtime state + this.isEnabled = followTransform != null; + this.enabled = followTransform != null && HighLogic.LoadedSceneIsFlight; } public void FixedUpdate() { - if (followTransform != null) part.CoPOffset = part.transform.InverseTransformPoint(followTransform.position); + // Note that we shouldn't ever get here if the transform just didn't exist + // But it's certainly possible for *something* to delete it later + if (followTransform == null) + { + isEnabled = false; + enabled = false; + // should we reset CoPOffset here? Not sure. + } + else + { + part.CoPOffset = part.transform.InverseTransformPoint(followTransform.position); + } } } }