Esempio n. 1
0
        string GetTargetName(ITargetable obj)
        {
            string name;

            if (obj is ModuleDockingNode)
            {
                name = obj.GetVessel().GetDisplayName();
            }
            else if (obj is Vessel && obj.GetVessel().vesselType == VesselType.EVA)
            {
                name = obj.GetDisplayName().Split(' ')[0];
            }
            else
            {
                name = obj.GetDisplayName();
            }

            return(Localizer.Format("<<1>>", name));
        }
        public static string nameForTargetable(ITargetable tgt)
        {
            MapObject mo = null;

            if (tgt is CelestialBody)
            {
                mo = ((CelestialBody)tgt).MapObject;
            }
            else if (tgt is global::Vessel)
            {
                mo = ((global::Vessel)tgt).mapObject;
            }
            else
            {
                return(Localizer.Format("<<1>>", tgt.GetDisplayName()));
            }
            return(Localizer.Format("<<1>>", mo.GetDisplayName()));
        }
Esempio n. 3
0
        private void updateVesselCourse()
        {
            ITargetable targetObject = this.part.vessel.targetObject;

            //First check to see if the vessel has selected a target.
            if (targetObject != null)
            {
                vesselCourse   = targetObject.GetDisplayName().Replace("^N", "");
                targetDistance = Math.Abs((part.vessel.GetWorldPos3D() - (Vector3d)targetObject.GetTransform().position).magnitude);

                // Light-years
                if (targetDistance > (kGigaMeter * 1000))
                {
                    targetDistance /= kLightYear;
                    Fields["targetDistance"].guiUnits = "Ly";
                }

                // Giga-meters
                else if (targetDistance > (kMegaMeter * 1000))
                {
                    targetDistance /= kGigaMeter;
                    Fields["targetDistance"].guiUnits = "Gm";
                }

                // Mega-meters
                else if (targetDistance > 1000 * 1000)
                {
                    targetDistance /= kMegaMeter;
                    Fields["targetDistance"].guiUnits = "Mm";
                }

                else
                {
                    targetDistance /= 1000;
                    Fields["targetDistance"].guiUnits = "Km";
                }
            }
            else
            {
                vesselCourse   = "None";
                targetDistance = 0;
                Fields["targetDistance"].guiUnits = "m";
            }
        }
