public override Orbit GetOrbitAtUT(double desiredUT)
{
// After much trial and error this seems to be the only way to do this:
// Find the lastmost maneuver node that occurs prior to timestamp:
List<ManeuverNode> nodes = Vessel.patchedConicSolver == null ? new List<ManeuverNode>() : Vessel.patchedConicSolver.maneuverNodes;
Orbit orbitPatch = Vessel.orbit;
for (int nodeIndex = 0; nodeIndex < nodes.Count && nodes[nodeIndex].UT <= desiredUT; ++nodeIndex)
{
orbitPatch = nodes[nodeIndex].nextPatch; // the orbit patch that starts with this node.
}
// Walk the orbit patch list from there looking for the lastmost orbit patch that
// contains this timestamp, or if this timestamp is later than the end of the last
// patch, then just return the last patch (this can happen because a patches' EndUT
// is one period of time and we might be predicting for a point in time more than one
// period into the future.)
while (!(orbitPatch.StartUT < desiredUT && desiredUT < orbitPatch.EndUT))
{
// Sadly the way to detect that you are at the end of the orbitPatch list is
// messy and inconsistent. Sometimes KSP's API gives you a list that ends
// with null, and other times it gives you a list that ends with a bogus
// dummy orbit patch that is not null but contains bogus data and will crash
// KSP if you try calling many of its methods. The way to detect if you have
// such a bogus patch is to check its activePath property:
if (orbitPatch.nextPatch != null && orbitPatch.nextPatch.activePatch)
{
orbitPatch = orbitPatch.nextPatch;
}
else
{
break;
}
}
return orbitPatch;
}