From 898cb24170c64f0f898d6a5cee1c4d08342eb2a3 Mon Sep 17 00:00:00 2001 From: Thomas Ralph Date: Fri, 22 May 2026 16:20:21 -0400 Subject: [PATCH] Use reflection for MJ target/hidden fields to support pre- and post-2.15 The original 'target' -> 'Target' & 'hidden' -> 'Hidden' changes work on MJ 2.15 and later. Per the #439 discussion, this resolves the renamed fields reflectively under either casing, so the integration works on both pre-2.15 and 2.15+ MechJeb. If neither name resolves, the failure logged. --- SCANmechjeb/SCANmechjeb.cs | 46 +++++++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/SCANmechjeb/SCANmechjeb.cs b/SCANmechjeb/SCANmechjeb.cs index f98c2c73..dcb5381a 100644 --- a/SCANmechjeb/SCANmechjeb.cs +++ b/SCANmechjeb/SCANmechjeb.cs @@ -35,6 +35,45 @@ class SCANmechjeb : MonoBehaviour private SCANdata data; private Vector2d coords = new Vector2d(); private bool shutdown, mjOnboard, mjTechTreeLocked; + + #region Helpers + + /// + /// Reflectively fetches MechJebCore's target controller, tolerating the + /// 'Target'/'target' field rename across MechJeb versions. Returns null + /// (and logs) if the field can't be resolved under any known name. + /// + private static MechJebModuleTargetController GetMJCoreTarget(MechJebCore mjc) + { + var t = mjc.GetType(); + var field = t.GetField("Target") ?? t.GetField("target"); + if (field == null) + { + KSPBuildTools.Log.Message( + "MechJebCore 'target' field could not be found under any known name; MechJeb support broken."); + } + + return field?.GetValue(mjc) as MechJebModuleTargetController; + } + + /// + /// Reflectively reads the guidance module's hidden flag, tolerating the + /// 'Hidden'/'hidden' field rename across MechJeb versions. Returns null + /// (and logs) if the field can't be resolved under any known name. + /// + private static bool? IsMJGuidanceModuleHidden(DisplayModule gm) + { + var t = gm.GetType(); + var field = t.GetField("Hidden") ?? t.GetField("hidden"); + if (field == null) + { + KSPBuildTools.Log.Message( + "MechJebGuidanceModule 'hidden' field could not be found under any known name; MechJeb support broken."); + } + return field?.GetValue(gm) as bool?; + } + + #endregion private void Start() { @@ -227,8 +266,8 @@ private void RefereshAfterVesselChange() return; } - target = mjCore.target; - + target = GetMJCoreTarget(mjCore); + if (target == null) { SCANcontroller.controller.MechJebLoaded = false; @@ -256,7 +295,8 @@ private void RefereshAfterVesselChange() guidanceModule.UnlockCheck(); - if (guidanceModule.hidden) + var hidden = IsMJGuidanceModuleHidden(guidanceModule); + if (hidden ?? true) // Defaults to a hidden state if the field cannot be found { SCANcontroller.controller.MechJebLoaded = false; way = null;