Esempio n. 4
0
        public void LateUpdate()
        {
            if (display != null)
            {
                FlightGlobals.SpeedDisplayModes mode = FlightGlobals.speedDisplayMode;


                switch (mode)
                {
                case FlightGlobals.SpeedDisplayModes.Surface:
                {
                    Vessel.Situations situation  = FlightGlobals.ActiveVessel.situation;
                    VesselType        vesselType = FlightGlobals.ActiveVessel.vesselType;

                    double spd = FlightGlobals.ActiveVessel.srfSpeed;
                    string titleText;

                    //VesselType.Base;          //Situations.LANDED
                    //VesselType.Debris         //Situations.SPLASHED
                    //VesselType.EVA            //Situations.PRELAUNCH
                    //VesselType.Flag           //Situations.FLYING
                    //VesselType.Lander         //Situations.SUB_ORBITAL
                    //VesselType.Plane;         //Situations.ORBITING
                    //VesselType.Probe          //Situations.ESCAPING
                    //VesselType.Relay          //Situations.DOCKED
                    //VesselType.Rover
                    //VesselType.Ship
                    //VesselType.SpaceObject
                    //VesselType.Station
                    //VesselType.Unknown

                    switch (vesselType)
                    {
                    case VesselType.Plane:
                    case VesselType.Rover:
                    {
                        // Boat or Submarine
                        if (situation == Vessel.Situations.SPLASHED)
                        {
                            bool isradar = HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_radar;

                            if (FlightGlobals.ActiveVessel.altitude < -20 && isradar)                 // Submarine
                            {
                                titleText = Surf3 + Unitize_short(FlightGlobals.ActiveVessel.altitude - FlightGlobals.ActiveVessel.terrainAltitude) + "  " + (spd * kn_ms).ToString("F1") + kn;
                            }
                            else                                                                       // Boat
                            {
                                titleText = Surf5 + (spd * kn_ms).ToString("F1") + knots;
                            }
                        }
                        // Plane (not LANDED)
                        else if (vesselType == VesselType.Plane &&
                                 situation != Vessel.Situations.LANDED && situation != Vessel.Situations.PRELAUNCH)
                        {
                            bool isradar = HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_radar;
                            bool ismach  = HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_mach;
                            bool isATM   = FlightGlobals.ActiveVessel.atmDensity > 0.0;

                            if (isradar)
                            {
                                if (ismach)
                                {
                                    if (isATM)
                                    {
                                        titleText = Surf3 + Unitize_short(FlightGlobals.ActiveVessel.radarAltitude) + "  "
                                                    + Localizer.Format("#SpeedUnitAnnex_mach", FlightGlobals.ActiveVessel.mach.ToString("F1"));
                                    }

                                    else
                                    {
                                        titleText = Surf5 + Unitize_long(FlightGlobals.ActiveVessel.radarAltitude);
                                    }
                                }
                                else
                                {
                                    titleText = Surf3 + Unitize_short(FlightGlobals.ActiveVessel.radarAltitude) + "  "
                                                + (spd * kn_ms).ToString("F1") + kn;
                                }
                            }
                            else
                            {
                                if (ismach)
                                {
                                    if (isATM)
                                    {
                                        titleText = Surf5 + Localizer.Format("#SpeedUnitAnnex_mach", FlightGlobals.ActiveVessel.mach.ToString("F1"));
                                    }
                                    else
                                    {
                                        titleText = Surface;
                                    }
                                }
                                else
                                {
                                    titleText = Surf5 + (spd * kn_ms).ToString("F1") + knots;
                                }
                            }
                        }
                        // Rover (and LANDED Plane)  // and rover-carrier if ksp detect them as rover
                        // All mistake at ksp detecting vessel type can be fixed by some additional checking (ex. altitude for rover-carrier)
                        // but it make unclear to user, which values is showed up.
                        else                 //if FlightGlobals.ActiveVessel.radarAltitude < 100)
                        {
                            if (HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_kmph)
                            {
                                titleText = Surf5 + (spd * kmph_ms).ToString("F1") + kmph;
                            }
                            else
                            {
                                titleText = Surf5 + (spd * mph_ms).ToString("F1") + mph;
                            }
                        }
                    }
                    break;

                    case VesselType.EVA:
                    {
                        if (HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_radar)
                        {
                            double alt;

                            if (situation == Vessel.Situations.SPLASHED)
                            {
                                alt = FlightGlobals.ActiveVessel.radarAltitude + 0.2;
                            }
                            else
                            {
                                alt = FlightGlobals.ActiveVessel.radarAltitude - 0.2;
                            }

                            titleText = Surf3 + Unitize_short(alt) + " " + FlightGlobals.ActiveVessel.GetDisplayName();
                        }
                        else
                        {
                            titleText = Surf3 + FlightGlobals.ActiveVessel.GetDisplayName();
                        }

                        if (titleText.Length > 17)
                        {
                            titleText = titleText.Substring(0, 16) + "...";
                        }
                    }
                    break;

                    case VesselType.Flag:
                    {
                        titleText = Surf3 + FlightGlobals.ActiveVessel.GetDisplayName();

                        if (titleText.Length > 17)
                        {
                            titleText = titleText.Substring(0, 16) + "...";
                        }
                    }
                    break;

                    // Other: Rocket, Lander, Base etc
                    default:
                    {
                        if (HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_radar)
                        {
                            titleText = Surf5 + Unitize_long(FlightGlobals.ActiveVessel.radarAltitude);
                        }
                        else
                        {
                            titleText = Surface;
                        }
                    }
                    break;
                    }

                    display.textTitle.text = titleText;
                    break;
                }

                case FlightGlobals.SpeedDisplayModes.Orbit:
                {
                    if (FlightGlobals.ActiveVessel.vesselType == VesselType.EVA &&
                        HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_orbit_EVA)
                    {
                        string titleText = Orb + FlightGlobals.ActiveVessel.GetDisplayName();

                        if (titleText.Length > 17)
                        {
                            titleText = titleText.Substring(0, 16) + "...";
                        }

                        display.textTitle.text = titleText;
                    }
                    else if (HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_orbit)
                    {
                        string ApStr = Unitize_short(FlightGlobals.ship_orbit.ApA);
                        string PeStr = Unitize_short(FlightGlobals.ship_orbit.PeA);

                        display.textTitle.text = Orb + ApStr + " " + PeStr;
                    }

                    break;
                }

                case FlightGlobals.SpeedDisplayModes.Target:
                {
                    ITargetable obj = FlightGlobals.fetch.VesselTarget;

                    // ITargetable ->  CelestialBody;
                    //                 FlightCoMTracker;
                    //                 ModuleDockingNode;
                    //                 PositionTarget;
                    //                 Vessel;

                    string text;
                    string name;

                    if (obj is ModuleDockingNode)
                    {
                        name = obj.GetVessel().GetDisplayName();
                    }
                    else
                    {
                        name = obj.GetDisplayName();
                    }

                    if (name.Length > 1 && name.Substring(name.Length - 2, 1) == "^")
                    {
                        name = name.Substring(0, name.Length - 2);
                    }

                    if (HighLogic.CurrentGame.Parameters.CustomParams <SpeedUnitAnnexSettings>().setting_targetDistance)
                    {
                        // from Docking Port Alignment Indicator
                        Transform selfTransform    = FlightGlobals.ActiveVessel.ReferenceTransform;
                        Transform targetTransform  = FlightGlobals.fetch.VesselTarget.GetTransform();
                        Vector3   targetToOwnship  = selfTransform.position - targetTransform.position;
                        float     distanceToTarget = targetToOwnship.magnitude;

                        text = Trg + Unitize_short(distanceToTarget) + " " + name;
                    }
                    else
                    {
                        text = Trg + name;
                    }


                    if (text.Length <= 17)
                    {
                        display.textTitle.text = text;
                    }
                    else
                    {
                        display.textTitle.text = text.Substring(0, 16) + "...";
                    }

                    break;
                }
                }

                display.textTitle.alignment = TMPro.TextAlignmentOptions.MidlineLeft;
            }
        }
