From 71628343e24ee214ce9fbf3a8e7bcdac86cfc466 Mon Sep 17 00:00:00 2001 From: Ben Robinson Date: Tue, 3 Mar 2020 20:34:32 -0500 Subject: [PATCH 1/4] Try special handling for ModuleFuelTanks --- B9PartSwitch/PartSwitch/ModuleModifierInfo.cs | 3 ++ .../PartModifiers/ModuleDataHandlerBasic.cs | 37 ++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/B9PartSwitch/PartSwitch/ModuleModifierInfo.cs b/B9PartSwitch/PartSwitch/ModuleModifierInfo.cs index 910d2da5..5b5fab6f 100644 --- a/B9PartSwitch/PartSwitch/ModuleModifierInfo.cs +++ b/B9PartSwitch/PartSwitch/ModuleModifierInfo.cs @@ -139,6 +139,9 @@ public IEnumerable CreatePartModifiers(Part part, PartModule pare yield return new ModuleOutputResourceResetter(module); yield return new ModuleDataHandlerBasic(module, originalNode, dataNode, moduleDataChangedEventDetails); } + else if (moduleName == "ModuleFuelTanks") { + yield return new ModuleFuelTanksHandler(module, originalNode, dataNode); + } else yield return new ModuleDataHandlerBasic(module, originalNode, dataNode, moduleDataChangedEventDetails); } diff --git a/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs b/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs index db2d46a1..2aaaed78 100644 --- a/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs +++ b/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; namespace B9PartSwitch.PartSwitch.PartModifiers { @@ -34,16 +35,48 @@ public ModuleDataHandlerBasic(PartModule module, ConfigNode originalNode, Config public override void OnWillBeCopiedActiveSubtype() => Deactivate(); public override void OnWasCopiedActiveSubtype() => Activate(); - private void Activate() + protected virtual void Activate() { module.Load(dataNode); module.Events.Send("ModuleDataChanged", moduleDataChangedEventDetails); } - private void Deactivate() + protected virtual void Deactivate() { module.Load(originalNode); module.Events.Send("ModuleDataChanged", moduleDataChangedEventDetails); } } + + public class ModuleFuelTanksHandler : ModuleDataHandlerBasic + { + public ModuleFuelTanksHandler( + PartModule module, ConfigNode originalNode, ConfigNode dataNode + ) : base(module, originalNode, dataNode) + { } + + protected override void Activate() => applyNode(dataNode); + protected override void Deactivate() => applyNode(originalNode); + + private void applyNode(ConfigNode sourceNode) { + double volume = 0; + bool setsVolume = sourceNode.TryGetValue("volume", ref volume); + string type = null; + bool setsType = sourceNode.TryGetValue("type", ref type); + + if (setsVolume) { + Type ModuleFuelTanks = module.GetType(); + FieldInfo volumeField = ModuleFuelTanks.GetField("volume"); + double curVolume = (double)volumeField.GetValue(module); + if (volume != curVolume) { + MethodInfo changeVolume = ModuleFuelTanks.GetMethod("ChangeVolume"); + changeVolume.Invoke(module, new object[]{ volume }); + } + } + if (setsType) { + module.Fields.SetValue("type", type); + } + } + } } + From 389b1396b34328fb9339c8e72d037f08bfec1bd2 Mon Sep 17 00:00:00 2001 From: Ben Robinson Date: Wed, 4 Mar 2020 22:18:21 -0500 Subject: [PATCH 2/4] Set volume with event instead of reflection --- .../PartModifiers/ModuleDataHandlerBasic.cs | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs b/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs index 2aaaed78..f81f5218 100644 --- a/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs +++ b/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs @@ -1,5 +1,4 @@ using System; -using System.Reflection; namespace B9PartSwitch.PartSwitch.PartModifiers { @@ -65,13 +64,18 @@ private void applyNode(ConfigNode sourceNode) { bool setsType = sourceNode.TryGetValue("type", ref type); if (setsVolume) { - Type ModuleFuelTanks = module.GetType(); - FieldInfo volumeField = ModuleFuelTanks.GetField("volume"); - double curVolume = (double)volumeField.GetValue(module); - if (volume != curVolume) { - MethodInfo changeVolume = ModuleFuelTanks.GetMethod("ChangeVolume"); - changeVolume.Invoke(module, new object[]{ volume }); - } + // Update the tank volume by sending a volume-change event in the format that Procedural Parts uses. + // Procedural Parts reports the outside volume of the tank in cubic meters (or equivalently, + // kiloliters). ModuleFuelTanks scales the reported volume by the `tankVolumeConversion` and + // `utilization` fields to compute the available internal volume in liters. + // Since the `volume` configuration field is meant to set the available volume in liters directly, + // we need to read the scaling values and apply the inverse scaling to the value that we send. + float scaleFactor = module.Fields.GetValue("tankVolumeConversion"); + float utilization = module.Fields.GetValue("utilization"); + var evtDetails = new BaseEventDetails(BaseEventDetails.Sender.USER); + evtDetails.Set("volName", "Tankage"); + evtDetails.Set("newTotalVolume", volume * 100 / utilization / scaleFactor); + module.part.SendEvent("OnPartVolumeChanged", evtDetails, 0); } if (setsType) { module.Fields.SetValue("type", type); From cdd100dd9c37931a04be7c65fb8f2f21c50a5227 Mon Sep 17 00:00:00 2001 From: Ben Robinson Date: Fri, 3 Apr 2020 13:16:42 -0400 Subject: [PATCH 3/4] Send ModuleDataChanged from ModuleFuelTanks handler --- B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs b/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs index f81f5218..a5155000 100644 --- a/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs +++ b/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs @@ -80,6 +80,7 @@ private void applyNode(ConfigNode sourceNode) { if (setsType) { module.Fields.SetValue("type", type); } + module.Events.Send("ModuleDataChanged", moduleDataChangedEventDetails); } } } From 22736d7c66126f0ba931fba2b5ca7e1421afa69d Mon Sep 17 00:00:00 2001 From: Ben Robinson Date: Fri, 3 Apr 2020 13:32:52 -0400 Subject: [PATCH 4/4] Fix added/removed variables --- B9PartSwitch/PartSwitch/ModuleModifierInfo.cs | 4 ++-- .../PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/B9PartSwitch/PartSwitch/ModuleModifierInfo.cs b/B9PartSwitch/PartSwitch/ModuleModifierInfo.cs index 5b5fab6f..12579353 100644 --- a/B9PartSwitch/PartSwitch/ModuleModifierInfo.cs +++ b/B9PartSwitch/PartSwitch/ModuleModifierInfo.cs @@ -139,8 +139,8 @@ public IEnumerable CreatePartModifiers(Part part, PartModule pare yield return new ModuleOutputResourceResetter(module); yield return new ModuleDataHandlerBasic(module, originalNode, dataNode, moduleDataChangedEventDetails); } - else if (moduleName == "ModuleFuelTanks") { - yield return new ModuleFuelTanksHandler(module, originalNode, dataNode); + else if (module.moduleName == "ModuleFuelTanks") { + yield return new ModuleFuelTanksHandler(module, originalNode, dataNode, moduleDataChangedEventDetails); } else yield return new ModuleDataHandlerBasic(module, originalNode, dataNode, moduleDataChangedEventDetails); diff --git a/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs b/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs index a5155000..373579f3 100644 --- a/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs +++ b/B9PartSwitch/PartSwitch/PartModifiers/ModuleDataHandlerBasic.cs @@ -8,7 +8,7 @@ public class ModuleDataHandlerBasic : PartModifierBase protected readonly ConfigNode originalNode; protected readonly ConfigNode dataNode; - private readonly BaseEventDetails moduleDataChangedEventDetails; + protected readonly BaseEventDetails moduleDataChangedEventDetails; public ModuleDataHandlerBasic(PartModule module, ConfigNode originalNode, ConfigNode dataNode, BaseEventDetails moduleDataChangedEventDetails) { @@ -50,8 +50,8 @@ protected virtual void Deactivate() public class ModuleFuelTanksHandler : ModuleDataHandlerBasic { public ModuleFuelTanksHandler( - PartModule module, ConfigNode originalNode, ConfigNode dataNode - ) : base(module, originalNode, dataNode) + PartModule module, ConfigNode originalNode, ConfigNode dataNode, BaseEventDetails moduleDataChangedEventDetails + ) : base(module, originalNode, dataNode, moduleDataChangedEventDetails) { } protected override void Activate() => applyNode(dataNode);