private void trackLaunch()
        {
            MissionLaunch launch = new MissionLaunch
            {
                Time       = (float)Planetarium.GetUniversalTime(),
                Body       = vessel.mainBody.name,
                VesselName = vessel.name,
                Funds      = RmmUtil.CalculateVesselPrice(vessel),
                Crew       = RmmUtil.AstronautCrewCount(vessel),
                Parts      = MissionPart.GetMissionPartList(vessel),
            };

            _mission.TrackLaunch(launch);
            trackingActive  = true;
            trackingPrimary = true;
            trackingStatus  = "Underway";

            //-----------------------
            trackPartCount    = RmmUtil.CountVesselParts(vessel);
            trackCrew         = RmmUtil.AstronautCrewCount(vessel);
            trackCrewCapacity = RmmUtil.CrewCapacityCount(vessel);

            ScreenMessages.PostScreenMessage("mission tracking-LAUNCH", 4, ScreenMessageStyle.UPPER_CENTER);
            setOtherModules();
            updateTrackingVars(vessel);
            updateNextLogicTime(vessel);
        }
        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 updateCrewCount()
        {
            int currentCount = RmmUtil.AstronautCrewCount(vessel);

            if (currentCount < trackCrew)
            {
                trackCrew = currentCount;
            }
        }
Exemple #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;
            }
        }
        //private void createMissionFile()
        //{
        //    string[] data = new string[16];
        //
        //    data[0] = "Name=" + trackName;
        //    data[1] = "CompanyName=" + trackCompanyName;
        //    data[2] = "VehicleName=" + trackVehicleName;
        //    data[3] = "LaunchSystemName=" + trackLaunchSystemName;
        //    data[4] = "Price=" + trackPrice.ToString();
        //    data[6] = "Time=" + trackMissionTime.ToString();
        //    data[7] = "Body=" + trackBody;
        //    data[8] = "MaxOrbitAltitude=" + trackMaxOrbitAltitude.ToString();
        //    data[9] = "MinimumCrew=" + trackMinimumCrew.ToString();
        //    data[10] = "MaximumCrew=" + trackMaximumCrew.ToString();
        //    data[11] = "ReturnEnabled=" + trackReturnEnabled.ToString();
        //    data[12] = "SafeReturn=" + trackSafeReturn.ToString();
        //    data[13] = "ReturnResources=" + trackReturnResources;
        //    data[14] = "ReturnCargoMass=" + trackReturnCargoMass.ToString();
        //    data[15] = "DockingDistance=0.15";
        //    data[16] = "MinimumReturnCrew=" + trackMinimumReturnCrew.ToString();
        //    data[17] = "CrewBalance=" + trackCrewBalance.ToString();
        //
        //    System.IO.File.WriteAllLines(RmmUtil.GamePath + RmmUtil.CommercialOfferingsPath + "Missions" + Path.DirectorySeparatorChar + trackFolderName + Path.DirectorySeparatorChar + "mission.txt", data);
        //
        //}

        private void createLandingFile()
        {
            string[] data = new string[6];

            data[0] = "ReturnLanding=" + returnMission.ToString();
            data[1] = "FlightID=" + part.flightID;
            data[2] = "LandingPrice=" + CalculateVesselPrice(false);
            data[3] = "LandingCrew=" + RmmUtil.AstronautCrewCount(vessel);
            data[4] = "MaximumLandingCrew=" + RmmUtil.AstronautCrewCount(vessel);
            data[5] = "ReturnCargoMass=" + trackReturnCargoMass.ToString();

            System.IO.File.WriteAllLines(RmmUtil.GamePath + RmmUtil.CommercialOfferingsPath + "Missions" + Path.DirectorySeparatorChar + trackFolderName + Path.DirectorySeparatorChar + "landing.txt", data);
        }
        private void trackDeparture()
        {
            Part dockedPart = null;

            foreach (Part p in vessel.parts)
            {
                if (p.flightID == trackPort)
                {
                    dockedPart = p;
                    break;
                }
            }

            MissionDeparture departure = new MissionDeparture
            {
                Time             = (float)Planetarium.GetUniversalTime(),
                Body             = vessel.mainBody.name,
                Orbit            = MissionOrbit.GetMissionOrbit(vessel.orbit),
                flightIDDockPart = trackPort,
                VesselName       = vessel.name,
                Crew             = RmmUtil.AstronautCrewCount(vessel),
                Parts            = MissionPart.GetMissionPartList(vessel),
                Resources        = MissionResource.GetMissionResourceList(vessel),
                Proppellants     = RmmUtil.DetermineProppellantArray(vessel),
                Structure        = Structure.GetDockedStructure(vessel, dockedPart)
            };

            _mission.TrackDeparture(departure);
            trackingActive  = true;
            trackingPrimary = true;
            trackingStatus  = "Underway";

            //-----------------------
            trackPartCount    = RmmUtil.CountVesselParts(vessel);
            trackCrew         = RmmUtil.AstronautCrewCount(vessel);
            trackCrewCapacity = RmmUtil.CrewCapacityCount(vessel);

            ScreenMessages.PostScreenMessage("mission tracking-DEPARTURE", 4, ScreenMessageStyle.UPPER_CENTER);
            setOtherModules();
            updateTrackingVars(vessel);
            updateNextLogicTime(vessel);
        }
        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;
            }
        }