Esempio n. 5
0
 /// <summary>
 /// Wrapper around CelestialBody.theName to support other targets as well.
 /// </summary>
 /// <param name="target">Body or vessel to check</param>
 /// <returns>
 /// Name of target, including gender markers
 /// (Historically, this checked CelestialBody.theName, which included a lower case
 /// version of some names such as "the Mun". This was removed in the localization
 /// update, and now we only have "The Mun" regardless of where in the sentence
 /// the string will be used. This has been reported on the bug tracker:
 ///   http://bugs.kerbalspaceprogram.com/issues/14314 )
 /// </returns>
 public static string TheName(ITargetable target)
 {
     return(target?.GetDisplayName() ?? target?.GetName() ?? "NULL");
 }
Esempio n. 6
0
        public void Update()
        {
            string canCommText;
            double altitude            = FlightGlobals.ActiveVessel.altitude;
            double distanceTraveled    = FlightGlobals.ActiveVessel.distanceTraveled;
            double externalTemperature = FlightGlobals.ActiveVessel.externalTemperature;
            double GForce        = FlightGlobals.ActiveVessel.geeForce_immediate;
            bool   isLanded      = FlightGlobals.ActiveVessel.Landed;
            double verticalSpeed = FlightGlobals.ActiveVessel.verticalSpeed;
            double timeToPe      = FlightGlobals.ActiveVessel.GetCurrentOrbit().timeToPe;
            double timeToAp      = FlightGlobals.ActiveVessel.GetCurrentOrbit().timeToAp;
            double orbitSpeed    = FlightGlobals.ActiveVessel.obt_speed;
            double orbitIncl     = FlightGlobals.ActiveVessel.GetCurrentOrbit().inclination;
            double orbitEcc      = FlightGlobals.ActiveVessel.GetCurrentOrbit().eccentricity;
            bool   canComm       = FlightGlobals.ActiveVessel.connection.CanComm;
            double ApA           = FlightGlobals.ActiveVessel.GetOrbit().ApA;
            double PeA           = FlightGlobals.ActiveVessel.GetOrbit().PeA;
            string targetName    = "";
            double targetSpeed   = 0;
            double distance      = 0;
            double targetLat     = 0;
            double targetLong    = 0;

            try
            {
                ITargetable target = FlightGlobals.fetch.VesselTarget;
                targetName = target.GetDisplayName();
                var vessel      = target.GetVessel();
                var targetOrbit = FlightGlobals.fetch.VesselTarget.GetOrbit();
                var originOrbit = (FlightGlobals.ship_orbit.referenceBody == Planetarium.fetch.Sun ||
                                   FlightGlobals.ship_orbit.referenceBody == FlightGlobals.ActiveVessel.targetObject.GetOrbit().referenceBody)
                    ? FlightGlobals.ship_orbit
                    : FlightGlobals.ship_orbit.referenceBody.orbit;
                targetSpeed = FlightGlobals.ship_obtSpeed - targetOrbit.orbitalSpeed;
                distance    = Vector3d.Distance(targetOrbit.pos, originOrbit.pos);
                targetLat   = vessel.latitude;
                targetLong  = vessel.longitude;
            } catch (Exception)
            {
                targetName  = "NON";
                targetSpeed = 0;
                distance    = 0;
            }
            string planetName = FlightGlobals.ActiveVessel.mainBody.bodyName;

            Vector3d centreOfMass = FlightGlobals.ActiveVessel.CoMD;
            Vector3d up           = (centreOfMass - FlightGlobals.ActiveVessel.mainBody.position).normalized;
            Vector3d north        = Vector3.ProjectOnPlane((FlightGlobals.ActiveVessel.mainBody.position + FlightGlobals.ActiveVessel.mainBody.transform.up * (float)FlightGlobals.ActiveVessel.mainBody.Radius) - centreOfMass, up).normalized;

            Quaternion surfaceRotation = Quaternion.Inverse(Quaternion.Euler(90.0f, 0.0f, 0.0f) * Quaternion.Inverse(FlightGlobals.ActiveVessel.transform.rotation) * Quaternion.LookRotation(north, up));

            double yaw   = surfaceRotation.eulerAngles.y;
            double pitch = surfaceRotation.eulerAngles.x > 180.0f
                ? 360.0f - surfaceRotation.eulerAngles.x
                : -surfaceRotation.eulerAngles.x;
            double roll = surfaceRotation.eulerAngles.z > 180.0f
                ? 360.0f - surfaceRotation.eulerAngles.z
                : -surfaceRotation.eulerAngles.z;

            if (canComm)
            {
                canCommText = "TRUE";
            }
            else
            {
                canCommText = "FALSE";
            }
            double lat                           = FlightGlobals.ActiveVessel.latitude;
            double ConvectionFlux                = 0.0;
            double RadiationFlux                 = 0.0;
            double InternalFlux                  = 0.0;
            double HottestTemperature            = 0.0;
            double HottestSkinTemperature        = 0.0;
            double CoolestTemperature            = double.MaxValue;
            double CoolestSkinTemperature        = double.MaxValue;
            double CriticalTemperature           = double.MaxValue;
            double CriticalSkinTemperature       = double.MaxValue;
            double CriticalTemperaturePercentage = 0.0;
            string HottestPartName               = "";
            string CoolestPartName               = "";
            string CriticalPartName              = "";

            for (int i = 0; i < FlightGlobals.ActiveVessel.parts.Count; ++i)
            {
                Part part = FlightGlobals.ActiveVessel.parts[i];

                ConvectionFlux = ConvectionFlux + part.thermalConvectionFlux;
                RadiationFlux  = RadiationFlux + part.thermalRadiationFlux;
                InternalFlux   = InternalFlux + part.thermalInternalFluxPrevious;

                if (part.temperature > HottestTemperature || part.skinTemperature > HottestSkinTemperature)
                {
                    HottestTemperature = part.temperature;
                    //HottestTemperatureMax = part.maxTemp;
                    HottestSkinTemperature = part.skinTemperature;
                    //HottestSkinTemperatureMax = part.skinMaxTemp;
                    HottestPartName = part.partInfo.title.Replace("\"", "\\\"");
                }
                if (part.temperature < CoolestTemperature || part.skinTemperature < CoolestSkinTemperature)
                {
                    CoolestTemperature = part.temperature;
                    //CoolestTemperatureMax = part.maxTemp;
                    CoolestSkinTemperature = part.skinTemperature;
                    //CoolestSkinTemperatureMax = part.skinMaxTemp;
                    CoolestPartName = part.partInfo.title.Replace("\"", "\\\"");
                }

                if (part.temperature / part.maxTemp > CriticalTemperaturePercentage || part.skinTemperature / part.skinMaxTemp > CriticalTemperaturePercentage)
                {
                    CriticalTemperature = part.temperature;
                    //CriticalTemperatureMax = part.maxTemp;
                    CriticalSkinTemperature = part.skinTemperature;
                    //CriticalSkinTemperatureMax = part.skinMaxTemp;
                    CriticalTemperaturePercentage = Math.Max(part.temperature / part.maxTemp, part.skinTemperature / part.skinMaxTemp);
                    CriticalPartName = part.partInfo.title.Replace("\"", "\\\"");
                }
            }

            double lon          = FlightGlobals.ActiveVessel.longitude;
            double missionTime  = FlightGlobals.ActiveVessel.missionTime;
            double speed        = FlightGlobals.ActiveVessel.speed;
            string name         = FlightGlobals.ActiveVessel.vesselName;
            double atmDensity   = FlightGlobals.ActiveVessel.atmDensity;
            int    currentStage = FlightGlobals.ActiveVessel.currentStage;
            double deltaV       = FlightGlobals.ActiveVessel.VesselDeltaV.TotalDeltaVActual;
            double mass         = FlightGlobals.ActiveVessel.totalMass;
            double acceleration = FlightGlobals.ActiveVessel.acceleration_immediate.magnitude;
            int    partCount    = FlightGlobals.ActiveVessel.parts.Count;
            string situation    = "";
            double horizSpeed   = FlightGlobals.ActiveVessel.horizontalSrfSpeed;

            time += Time.deltaTime;

            switch (ScienceUtil.GetExperimentSituation(FlightGlobals.ActiveVessel))
            {
            case ExperimentSituations.SrfLanded:
                situation = "Landed";
                break;

            case ExperimentSituations.SrfSplashed:
                situation = "Splashed";
                break;

            case ExperimentSituations.FlyingLow:
                situation = "Flying Low";
                break;

            case ExperimentSituations.FlyingHigh:
                situation = "Flying High";
                break;

            case ExperimentSituations.InSpaceLow:
                situation = "In Space Low";
                break;

            case ExperimentSituations.InSpaceHigh:
                situation = "In Space High";
                break;
            }
            if (time >= interpolationPeriod)
            {
                time = time - interpolationPeriod;
                if (situation != "Landed" && altitude < 90000)
                {
                    altOverTime.Add(altitude);
                    fPOverTime.Add(altitude);
                    apogeeOverTime.Add(ApA);
                    velOverTime.Add(speed);
                    dVOverTime.Add(deltaV);
                    string altOverTimeData    = "";
                    string fPOverTimeData     = "";
                    string apogeeOverTimeData = "";
                    string velOverTimeData    = "";
                    string dVOverTimeData     = "";
                    for (var i = 0; i < altOverTime.Count; i++)
                    {
                        altOverTimeData    += altOverTime[i] + ", ";
                        fPOverTimeData     += fPOverTime[i] + ", ";
                        apogeeOverTimeData += apogeeOverTime[i] + ", ";
                        velOverTimeData    += velOverTime[i] + ", ";
                        dVOverTimeData     += dVOverTime[i] + ", ";
                    }
                    altOverTimeData    = altOverTimeData.Remove(altOverTimeData.Length - 2);
                    fPOverTimeData     = fPOverTimeData.Remove(fPOverTimeData.Length - 2);
                    apogeeOverTimeData = apogeeOverTimeData.Remove(apogeeOverTimeData.Length - 2);
                    velOverTimeData    = velOverTimeData.Remove(velOverTimeData.Length - 2);
                    dVOverTimeData     = dVOverTimeData.Remove(dVOverTimeData.Length - 2);
                    string finalAltOverTime    = "{ \"data\": [" + altOverTimeData + "]}";
                    string finalFPOverTime     = "{ \"data\": [" + fPOverTimeData + "]}";
                    string finalApogeeOverTime = "{ \"data\": [" + apogeeOverTimeData + "]}";
                    string finalVelOverTime    = "{ \"data\": [" + velOverTimeData + "]}";
                    string finalDVOverTimee    = "{ \"data\": [" + dVOverTimeData + "]}";
                    File.WriteAllText(@"GameData\Kerbal Telemetry\static\altOverTime.json", finalAltOverTime);
                    File.WriteAllText(@"GameData\Kerbal Telemetry\static\fPOverTimeData.json", finalFPOverTime);
                    File.WriteAllText(@"GameData\Kerbal Telemetry\static\apogeeOverTimeData.json", finalApogeeOverTime);
                    File.WriteAllText(@"GameData\Kerbal Telemetry\static\velOverTimeData.json", finalVelOverTime);
                    File.WriteAllText(@"GameData\Kerbal Telemetry\static\dVOverTimeData.json", finalDVOverTimee);
                }
            }
            string serializeData = "\"altitude\":{0},\"distanceTraveled\":{1},\"externalTemperature\":{2},\"GForce\":{3},\"canComm\":\"{4}\",\"situation\":\"{5}\",\"timeToPe\":{6},\"lat\":{7},\"lon\":{8},\"verticalSpeed\":{9},\"missionTime\":{10},\"speed\":{11},\"name\":\"{12}\",\"atmDensity\":{13},\"currentStage\":{14},\"deltaV\":{15},\"timeToAp\":{16},\"orbitSpeed\":{17},\"orbitIncl\":{18},\"orbitEcc\":{19},\"ApA\":{20},\"PeA\":{21},\"horizSpeed\":{22},\"partCount\":{23},\"mass\":{24},\"acceleration\":{25},\"convFlux\":{26},\"radFlux\":{27},\"intFlux\":{28},\"planetName\":\"{29}\",\"yaw\":{30},\"pitch\":{31},\"roll\":{32},\"coolTemp\":{33},\"coolSkinTemp\":{34},\"coolSkinName\":\"{35}\",\"hotTemp\":{36},\"hotSkinTemp\":{37},\"hotSkinName\":\"{38}\",\"critTemp\":{39},\"critSkinTemp\":{40},\"critSkinName\":\"{41}\",\"targetName\":\"{42}\",\"distance\":{43},\"targetSpeed\":{44},\"targetLat\":{45},\"targetLong\":{46}";
            string data          = String.Format(serializeData, altitude, distanceTraveled, externalTemperature - 273, GForce, canCommText, situation, timeToPe, lat, lon, verticalSpeed, missionTime, speed, name, atmDensity, currentStage, deltaV, timeToAp, orbitSpeed, orbitIncl, orbitEcc, ApA, PeA, horizSpeed, partCount, mass, acceleration, ConvectionFlux, RadiationFlux, InternalFlux, planetName, yaw, pitch, roll, CoolestTemperature - 273, CoolestSkinTemperature - 273, CoolestPartName, HottestTemperature - 273, HottestSkinTemperature - 273, HottestPartName, CriticalTemperature - 273, CriticalSkinTemperature - 273, CriticalPartName, targetName, distance, targetSpeed, targetLat, targetLong);

            data = "{" + data + "}";
            File.WriteAllText(@"GameData\Kerbal Telemetry\static\data.json", data);
        }
