DecoupledInStage() приватный Метод

private DecoupledInStage ( Part thePart, int stage = -1 ) : int
thePart Part
stage int
Результат int
Пример #1
0
        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);
        }
Пример #2
0
        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);
        }