diff --git a/Source/Harmony/B9PS.cs b/Source/Harmony/B9PS.cs new file mode 100644 index 00000000..e502faf4 --- /dev/null +++ b/Source/Harmony/B9PS.cs @@ -0,0 +1,80 @@ +using HarmonyLib; +using UnityEngine; +using System.Linq; +using System.Collections.Generic; +using B9PartSwitch.PartSwitch.PartModifiers; +using B9PartSwitch; + +namespace RealFuels.Harmony +{ + [HarmonyPatch(typeof(ModuleModifierInfo))] + internal class PatchModuleModifierInfo + { + internal static bool Prepare() + { + bool foundB9PS = AssemblyLoader.loadedAssemblies.FirstOrDefault(a => a.name.Equals("B9PartSwitch", System.StringComparison.OrdinalIgnoreCase)) != null; + return foundB9PS; + } + + + [HarmonyPostfix] + [HarmonyPatch("CreatePartModifiers")] + internal static IEnumerable Postfix_handleMFTConfig(IEnumerable result, Part part, ModuleModifierInfo __instance, BaseEventDetails moduleDataChangedEventDetails) + { + foreach (var partModifier in result) + { + if (partModifier is ModuleDataHandlerBasic) + { + ModuleMatcher moduleMatcher = new ModuleMatcher(__instance.identifierNode); + PartModule module = moduleMatcher.FindModule(part); + ConfigNode originalNode = moduleMatcher.FindPrefabNode(module); + if (module.moduleName == "ModuleFuelTanks") + { + yield return new ModuleFuelTanksHandler(module, originalNode, __instance.dataNode, moduleDataChangedEventDetails); + continue; + } + } + yield return partModifier; + } + + } + } +} + +namespace B9PartSwitch.PartSwitch.PartModifiers +{ + public class ModuleFuelTanksHandler : PartModifierBase + { + public const string PART_ASPECT_LOCK = "ModuleFuelTanks"; + + private readonly PartModule module; + private readonly ConfigNode originalNode; + private readonly ConfigNode dataNode; + private readonly BaseEventDetails moduleDataChangedEventDetails; + public ModuleFuelTanksHandler(PartModule module, ConfigNode originalNode, ConfigNode dataNode, BaseEventDetails moduleDataChangedEventDetails) + { + this.module = module; + this.originalNode = originalNode; + this.dataNode = dataNode; + this.moduleDataChangedEventDetails = moduleDataChangedEventDetails; + } + + public object PartAspectLock => PART_ASPECT_LOCK; + public override string Description => "a part's ModuleFuelTanks"; + public override void DeactivateOnStartEditor() => Deactivate(); + public override void ActivateOnStartEditor() => Activate(); + public override void DeactivateOnSwitchEditor() => Deactivate(); + public override void ActivateOnSwitchEditor() => Activate(); + + private void Activate() => ApplyNode(dataNode); + private void Deactivate() => ApplyNode(originalNode); + + private void ApplyNode(ConfigNode sourceNode) + { + var evtDetails = new BaseEventDetails(BaseEventDetails.Sender.USER); + evtDetails.Set("MFTNode", sourceNode); + module.Events.Send("LoadMFTModuleFromConfigNode", evtDetails); + module.Events.Send("ModuleDataChanged", moduleDataChangedEventDetails); + } + } +} diff --git a/Source/Harmony/HarmonyPatcher.cs b/Source/Harmony/HarmonyPatcher.cs new file mode 100644 index 00000000..21e8172d --- /dev/null +++ b/Source/Harmony/HarmonyPatcher.cs @@ -0,0 +1,14 @@ +using UnityEngine; + +namespace RealFuels.Harmony +{ + [KSPAddon(KSPAddon.Startup.Instantly, true)] + public class HarmonyPatcher : MonoBehaviour + { + internal void Start() + { + var harmony = new HarmonyLib.Harmony("RealFuels.Harmony.HarmonyPatcher"); + harmony.PatchAll(); + } + } +} \ No newline at end of file diff --git a/Source/RealFuels.csproj b/Source/RealFuels.csproj index 0733d6c9..008361b3 100644 --- a/Source/RealFuels.csproj +++ b/Source/RealFuels.csproj @@ -38,9 +38,16 @@ x64 + + False + False + False + + False + ..\..\..\..\..\..\Games\R112\GameData\ROUtils\Plugins\ROUtils.dll False @@ -102,6 +109,8 @@ + +