示例#1
0
        public PartStats(Part part)
        {
            this.mass = part.mass;

            if (part.partInfo.variant != null)
            {
                kRnDVariants       = KRnD.getVariants(part);
                currentVariant     = part.partInfo.variant.Name;
                currentVariantMass = part.partInfo.variant.Mass;
                variantBaseMass    = part.baseVariant.Mass;
            }
            if (kRnDVariants != null)
            {
                hasVariants = true;
            }
            else
            {
                currentVariantMass = 0;
                variantBaseMass    = 0;
                hasVariants        = false;
            }
            this.skinMaxTemp = part.skinMaxTemp;
            this.intMaxTemp  = part.maxTemp;

            // There should only be one or the other, engines or RCS:
            List <ModuleEngines> engineModules = KRnD.getEngineModules(part);
            ModuleRCS            rcsModule     = KRnD.getRcsModule(part);

            if (engineModules != null)
            {
                this.maxFuelFlows     = new List <float>();
                this.atmosphereCurves = new List <FloatCurve>();

                for (int i = 0; i < engineModules.Count; i++)
                {
                    ModuleEngines engineModule = engineModules[i];

                    this.maxFuelFlows.Add(engineModule.maxFuelFlow);

                    FloatCurve atmosphereCurve = new FloatCurve();
                    for (int i5 = 0; i5 < engineModule.atmosphereCurve.Curve.length; i5++)
                    {
                        Keyframe frame = engineModule.atmosphereCurve.Curve[i5];
                        atmosphereCurve.Add(frame.time, frame.value);
                    }
                    this.atmosphereCurves.Add(atmosphereCurve);
                }
            }
            else if (rcsModule)
            {
                this.maxFuelFlows     = new List <float>();
                this.atmosphereCurves = new List <FloatCurve>();

                this.maxFuelFlows.Add(rcsModule.thrusterPower);
                FloatCurve atmosphereCurve = new FloatCurve();
                for (int i = 0; i < rcsModule.atmosphereCurve.Curve.length; i++)
                {
                    Keyframe frame = rcsModule.atmosphereCurve.Curve[i];
                    atmosphereCurve.Add(frame.time, frame.value);
                }
                this.atmosphereCurves.Add(atmosphereCurve);
            }

            ModuleReactionWheel reactionWheel = KRnD.getReactionWheelModule(part);

            if (reactionWheel)
            {
                this.torque = reactionWheel.RollTorque; // There is also pitch- and yaw-torque, but they should all be the same
            }

            // WIP
            //ModuleDataTransmitter dataTransmitter = KRnD.getDataTransmitterModule(part);
            //if (dataTransmitter)
            //{
            //    this.antPower = dataTransmitter.antennaPower;
            //}

            ModuleResourceHarvester resourceHarvester = KRnD.getResourceHarvesterModule(part);

            if (resourceHarvester)
            {
                this.harvester = resourceHarvester.Efficiency;
            }

            ModuleActiveRadiator activeRadiator = KRnD.getActiveRadiatorModule(part);

            if (activeRadiator)
            {
                this.radiatorEfficiency = activeRadiator.maxEnergyTransfer;
            }

            ModuleDeployableSolarPanel solarPanel = KRnD.getSolarPanelModule(part);

            if (solarPanel)
            {
                this.chargeRate = solarPanel.chargeRate;
            }

            ModuleWheelBase landingLeg = KRnD.getLandingLegModule(part);

            if (landingLeg)
            {
                this.crashTolerance = part.crashTolerance; // Every part has a crash tolerance, but we only want to improve landing legs.
            }

            PartResource electricCharge = KRnD.getChargeResource(part);

            if (electricCharge != null)
            {
                this.batteryCharge = electricCharge.maxAmount;
            }

            ModuleGenerator generator = KRnD.getGeneratorModule(part);

            if (generator != null)
            {
                generatorEfficiency = new Dictionary <String, double>();
                for (int i = 0; i < generator.resHandler.outputResources.Count; i++)
                {
                    ModuleResource outputResource = generator.resHandler.outputResources[i];

                    generatorEfficiency.Add(outputResource.name, outputResource.rate);
                }
            }

            PartModule fissionGenerator = KRnD.getFissionGeneratorModule(part);

            if (fissionGenerator != null)
            {
                fissionPowerGeneration = KRnD.getGenericModuleValue(fissionGenerator, "PowerGeneration");
            }

            // There might be different converter-modules in the same part with different names (eg for Fuel, Monopropellant, etc):
            List <ModuleResourceConverter> converterList = KRnD.getConverterModules(part);

            if (converterList != null)
            {
                converterEfficiency = new Dictionary <String, Dictionary <String, double> >();
                for (int i = 0; i < converterList.Count; i++)
                {
                    ModuleResourceConverter converter = converterList[i];

                    Dictionary <String, double> thisConverterEfficiency = new Dictionary <String, double>();
                    for (int i2 = 0; i2 < converter.outputList.Count; i2++)
                    {
                        ResourceRatio resourceRatio = converter.outputList[i2];

                        thisConverterEfficiency.Add(resourceRatio.ResourceName, resourceRatio.Ratio);
                    }
                    converterEfficiency.Add(converter.ConverterName, thisConverterEfficiency);
                }
            }

            ModuleParachute parachute = KRnD.getParachuteModule(part);

            if (parachute)
            {
                this.chuteMaxTemp = parachute.chuteMaxTemp;
            }

            ModuleProceduralFairing fairing = KRnD.getFairingModule(part);

            if (fairing)
            {
                this.fairingAreaMass = fairing.UnitAreaMass;
            }

            List <PartResource> fuelResources = KRnD.getFuelResources(part);

            if (fuelResources != null)
            {
                fuelCapacities    = new Dictionary <string, double>();
                fuelCapacitiesSum = 0;
                for (int i = 0; i < fuelResources.Count; i++)
                {
                    PartResource fuelResource = fuelResources[i];

                    fuelCapacities.Add(fuelResource.resourceName, fuelResource.maxAmount);
                    fuelCapacitiesSum += fuelResource.maxAmount;
                }
            }
        }