protected ManeuverNode NextManeuverNodeForVessel(Vessel vessel) { if (vessel.flightPlanNode != null && vessel.flightPlanNode.HasNode("MANEUVER")) { ManeuverNode node = new ManeuverNode(); node.Load(vessel.flightPlanNode.GetNode("MANEUVER")); return(node); } return(null); }
public static bool CopyNodeFromFlightPlanNode(Vessel fromVessel, int index, Vessel toVessel) { if (index < 0 || index >= fromVessel.flightPlanNode.CountNodes || toVessel.patchedConicSolver == null) { return(false); } var node = new ManeuverNode(); node.Load(fromVessel.flightPlanNode.nodes[index]); var nodeCopy = toVessel.patchedConicSolver.AddManeuverNode(node.UT); nodeCopy.DeltaV = node.DeltaV; toVessel.patchedConicSolver.UpdateFlightPlan(); return(true); }
private bool update_maneuver_node() { Node = null; NodeCB = null; TargetOrbit = null; if (Solver != null) { if (Solver.maneuverNodes.Count <= 0) { return(false); } Node = Solver.maneuverNodes[0]; } else { if (VSL.vessel.flightPlanNode.nodes.Count <= 0) { return(false); } var node = VSL.vessel.flightPlanNode.nodes[0]; Node = new ManeuverNode(); Node.Load(node); Node.patch = new Orbit(VSL.orbit); Node.nextPatch = TrajectoryCalculator.NewOrbit(VSL.orbit, Utils.Node2OrbitalDeltaV(Node), Node.UT); VSL.vessel.flightPlanNode.RemoveNode(node); } NodeCB = Node.patch.referenceBody; TargetOrbit = Node.nextPatch; update_node_deltaV(); if (VSL.Engines.MaxDeltaV < Node.DeltaV.magnitude) { Status(Colors.Warning, "WARNING: there may be not enough propellant for the maneuver"); } return(true); }
public bool UpdatePayloadNode() { maneuverValid = false; nodeDeltaVm = 0; node = null; var now = Planetarium.GetUniversalTime(); ManeuverNode payloadNode = null; if (payload.patchedConicSolver != null && payload.patchedConicSolver.maneuverNodes.Count > 0) { var nodes = payload.patchedConicSolver.maneuverNodes; for (int i = 0, len = nodes.Count; i < len; i++) { if (nodes[i].UT <= now) { continue; } payloadNode = nodes[0]; break; } if (payloadNode != null) { node = new ManeuverNode { UT = payloadNode.UT, DeltaV = payloadNode.DeltaV, patch = payload.orbit, nextPatch = new Orbit(payloadNode.nextPatch) }; } } else if (payload.flightPlanNode.CountNodes > 0) { var nodes = payload.flightPlanNode.nodes; for (int i = 0, len = nodes.Count; i < len; i++) { payloadNode = new ManeuverNode(); payloadNode.Load(nodes[0]); if (payloadNode.UT <= now) { continue; } node = payloadNode; break; } if (payloadNode != null) { node = payloadNode; var hostNode = accelerator.vessel.patchedConicSolver.AddManeuverNode(node.UT); hostNode.DeltaV = node.DeltaV; accelerator.vessel.patchedConicSolver.UpdateFlightPlan(); node.patch = payload.orbit; node.nextPatch = hostNode.nextPatch; hostNode.RemoveSelf(); } } if (node == null) { accelerator.UI.AddMessage("Payload doesn't have a maneuver node."); return(false); } nodeDeltaVm = node.DeltaV.magnitude; return(true); }