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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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;
            }
        }
Esempio n. 6
0
        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)));
        }