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 CheckList Allowed(Vessel vessel)
        {
            var checkList = new CheckList();

            checkList.Check(Valid(), "invalid arrival mission");
            if (!checkList.CheckSucces)
            {
                return(checkList);
            }

            checkList.Check(AllowedLocation(vessel), "location not allowed");
            checkList.Check(CrewCount >= _mission.Arrival.Crew, "not enough crew");
            checkList.Check(CrewCount <= _mission.Arrival.CrewCapacity, "too many crew");
            checkList.Check(flightIdArrivalDockPart > 0, "no docking port selected");
            LoggerRmm.Debug("aa23");
            return(checkList);
        }
        public CheckList AllowedLocation(Vessel vessel)
        {
            LoggerRmm.Debug("aa3");
            var checkList = new CheckList();

            LoggerRmm.Debug("aa31");
            checkList.Check(Valid(), "invalid arrival mission");
            if (!checkList.CheckSucces)
            {
                return(checkList);
            }
            LoggerRmm.Debug("aa32");
            checkList.Check(vessel.situation == Vessel.Situations.ORBITING, "vessel not in orbit");
            checkList.Check(vessel.mainBody.name == _mission.Arrival.Body, "vessel not at " + _mission.Arrival.Body);
            checkList.Check(RmmUtil.HomeBody(_mission.Arrival.Body) || vessel.orbit.semiMajorAxis < _mission.Arrival.Orbit.semiMajorAxis * 1.3, "vessel orbit too high");
            LoggerRmm.Debug("aa33");
            return(checkList);
        }