public static PartSim New(Part p, int id, double atmosphere, LogMsg log) { PartSim partSim = pool.Borrow(); partSim.part = p; partSim.centerOfMass = p.transform.TransformPoint(p.CoMOffset); partSim.partId = id; partSim.name = p.partInfo.name; if (log != null) { log.AppendLine("Create PartSim for ", partSim.name); } partSim.parent = null; partSim.parentAttach = p.attachMode; partSim.fuelCrossFeed = p.fuelCrossFeed; partSim.noCrossFeedNodeKey = p.NoCrossFeedNodeKey; partSim.isEnginePlate = IsEnginePlate(p); if (partSim.isEnginePlate) { partSim.noCrossFeedNodeKey = "bottom"; //sadly this only works in one direction. } partSim.decoupledInStage = partSim.DecoupledInStage(p); partSim.isFuelLine = p.HasModule <CModuleFuelLine>(); partSim.isSepratron = partSim.IsSepratron(); partSim.inverseStage = p.inverseStage; if (log != null) { log.AppendLine("inverseStage = ", partSim.inverseStage); } partSim.resPriorityOffset = p.resourcePriorityOffset; partSim.resPriorityUseParentInverseStage = p.resourcePriorityUseParentInverseStage; partSim.resRequestRemainingThreshold = p.resourceRequestRemainingThreshold; partSim.baseCost = p.GetCostDry(); if (log != null) { log.AppendLine("Parent part = ", (p.parent == null ? "null" : p.parent.partInfo.name)) .AppendLine("physicalSignificance = ", p.physicalSignificance) .AppendLine("PhysicsSignificance = ", p.PhysicsSignificance); } // Work out if the part should have no physical significance // The root part is never "no physics" partSim.isNoPhysics = p.physicalSignificance == Part.PhysicalSignificance.NONE || p.PhysicsSignificance == 1; if (p.HasModule <LaunchClamp>()) { partSim.realMass = 0d; if (log != null) { log.AppendLine("Ignoring mass of launch clamp"); } } else { partSim.crewMassOffset = p.getCrewAdjustment(); partSim.realMass = p.mass + partSim.crewMassOffset; if (log != null) { log.AppendLine("Using part.mass of " + partSim.realMass); } } partSim.postStageMassAdjust = 0f; if (log != null) { log.AppendLine("Calculating postStageMassAdjust, prefabMass = ", p.prefabMass); } int count = p.Modules.Count; for (int i = 0; i < count; i++) { if (log != null) { log.AppendLine("Module: ", p.Modules[i].moduleName); } IPartMassModifier partMassModifier = p.Modules[i] as IPartMassModifier; if (partMassModifier != null) { if (log != null) { log.AppendLine("ChangeWhen = ", partMassModifier.GetModuleMassChangeWhen()); } if (partMassModifier.GetModuleMassChangeWhen() == ModifierChangeWhen.STAGED) { float preStage = partMassModifier.GetModuleMass(p.prefabMass, ModifierStagingSituation.UNSTAGED); float postStage = partMassModifier.GetModuleMass(p.prefabMass, ModifierStagingSituation.STAGED); if (log != null) { log.AppendLine("preStage = ", preStage, " postStage = ", postStage); } partSim.postStageMassAdjust += (postStage - preStage); } } } if (log != null) { log.AppendLine("postStageMassAdjust = ", partSim.postStageMassAdjust); } if (log != null) { log.AppendLine("crewMassOffset = ", partSim.crewMassOffset); } for (int i = 0; i < p.Resources.Count; i++) { PartResource resource = p.Resources[i]; // Make sure it isn't NaN as this messes up the part mass and hence most of the values // This can happen if a resource capacity is 0 and tweakable if (!Double.IsNaN(resource.amount)) { if (log != null) { log.AppendLine(resource.resourceName, " = ", resource.amount); } partSim.resources.Add(resource.info.id, resource.amount); partSim.resourceFlowStates.Add(resource.info.id, resource.flowState ? 1 : 0); } else { if (log != null) { log.AppendLine(resource.resourceName, " is NaN. Skipping."); } } } partSim.hasVessel = (p.vessel != null); partSim.isLanded = partSim.hasVessel && p.vessel.Landed; if (partSim.hasVessel) { partSim.vesselName = p.vessel.vesselName; partSim.vesselType = p.vesselType; } partSim.initialVesselName = p.initialVesselName; partSim.hasMultiModeEngine = p.HasModule <MultiModeEngine>(); partSim.hasModuleEngines = p.HasModule <ModuleEngines>(); partSim.isEngine = partSim.hasMultiModeEngine || partSim.hasModuleEngines; if (log != null) { log.AppendLine("Created ", partSim.name, ". Decoupled in stage ", partSim.decoupledInStage); } return(partSim); }
public static PartSim New(Part thePart, int id, double atmosphere, LogMsg log) { PartSim partSim = pool.Borrow(); partSim.part = thePart; partSim.centerOfMass = thePart.transform.TransformPoint(thePart.CoMOffset); partSim.partId = id; partSim.name = partSim.part.partInfo.name; if (log != null) { log.buf.AppendLine("Create PartSim for " + partSim.name); } partSim.parent = null; partSim.parentAttach = partSim.part.attachMode; partSim.fuelCrossFeed = partSim.part.fuelCrossFeed; partSim.noCrossFeedNodeKey = partSim.part.NoCrossFeedNodeKey; partSim.decoupledInStage = partSim.DecoupledInStage(partSim.part); partSim.isFuelLine = partSim.part.HasModule <CModuleFuelLine>(); partSim.isFuelTank = partSim.part is FuelTank; partSim.isSepratron = partSim.IsSepratron(); partSim.inverseStage = partSim.part.inverseStage; //MonoBehaviour.print("inverseStage = " + inverseStage); partSim.baseCost = partSim.part.GetCostDry(); if (log != null) { log.buf.AppendLine("Parent part = " + (partSim.part.parent == null ? "null" : partSim.part.parent.partInfo.name)); log.buf.AppendLine("physicalSignificance = " + partSim.part.physicalSignificance); log.buf.AppendLine("PhysicsSignificance = " + partSim.part.PhysicsSignificance); } // Work out if the part should have no physical significance // The root part is never "no physics" partSim.isNoPhysics = partSim.part.physicalSignificance == Part.PhysicalSignificance.NONE || partSim.part.PhysicsSignificance == 1; if (partSim.part.HasModule <LaunchClamp>()) { partSim.realMass = 0d; if (log != null) { log.buf.AppendLine("Ignoring mass of launch clamp"); } } else { partSim.realMass = partSim.part.mass; if (log != null) { log.buf.AppendLine("Using part.mass of " + partSim.part.mass); } } partSim.moduleMass = partSim.part.GetModuleMass((float)partSim.realMass); for (int i = 0; i < partSim.part.Resources.Count; i++) { PartResource resource = partSim.part.Resources[i]; // Make sure it isn't NaN as this messes up the part mass and hence most of the values // This can happen if a resource capacity is 0 and tweakable if (!Double.IsNaN(resource.amount)) { if (log != null) { log.buf.AppendLine(resource.resourceName + " = " + resource.amount); } partSim.resources.Add(resource.info.id, resource.amount); partSim.resourceFlowStates.Add(resource.info.id, resource.flowState ? 1 : 0); } else { if (log != null) { log.buf.AppendLine(resource.resourceName + " is NaN. Skipping."); } } } partSim.hasVessel = (partSim.part.vessel != null); partSim.isLanded = partSim.hasVessel && partSim.part.vessel.Landed; if (partSim.hasVessel) { partSim.vesselName = partSim.part.vessel.vesselName; partSim.vesselType = partSim.part.vesselType; } partSim.initialVesselName = partSim.part.initialVesselName; partSim.hasMultiModeEngine = partSim.part.HasModule <MultiModeEngine>(); partSim.hasModuleEnginesFX = partSim.part.HasModule <ModuleEnginesFX>(); partSim.hasModuleEngines = partSim.part.HasModule <ModuleEngines>(); partSim.isEngine = partSim.hasMultiModeEngine || partSim.hasModuleEnginesFX || partSim.hasModuleEngines; if (log != null) { log.buf.AppendLine("Created " + partSim.name + ". Decoupled in stage " + partSim.decoupledInStage); } return(partSim); }