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);
        }
        private void trackArrival(Part dockedPort)
        {
            MissionArrival arrival = new MissionArrival
            {
                Time             = Planetarium.GetUniversalTime(),
                Body             = vessel.mainBody.name,
                Orbit            = MissionOrbit.GetMissionOrbit(vessel.orbit),
                flightIDDockPart = dockedPort.flightID,
                Crew             = (int)trackCrew,
                CrewCapacity     = (int)trackCrewCapacity,
                Parts            = MissionPart.GetMissionPartList(RmmUtil.GetDockedParts(vessel, dockedPort))
            };

            _mission.TrackArrival(arrival);

            trackingActive  = false;
            trackingPrimary = false;
            trackingStatus  = "Arrived";

            //-----------------------
            StoreVesselSnapShot("arrival");

            _partModule.PortCode = "";


            ScreenMessages.PostScreenMessage("mission tracking-ARRIVAL", 4, ScreenMessageStyle.UPPER_CENTER);
            _partModule.nextLogicTime = 0;
            updateTrackingVars(vessel);
            updateNextLogicTime(vessel);
        }
Esempio n. 3
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)));
        }
Esempio n. 4
0
        private void HandleStartTrackingWindow()
        {
            if (_startTrackingWindow == null)
            {
                return;
            }
            if (!WindowManager.IsOpen(_startTrackingWindow))
            {
                CancelStartTracking();
                return;
            }
            if (_startTrackingVessel != null)
            {
                if (RmmUtil.IsTrackingActive(FlightGlobals.ActiveVessel) ||
                    !RmmUtil.IsPreLaunch(FlightGlobals.ActiveVessel))
                {
                    CancelStartTracking();
                    return;
                }

                _startTrackingWindow.VesselName  = _startTrackingVessel.vesselName;
                _startTrackingWindow.Price       = RmmUtil.CalculateVesselPrice(_startTrackingVessel);
                _startTrackingWindow.MinimumCrew = RmmUtil.AstronautCrewCount(_startTrackingVessel);
            }
            else if (_startDockingPort != null)
            {
                if (FlightGlobals.ActiveVessel.situation != Vessel.Situations.ORBITING)
                {
                    CancelStartTracking();
                    return;
                }

                List <Part> dockedVesselParts = RmmUtil.GetDockedParts(_startDockingPort.vessel, _startDockingPort);
                // determine minimum crew
                _startTrackingWindow.MinimumCrew = RmmUtil.AstronautCrewCount(dockedVesselParts);

                // determine minimum resources
                List <string>   propellants      = RmmUtil.DetermineProppellantArray(dockedVesselParts);
                List <Resource> minimumResources = new List <Resource>();

                foreach (String propellant in propellants)
                {
                    var amount = RmmUtil.ReadResource(dockedVesselParts, propellant);
                    if (amount != 0)
                    {
                        Resource resource = new Resource
                        {
                            Name   = propellant,
                            Amount = amount,
                        };
                        minimumResources.Add(resource);
                    }
                }

                _startTrackingWindow.MinimumResources = minimumResources;
            }
        }
Esempio n. 5
0
        public void StartTracking(string name)
        {
            Tracking tracking = null;

            if (_startTrackingVessel != null)
            {
                foreach (Part part in _startTrackingVessel.parts)
                {
                    var trackingModule = part.Modules.OfType <RMMModule>().FirstOrDefault();
                    if (trackingModule != null)
                    {
                        tracking = trackingModule.TrackingModule;
                        break;
                    }
                }
            }

            if (_startDockingPort != null)
            {
                List <Part> dockedVesselParts = RmmUtil.GetDockedParts(_startDockingPort.vessel, _startDockingPort);
                foreach (Part part in dockedVesselParts)
                {
                    var trackingModule = part.Modules.OfType <RMMModule>().FirstOrDefault();
                    if (trackingModule != null)
                    {
                        tracking = trackingModule.TrackingModule;
                        break;
                    }
                }
            }

            if (tracking == null)
            {
                LoggerRmm.Warning("no tracking module on vessel");
                return;
            }

            if (_startTrackingVessel != null)
            {
                tracking.StartLaunchMission(name);
            }

            if (_startDockingPort != null)
            {
                tracking.StartDepartMission(name, _startDockingPort);
            }

            CancelStartTracking();
        }
        public static Structure GetDockedStructure(Vessel vessel, Part dockedPort)
        {
            if (dockedPort == null)
            {
                return(null);
            }

            List <Part> dockedParts = RmmUtil.GetDockedParts(vessel, dockedPort);

            // root of structure is the docked port
            Part rootPart = dockedPort;

            // seperate child parts
            dockedParts.Remove(dockedPort);
            List <Part> childParts = dockedParts;

            // Create structure
            var structure = new Structure();

            structure.Parts = new List <StructurePart>();

            structure.Root = StructurePart.GetStructurePart(rootPart, rootPart);
            // decrement link count if root part is docked
            if (RmmUtil.IsDocked(vessel, dockedPort))
            {
                structure.Root.LinkCount--;
            }

            structure.Parts = new List <StructurePart>();
            // add root to structure parts
            structure.Parts.Add(structure.Root);
            // add all child parts to structure parts
            foreach (Part childPart in dockedParts)
            {
                structure.Parts.Add(StructurePart.GetStructurePart(childPart, rootPart));
            }

            return(structure);
        }