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; } }
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; } }