Esempio n. 7
0
        /// <summary>
        /// Forces the controller to pick a target to track. In order of preference:
        /// 1) A player-selected target.
        /// 2) A target vessel specified by the targetVessel variable.
        /// 3) A target celestial body specified by the targetBody variable.
        /// 4) A random target if trackRandomTargets is set to true.
        /// </summary>
        /// <returns></returns>
        public bool UpdateTarget()
        {
            ITargetable targetObject = this.part.vessel.targetObject;

            //chek for unset
            if (targetObject == null && targetObjectSet)
            {
                targetTransform = null;
                targetObjectSet = false;
            }

            //If we already have a target to track then we're good to go.
            if (targetTransform != null && targetObject == null)
            {
                return(true);
            }

            //First check to see if the vessel has selected a target.
            if (targetObject != null && canTrackPlayerTargets)
            {
                targetTransform = targetObject.GetTransform();
                trackingStatus  = targetObject.GetDisplayName().Replace("^N", "");
                targetName      = trackingStatus;
                targetObjectSet = true;
                return(true);
            }

            //Next check to see if we have a target vessel
            if (targetVessel != null)
            {
                targetTransform = targetVessel.vesselTransform;
                trackingStatus  = targetVessel.vesselName;
                targetName      = trackingStatus;
                return(true);
            }

            //Now check target planet
            if (targetBody != null)
            {
                targetTransform = targetBody.scaledBody.transform;
                trackingStatus  = targetBody.displayName.Replace("^N", "");
                targetName      = trackingStatus;
                return(true);
            }

            //Lastly, if random tracking is enabled and we don't have a target, then randomly select one from the unloaded vessels list.
            if (trackRandomObjects && targetTransform == null)
            {
                //get the tracking controllers on the vessel
                List <WBIBGTrackingServo> trackingControllers = this.part.vessel.FindPartModulesImplementing <WBIBGTrackingServo>();

                //If we aren't the first controller, then we're done.
                if (trackingControllers[0] != this)
                {
                    trackingStatus  = trackingControllers[0].trackingStatus;
                    targetTransform = trackingControllers[0].targetTransform;
                    targetName      = trackingStatus;
                    return(false);
                }

                //Find a random vessel to track
                int    vesselCount = FlightGlobals.VesselsUnloaded.Count;
                Vessel trackedVessel;
                for (int index = 0; index < vesselCount; index++)
                {
                    trackedVessel = FlightGlobals.VesselsUnloaded[UnityEngine.Random.Range(0, vesselCount - 1)];

                    //If we find a vessel we're interested in, tell all the other tracking controllers.
                    if (trackedVessel.vesselType != VesselType.Flag &&
                        trackedVessel.vesselType != VesselType.EVA &&
                        trackedVessel.vesselType != VesselType.Unknown)
                    {
                        int controllerCount = trackingControllers.Count;
                        for (int controllerIndex = 0; controllerIndex < controllerCount; controllerIndex++)
                        {
                            if (!trackingControllers[controllerIndex].trackRandomObjects)
                            {
                                continue;
                            }

                            trackingControllers[controllerIndex].targetTransform = trackedVessel.vesselTransform;
                            trackingControllers[controllerIndex].trackingStatus  = trackedVessel.vesselName;
                            trackingControllers[controllerIndex].targetName      = trackedVessel.vesselName;
                        }
                        return(true);
                    }
                }
            }

            //Nothing to track
            trackingStatus = kTrackingNone;
            targetName     = trackingStatus;
            return(false);
        }
