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())); }
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"; } }
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; } }
/// <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"); }
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); }
/// <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); }
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; } }