public CheckList Allowed(Vessel vessel) { var checkList = new CheckList(); checkList.Check(Valid(), "invalid mission departure mission"); if (!checkList.CheckSucces) { return(checkList); } checkList.Check(AllowedVessel(vessel), "vessel not allowed"); if (!checkList.CheckSucces) { return(checkList); } List <Part> departureParts = RmmUtil.GetDockedParts(vessel, RmmUtil.GetDockedPart(vessel, RmmUtil.GetVesselPart(vessel, flightIdDepartureDockPart))); checkList.Check(departureParts != null, "no docked vessel on docking port"); if (!checkList.CheckSucces) { return(checkList); } checkList.Check(RmmUtil.AstronautCrewCount(departureParts) >= _mission.Departure.Crew, "not enough crew"); int crewCapacity = 0; foreach (MissionLanding missionLanding in _mission.Landings) { crewCapacity += missionLanding.CrewCapacity; } checkList.Check(RmmUtil.AstronautCrewCount(departureParts) <= crewCapacity, "too many crew"); foreach (MissionResource missionResource in _mission.Departure.Resources) { if (!_mission.Departure.Proppellants.Contains(missionResource.Name)) { continue; } checkList.Check(RmmUtil.ReadResource(departureParts, missionResource.Name) >= (missionResource.Amount * 0.99), "insufficient " + missionResource.Name); } double vesselCargoMass = 0; List <MissionResource> vesselResources = MissionResource.GetMissionResourceList(departureParts); foreach (MissionResource vesselResource in vesselResources) { if (Proppelants.Contains(vesselResource.Name)) { continue; } vesselCargoMass += RmmUtil.Mass(vesselResource.Name, vesselResource.Amount); } LoggerRmm.Debug(vesselCargoMass + " " + CargoMass); checkList.Check((vesselCargoMass * 0.99) <= CargoMass, "too much cargomass"); return(checkList); }
public static List <Part> GetDockedParts(Vessel vessel, Part dockedPort) { Part parentPart = dockedPort; List <Part> childParts = new List <Part>(); List <Part> linkedParts = null; linkedParts = GetLinkedParts(parentPart); uint dockedToPartId = 0; foreach (Part linkedPart in linkedParts) { var dockedPart = RmmUtil.GetDockedPart(vessel, linkedPart); if (!(dockedPart != null && dockedPart.flightID == parentPart.flightID)) { childParts.Add(linkedPart); } else { dockedToPartId = linkedPart.flightID; } } int childPartIndex = 0; while (childPartIndex < childParts.Count) { linkedParts = GetLinkedParts(childParts[childPartIndex]); foreach (Part linkedPart in linkedParts) { // don't add parent part if (linkedPart.flightID == parentPart.flightID) { continue; } // don't add parts twice bool present = false; foreach (Part childPart in childParts) { if (linkedPart.flightID == childPart.flightID) { present = true; break; } } if (present) { continue; } childParts.Add(linkedPart); } childPartIndex++; } // return one list with all parts List <Part> allParts = null; allParts = childParts; allParts.Add(parentPart); return(allParts); }
public void RoutineDepartureOverview(IWindow parent = null) { _missions = Mission.LoadMissions();; CancelRoutineDepartureOverview(); _routineDepartureOverviewWindow = new RoutineDepartureOverviewWindow(this); WindowManager.Open(_routineDepartureOverviewWindow, parent: parent); List <RoutineDepartureMission> routineDepartureMissions = new List <RoutineDepartureMission>(); foreach (Mission mission in _missions) { if (mission.Info == null) { continue; } if (mission.Info.Type != 20) { continue; } var locationRoutineDepartureMission = RoutineMission.AssemblePotentialRoutineMission <RoutineDepartureMission>(mission); if (locationRoutineDepartureMission == null) { continue; } if (!locationRoutineDepartureMission.AllowedLocation(FlightGlobals.ActiveVessel).CheckSucces) { continue; } foreach (Part part in FlightGlobals.ActiveVessel.parts) { string name = RmmScenario.Instance.GetRegisteredDockingPort(part.flightID); if (!String.IsNullOrEmpty(name)) { Part dockedPart = RmmUtil.GetDockedPart(FlightGlobals.ActiveVessel, part); if (dockedPart != null) { var routineDepartureMission = RoutineMission.AssemblePotentialRoutineMission <RoutineDepartureMission>(mission); routineDepartureMission.flightIdDepartureDockPart = part.flightID; var check = routineDepartureMission.AllowedVessel(FlightGlobals.ActiveVessel); if (!routineDepartureMission.AllowedVessel(FlightGlobals.ActiveVessel).CheckSucces) { continue; } routineDepartureMissions.Add(routineDepartureMission); } } } } _routineDepartureOverviewWindow.RoutineDepartureMissions = routineDepartureMissions; }
public CheckList AllowedVessel(Vessel vessel) { var checkList = new CheckList(); checkList.Check(Valid(), "invalid mission departure mission"); if (!checkList.CheckSucces) { return(checkList); } checkList.Check(AllowedLocation(vessel), "location not allowed"); Structure structure = Structure.GetDockedStructure(vessel, RmmUtil.GetDockedPart(vessel, RmmUtil.GetVesselPart(vessel, flightIdDepartureDockPart))); checkList.Check(structure != null, "no docked structure detected on docking port"); if (!checkList.CheckSucces) { return(checkList); } checkList.Check(_mission.Departure.Structure.Equal(structure), "docked structure unequal to tracked structure"); return(checkList); }
public void handleTrackingPrimary() { switch (trackingStatus) { case "Launch": if (vessel.situation == Vessel.Situations.FLYING || vessel.situation == Vessel.Situations.SUB_ORBITAL || vessel.situation == Vessel.Situations.ORBITING) { trackLaunch(); } break; case "Departure": foreach (Part p in vessel.parts) { if (p.flightID == trackPort && !RmmUtil.IsDocked(vessel, p)) { trackDeparture(); } } break; case "Underway": updatePartCount(); updateCrewCount(); updateMaxCrewCount(); // check for arrival if (_mission.Info.Type == 10) { if (vessel.situation == Vessel.Situations.ORBITING && RmmUtil.AllowedBody(vessel.mainBody.name)) { foreach (Part p in vessel.parts) { ModuleDockingNode dockingModule = p.Modules.OfType <ModuleDockingNode>().FirstOrDefault(); if (dockingModule != null) { Part dockedPart = RmmUtil.GetDockedPart(vessel, p); if (dockedPart != null && !Mission.PartIsMissionPart(dockedPart, _mission.Launch.Parts)) { trackArrival(p); return; } } } } } // make snapshot of vessel if (_mission.Info.Type == 10) { if (vessel.situation == Vessel.Situations.ORBITING && RmmUtil.AllowedBody(vessel.mainBody.name)) { // don't make snapshot when the vessel is in the process of docking. It leaves the docking port in the wrong state. bool isAnyPartDocking = false; foreach (Part p in vessel.parts) { ModuleDockingNode dockingModule = p.Modules.OfType <ModuleDockingNode>().FirstOrDefault(); if (dockingModule != null && RmmUtil.IsDocking(p)) { isAnyPartDocking = true; } } if (!isAnyPartDocking) { TakeVesselSnapShot(); } } } // check for landing if (_mission.Info.Type == 10 || _mission.Info.Type == 20) { if ((vessel.situation == Vessel.Situations.LANDED || vessel.situation == Vessel.Situations.SPLASHED) && RmmUtil.HomeBody(vessel.mainBody.name)) { if (landedTime == 0.0) { landedTime = Planetarium.GetUniversalTime(); landedLatitude = vessel.latitude; landedLongitude = vessel.longitude; landedTimeMessage = 0; } } if (landedTime > 0.0) { // Check still landed if (!(vessel.situation == Vessel.Situations.LANDED || vessel.situation == Vessel.Situations.SPLASHED) || !RmmUtil.HomeBody(vessel.mainBody.name)) { landedTime = 0.0; landedLatitude = 0.0; landedLongitude = 0.0; landedTimeMessage = 0; } // Check not moved else if (RmmUtil.GetDistanceBetweenPoints(landedLatitude, landedLongitude, vessel.latitude, vessel.longitude, vessel.mainBody.Radius) > 2) { landedTime = 0.0; landedLatitude = 0.0; landedLongitude = 0.0; landedTimeMessage = 0; } // Countdown else if (Planetarium.GetUniversalTime() - landedTime > 0.0 && Planetarium.GetUniversalTime() - landedTime < 10) { if (Planetarium.GetUniversalTime() - landedTime > landedTimeMessage + 1.0) { landedTimeMessage = landedTimeMessage + 1; ScreenMessages.PostScreenMessage("landing confirmation " + (10 - landedTimeMessage).ToString() + " seconds", 1, ScreenMessageStyle.UPPER_CENTER); } } // Landed else if (Planetarium.GetUniversalTime() - landedTime > 10) { TrackLanding(); return; } } } if (RmmUtil.CountVesselParts(vessel) > trackPartCount) { trackAbort("vessel has joined with non mission vessel"); } if (RmmUtil.AstronautCrewCount(vessel) > trackCrew) { trackAbort("crew has been added to vessel"); } updateTrackingVars(vessel); break; } }
public void RoutineDepartureDetail(string missiondId, uint flightIdDepartureDockPart, IWindow parent = null) { CancelRoutineDepartureDetail(); _routineDepartureDetailWindow = new RoutineDepartureDetailWindow(this); WindowManager.Open(_routineDepartureDetailWindow, parent: parent); RoutineDepartureMission routineDepartureMission = null; foreach (Mission mission in _missions) { if (mission.Info == null) { continue; } if (mission.Info.Type != 20) { continue; } if (mission.MissionId == missiondId) { routineDepartureMission = RoutineMission.AssemblePotentialRoutineMission <RoutineDepartureMission>(mission); routineDepartureMission.flightIdDepartureDockPart = flightIdDepartureDockPart; if (!routineDepartureMission.AllowedVessel(FlightGlobals.ActiveVessel).CheckSucces) { continue; } } } _routineDepartureDetailWindow.RoutineDepartureMission = routineDepartureMission; _routineDepartureDetailWindow.DepartureParts = RmmUtil.GetDockedParts(FlightGlobals.ActiveVessel, RmmUtil.GetDockedPart(FlightGlobals.ActiveVessel, RmmUtil.GetVesselPart(FlightGlobals.ActiveVessel, flightIdDepartureDockPart))); }