/// <summary> /// Checks whether plugins have updated for a particular engine, thus necessitating that the engine parameters be fit again /// Checks version and checksum of SolverEngines and whichever assembly declares the type of engine /// Looks for values DeclaringAssemblyVersion, DeclaringAssemblyChecksum, SolverEnginesVersion, SolverEnginesAssemblyChecksum in node /// </summary> /// <param name="engine">Engine module to check. Only used to find its declaring assembly. Can be null</param> /// <param name="node">ConfigNode to check for versions and checksums</param> /// <returns></returns> public static bool PluginUpdateCheck(ModuleEnginesSolver engine, ConfigNode node) { bool result = false; if (engine != null) { Assembly assembly = engine.GetType().Assembly; result |= (AssemblyVersion(assembly) != node.GetValue("DeclaringAssemblyVersion")); result |= (AssemblyChecksum(assembly) != node.GetValue("DeclaringAssemblyChecksum")); } result |= (SolverEnginesVersion != node.GetValue("SolverEnginesVersion")); result |= (SolverEnginesAssemblyChecksum != node.GetValue("SolverEnginesAssemblyChecksum")); return(result); }
/// <summary> /// Searches for engine in the database /// </summary> /// <param name="engine">Engine module to search for. Will use engine class, part name, and engineID to identify it</param> /// <returns>ConfigNode associated with engine if found, otherwise null</returns> public static ConfigNode GetNodeForEngine(ModuleEnginesSolver engine) { string partName = engine.part.name; string engineType = engine.GetType().Name; string engineID = engine.engineID; ConfigNode partNode = database.GetNode(partName); if (partNode != null) { foreach (ConfigNode moduleNode in partNode.GetNodes(engineType)) { if (moduleNode.GetValue("engineID") == engineID) return moduleNode; } } return null; }
/// <summary> /// Searches for engine in the database /// </summary> /// <param name="engine">Engine module to search for. Will use engine class, part name, and engineID to identify it</param> /// <returns>ConfigNode associated with engine if found, otherwise null</returns> public static ConfigNode GetNodeForEngine(ModuleEnginesSolver engine) { string partName = engine.part.name; string engineType = engine.GetType().Name; string engineID = engine.engineID; ConfigNode partNode = database.GetNode(partName); if (partNode != null) { foreach (ConfigNode moduleNode in partNode.GetNodes(engineType)) { if (moduleNode.GetValue("engineID") == engineID) { return(moduleNode); } } } return(null); }
/// <summary> /// Store fitted engine parameters in the database so they can be accessed later /// </summary> /// <param name="engine">Engine to associated this config node with</param> /// <param name="node">Config node describing engine parameters (both input parameters and fitted parameters)</param> public static void SetNodeForEngine(ModuleEnginesSolver engine, ConfigNode node) { string partName = engine.part.name; string engineType = engine.GetType().Name; string engineID = engine.engineID; Assembly assembly = engine.GetType().Assembly; node.SetValue("engineID", engineID, true); node.SetValue("DeclaringAssemblyVersion", EngineDatabase.AssemblyVersion(assembly), true); node.SetValue("DeclaringAssemblyChecksum", EngineDatabase.AssemblyChecksum(assembly), true); node.SetValue("SolverEnginesVersion", SolverEnginesVersion, true); node.SetValue("SolverEnginesAssemblyChecksum", SolverEnginesAssemblyChecksum, true); ConfigNode partNode = database.GetNode(partName); int nodeIndex = 0; if (partNode != null) { ConfigNode[] moduleNodes = partNode.GetNodes(engineType); for (int i = 0; i < moduleNodes.Length; i++) { ConfigNode mNode = moduleNodes[i]; if (mNode.GetValue("engineID") == engineID) { nodeIndex = i; } } } else { partNode = new ConfigNode(partName); database.AddNode(partNode); nodeIndex = 0; } partNode.SetNode(engineType, node, nodeIndex, true); SaveDatabase(); }
/// <summary> /// Store fitted engine parameters in the database so they can be accessed later /// </summary> /// <param name="engine">Engine to associated this config node with</param> /// <param name="node">Config node describing engine parameters (both input parameters and fitted parameters)</param> public static void SetNodeForEngine(ModuleEnginesSolver engine, ConfigNode node) { string partName = engine.part.name; string engineType = engine.GetType().Name; string engineID = engine.engineID; Assembly assembly = engine.GetType().Assembly; node.SetValue("engineID", engineID, true); node.SetValue("DeclaringAssemblyVersion", EngineDatabase.AssemblyVersion(assembly), true); node.SetValue("DeclaringAssemblyChecksum", EngineDatabase.AssemblyChecksum(assembly), true); node.SetValue("SolverEnginesVersion", SolverEnginesVersion, true); node.SetValue("SolverEnginesAssemblyChecksum", SolverEnginesAssemblyChecksum, true); ConfigNode partNode = database.GetNode(partName); int nodeIndex = 0; if (partNode != null) { ConfigNode[] moduleNodes = partNode.GetNodes(engineType); for (int i = 0; i < moduleNodes.Length; i++ ) { ConfigNode mNode = moduleNodes[i]; if (mNode.GetValue("engineID") == engineID) { nodeIndex = i; } } } else { partNode = new ConfigNode(partName); database.AddNode(partNode); nodeIndex = 0; } partNode.SetNode(engineType, node, nodeIndex, true); SaveDatabase(); }
/// <summary> /// Checks whether plugins have updated for a particular engine, thus necessitating that the engine parameters be fit again /// Checks version and checksum of SolverEngines and whichever assembly declares the type of engine /// Looks for values DeclaringAssemblyVersion, DeclaringAssemblyChecksum, SolverEnginesVersion, SolverEnginesAssemblyChecksum in node /// </summary> /// <param name="engine">Engine module to check. Only used to find its declaring assembly. Can be null</param> /// <param name="node">ConfigNode to check for versions and checksums</param> /// <returns></returns> public static bool PluginUpdateCheck(ModuleEnginesSolver engine, ConfigNode node) { bool result = false; if (engine != null) { Assembly assembly = engine.GetType().Assembly; result |= (AssemblyVersion(assembly) != node.GetValue("DeclaringAssemblyVersion")); result |= (AssemblyChecksum(assembly) != node.GetValue("DeclaringAssemblyChecksum")); } result |= (SolverEnginesVersion != node.GetValue("SolverEnginesVersion")); result |= (SolverEnginesAssemblyChecksum != node.GetValue("SolverEnginesAssemblyChecksum")); return result; }
private void FixedUpdate() { if (!HighLogic.LoadedSceneIsFlight || !vessel) { return; } if (vessel.altitude > vessel.mainBody.atmosphereDepth) { return; } int newCount = vessel.Parts.Count; if (partsCount != newCount) { partsCount = newCount; updatePartsList(); } InletArea = 0d; EngineArea = 0d; OverallTPR = 0d; AreaRatio = 0d; for (int j = engineList.Count - 1; j >= 0; --j) { ModuleEnginesSolver e = engineList[j]; if ((object)e != null && e.EngineIgnited) { EngineArea += e.Need_Area; } } for (int j = inletList.Count - 1; j >= 0; --j) { AJEInlet i = inletList[j]; if ((object)i != null) { double area = i.UsableArea(); InletArea += area; OverallTPR += area * i.overallTPR; } } if (InletArea > 0d) { if (EngineArea > 0d) { AreaRatio = Math.Min(1d, InletArea / EngineArea); OverallTPR /= InletArea; OverallTPR *= AreaRatio; } else { AreaRatio = 1d; } } AmbientTherm.FromVesselAmbientConditions(vessel); Mach = vessel.mach; // Transform from static frame to vessel frame, increasing total pressure and temperature if (vessel.srfSpeed < 0.01d) { InletTherm.CopyFrom(AmbientTherm); } else { InletTherm.FromChangeReferenceFrame(AmbientTherm, vessel.srfSpeed); } InletTherm.P *= OverallTPR; // TPR accounts for loss of total pressure by inlet // Push parameters to each engine for (int i = engineList.Count - 1; i >= 0; --i) { engineList[i].UpdateInletEffects(InletTherm, AreaRatio, OverallTPR); } }
protected void InitializeThrustTransforms() { if (thrustTransformInfos == null && part.partInfo != null && part.partInfo.partPrefab != null && part.partInfo.partPrefab != this) { ModuleEnginesSolver prefabModule = null; for (int i = 0; i < part.partInfo.partPrefab.Modules.Count; i++) { ModuleEnginesSolver m = part.partInfo.partPrefab.Modules[i] as ModuleEnginesSolver; if (m == null) { continue; } if (m.engineID != engineID) { continue; } prefabModule = m; break; } if (prefabModule == null) { Debug.LogError($"[{GetType().Name}] unable to find prefab module"); return; } thrustTransformInfos = prefabModule.thrustTransformInfos; } if (thrustTransformInfos == null) { return; } thrustTransforms.Clear(); thrustTransformMultipliers.Clear(); float normalization = 0; foreach (ThrustTransformInfo info in thrustTransformInfos) { Transform[] transforms = part.FindModelTransforms(info.transformName); if (transforms.Length == 0) { Debug.LogError($"[{GetType().Name}] no transforms named {info.transformName} found"); continue; } if (info.multipliers != null && transforms.Length != info.multipliers.Length) { Debug.LogError($"[{GetType().Name}] found {transforms.Length} transforms named {info.transformName} but got {info.multipliers.Length} multipliers"); continue; } for (int i = 0; i < transforms.Length; i++) { thrustTransforms.Add(transforms[i]); float multiplier = info.overallMultiplier; if (info.multipliers != null) { multiplier *= info.multipliers[i]; } thrustTransformMultipliers.Add(multiplier); normalization += multiplier; } } if (normalization == 0) { normalization = 1; } for (int i = 0; i < thrustTransformMultipliers.Count; i++) { thrustTransformMultipliers[i] /= normalization; } }
public EngineParameterInfo(ModuleEnginesSolver module, FieldInfo field, EngineParameter param) { Module = module; Field = field; Param = param; }
public EngineParameterInfo(ModuleEnginesSolver module, FieldInfo field, EngineParameter param) { Module = module; Field = field; Param = param; }