Esempio n. 8
0
        public void LateUpdate()
        {
            if (display != null)
            {
                FlightGlobals.SpeedDisplayModes mode = FlightGlobals.speedDisplayMode;

                switch (mode)
                {
                case FlightGlobals.SpeedDisplayModes.Surface:
                    Vessel.Situations situation  = FlightGlobals.ActiveVessel.situation;
                    VesselType        vesselType = FlightGlobals.ActiveVessel.vesselType;

                    double spd       = FlightGlobals.ship_srfSpeed;
                    string speedText = spd.ToString("F1") + mps;



                    #region all VesselTypes and Situations
                    //VesselType.Base;          //Situations.LANDED
                    //VesselType.Debris         //Situations.SPLASHED
                    //VesselType.EVA            //Situations.PRELAUNCH
                    //VesselType.Flag           //Situations.FLYING
                    //VesselType.Lander         //Situations.SUB_ORBITAL
                    //VesselType.Plane;         //Situations.ORBITING
                    //VesselType.Probe          //Situations.ESCAPING
                    //VesselType.Relay          //Situations.DOCKED
                    //VesselType.Rover
                    //VesselType.Ship
                    //VesselType.SpaceObject
                    //VesselType.Station
                    //VesselType.Unknown
                    #endregion

                    switch (vesselType)
                    {
                    case VesselType.Plane:
                    case VesselType.Rover:
                        // Boat or Submarine
                        if (situation == Vessel.Situations.SPLASHED)
                        {
                            if (FlightGlobals.ActiveVessel.altitude < -20 && settings.radar)         // Submarine
                            {
                                titleText = Surf3 + Formatter.Distance_short(FlightGlobals.ActiveVessel.altitude - FlightGlobals.ActiveVessel.terrainAltitude)
                                            + "  " + (spd * kn_ms).ToString("F1") + kn;
                            }
                            else                                                               // Boat
                            {
                                titleText = Surf5 + (spd * kn_ms).ToString("F1") + knots;
                            }
                        }
                        // Plane (not LANDED)
                        else if (vesselType == VesselType.Plane &&
                                 situation != Vessel.Situations.LANDED && situation != Vessel.Situations.PRELAUNCH)
                        {
                            bool   isATM    = FlightGlobals.ActiveVessel.atmDensity > 0.0;
                            double speedIAS = FlightGlobals.ActiveVessel.indicatedAirSpeed;

                            if (settings.radar)
                            {
                                if (settings.mach)
                                {
                                    if (isATM)
                                    {
                                        titleText = Surf3 + Formatter.Distance_short(FlightGlobals.ActiveVessel.radarAltitude) + "  "
                                                    + Localizer.Format("#SpeedUnitAnnex_mach", FlightGlobals.ActiveVessel.mach.ToString("F1"));
                                    }

                                    else
                                    {
                                        titleText = Surf5 + Formatter.Distance_long(FlightGlobals.ActiveVessel.radarAltitude);
                                    }
                                }
                                else
                                {
                                    titleText = Surf3 + Formatter.Distance_short(FlightGlobals.ActiveVessel.radarAltitude) + "  "
                                                + (spd * kn_ms).ToString("F1") + kn;
                                }
                            }
                            else
                            {
                                if (settings.mach)
                                {
                                    if (isATM)
                                    {
                                        titleText = Surf5 + Localizer.Format("#SpeedUnitAnnex_mach", FlightGlobals.ActiveVessel.mach.ToString("F1"));
                                    }
                                    else
                                    {
                                        titleText = Surface;
                                    }
                                }
                                else
                                {
                                    titleText = Surf5 + (spd * kn_ms).ToString("F1") + knots;
                                }
                            }

                            if (settings.ias && speedIAS > 0)
                            {
                                speedText += " " + speedIAS.ToString("F1");
                            }
                        }
                        // Rover (and LANDED Plane)  // and rover-carrier if ksp detect them as rover
                        // All mistake at ksp detecting vessel type can be fixed by some additional checking (ex. altitude for rover-carrier)
                        // but it make unclear to user, which values is showed up.
                        else         //if FlightGlobals.ActiveVessel.radarAltitude < 100)
                        {
                            if (settings.kmph)
                            {
                                titleText = Surf5 + (spd * kmph_ms).ToString("F1") + kmph;
                            }
                            else
                            {
                                titleText = Surf5 + (spd * mph_ms).ToString("F1") + mph;
                            }
                        }
                        break;

                    case VesselType.EVA:

                        if (settings.radar)
                        {
                            double alt = FlightGlobals.ActiveVessel.radarAltitude;

                            if (situation == Vessel.Situations.SPLASHED)
                            {
                                alt += 0.21;
                            }
                            else
                            {
                                alt -= 0.27;
                            }

                            titleText = Surf3 + Formatter.Distance_short(alt) + " " + FlightGlobals.ActiveVessel.GetDisplayName();
                        }
                        else
                        {
                            titleText = Surf3 + FlightGlobals.ActiveVessel.GetDisplayName();
                        }

                        if (titleText.Length > 17)
                        {
                            titleText = titleText.Substring(0, 16) + "...";
                        }
                        break;

                    case VesselType.Flag:

                        titleText = Surf3 + FlightGlobals.ActiveVessel.GetDisplayName();

                        if (titleText.Length > 17)
                        {
                            titleText = titleText.Substring(0, 16) + "...";
                        }
                        break;

                    // Other: Rocket, Lander, Base etc
                    default:

                        if (settings.radar)
                        {
                            titleText = Surf5 + Formatter.Distance_long(FlightGlobals.ActiveVessel.radarAltitude);
                        }
                        else
                        {
                            titleText = Surface;
                        }
                        break;
                    }

                    display.textTitle.text = titleText;
                    display.textSpeed.text = speedText;

                    break;

                case FlightGlobals.SpeedDisplayModes.Orbit:

                    if (FlightGlobals.ActiveVessel.vesselType == VesselType.EVA &&
                        settings.orbit_EVA)
                    {
                        if (settings.orbit_time)
                        {
                            titleText = FlightGlobals.ActiveVessel.GetDisplayName();
                        }
                        else
                        {
                            titleText = Orb + FlightGlobals.ActiveVessel.GetDisplayName();
                        }

                        if (titleText.Length > 17)
                        {
                            titleText = titleText.Substring(0, 16) + "...";
                        }

                        display.textTitle.text = titleText;
                    }
                    else
                    {
                        double SOI_MASL = FlightGlobals.getMainBody().sphereOfInfluence - FlightGlobals.getMainBody().Radius;
                        bool   Ap_ok    = FlightGlobals.getMainBody().atmosphereDepth < FlightGlobals.ship_orbit.ApA && FlightGlobals.ship_orbit.ApA < SOI_MASL;
                        bool   Pe_ok    = FlightGlobals.getMainBody().atmosphereDepth < FlightGlobals.ship_orbit.PeA && FlightGlobals.ship_orbit.PeA < SOI_MASL;
                        string Ap       = Formatter.Distance_k(FlightGlobals.ship_orbit.ApA);
                        string Pe       = Formatter.Distance_k(FlightGlobals.ship_orbit.PeA);
                        string Apsises  = (Ap_ok ? "<color=#00ff00ff>" : "<color=#00ff009f>") + Ap +
                                          (Pe_ok ? " <color=#00ff00ff>" : " <color=#00ff009f>") + Pe;



                        if (settings.orbit_time)
                        {
                            //double tTr = FlightGlobals.ship_orbit.timeToTransition1;
                            string TimeApsis;
                            bool   Apsis_ok;

                            if (FlightGlobals.ship_orbit.timeToAp < FlightGlobals.ship_orbit.timeToPe)
                            {
                                Apsis_ok  = Ap_ok;
                                TimeApsis = Formatter.Time(FlightGlobals.ship_orbit.timeToAp, Ap_pre);
                            }
                            else
                            {
                                Apsis_ok  = Pe_ok;
                                TimeApsis = Formatter.Time(FlightGlobals.ship_orbit.timeToPe, Pe_pre);
                            }

                            display.textTitle.text = Apsises +
                                                     (Apsis_ok ? " <color=#ffffffff>" : " <color=#ffffff9f>") + TimeApsis;
                        }
                        else
                        {
                            display.textTitle.text = Orb + Apsises;
                        }
                    }

                    display.textSpeed.text = FlightGlobals.ship_obtSpeed.ToString("F1") + mps;
                    break;

                case FlightGlobals.SpeedDisplayModes.Target:

                    ITargetable obj = FlightGlobals.fetch.VesselTarget;
                    #region all Target
                    // ITargetable ->  CelestialBody;
                    //                 FlightCoMTracker;
                    //                 ModuleDockingNode;
                    //                 PositionTarget;
                    //                 Vessel;
                    #endregion
                    string name;

                    if (obj is ModuleDockingNode)
                    {
                        name = obj.GetVessel().GetDisplayName();
                    }
                    else
                    {
                        name = obj.GetDisplayName();
                    }

                    if (name.Length > 1 && name.Substring(name.Length - 2, 1) == "^")
                    {
                        name = name.Substring(0, name.Length - 2);
                    }

                    if (settings.targetDistance)
                    {
                        // from Docking Port Alignment Indicator
                        Transform selfTransform    = FlightGlobals.ActiveVessel.ReferenceTransform;
                        Transform targetTransform  = FlightGlobals.fetch.VesselTarget.GetTransform();
                        Vector3   targetToOwnship  = selfTransform.position - targetTransform.position;
                        float     distanceToTarget = targetToOwnship.magnitude;

                        titleText = Trg + Formatter.Distance_short(distanceToTarget) + " " + name;
                    }
                    else
                    {
                        titleText = Trg + name;
                    }

                    if (titleText.Length <= 17)
                    {
                        display.textTitle.text = titleText;
                    }
                    else
                    {
                        display.textTitle.text = titleText.Substring(0, 16) + "...";
                    }

                    if (FlightGlobals.ship_tgtSpeed < 0.195)
                    {
                        display.textSpeed.text = FlightGlobals.ship_tgtSpeed.ToString("F2") + mps;
                    }
                    else
                    {
                        display.textSpeed.text = FlightGlobals.ship_tgtSpeed.ToString("F1") + mps;
                    }
                    break;
                }

                // need to be there, for every tick. Doesn't work in the  Start() or onSetSpeedMode()
                display.textTitle.alignment = TMPro.TextAlignmentOptions.MidlineLeft;
            }
        }