Eychics_

Adhara Landing bof

Oct 18th, 2020
734
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package land.neutrino.rachel.rocket.adhara;
  2.  
  3. import com.google.gson.JsonObject;
  4. import com.google.gson.JsonPrimitive;
  5. import krpc.client.Connection;
  6. import krpc.client.RPCException;
  7. import krpc.client.Stream;
  8. import krpc.client.services.MechJeb;
  9. import krpc.client.services.SpaceCenter;
  10. import land.neutrino.rachel.Rachel;
  11. import land.neutrino.rachel.rocket.FirstStage;
  12. import land.neutrino.rachel.rocket.RocketBody;
  13. import land.neutrino.rachel.rocket.neutrino.FirstStageDatas;
  14. import land.neutrino.rachel.tracking.RequestType;
  15. import land.neutrino.rachel.tracking.StageEnum;
  16. import land.neutrino.rachel.utils.*;
  17. import org.javatuples.Pair;
  18. import org.javatuples.Triplet;
  19.  
  20. import javax.swing.*;
  21. import java.text.DecimalFormat;
  22.  
  23. public class Booster extends FirstStage {
  24.  
  25.     protected boolean Shoulditland;
  26.     protected SpaceCenter spaceCenter;
  27.     protected SpaceCenter.Vessel vessel;
  28.  
  29.     protected LandingComplexEnum landingComplexTarget;
  30.  
  31.     public Booster(SpaceCenter.Vessel vessel, SpaceCenter spaceCenter, String stageName, Connection connection, RocketBody rocketBody,LandingComplexEnum landingComplexEnum, boolean Shoulditland) {
  32.         super(rocketBody, stageName, connection);
  33.         this.Shoulditland = Shoulditland;
  34.         firstStageDatas = new FirstStageDatas();
  35.         this.stageName = stageName;
  36.         this.Shoulditland = Shoulditland;
  37.         this.spaceCenter = spaceCenter;
  38.         this.landingComplexTarget = landingComplexEnum;
  39.  
  40.         downrange = distance(landingComplexTarget.getLat(), 28.5289202545645, landingComplexTarget.getLong(), -80.52526259414269, 0.0, 0.0);
  41.  
  42.     }
  43.  
  44.     double downrange = 0;
  45.  
  46.     @Override
  47.     public void startup() {
  48.         try {
  49.             vessel.getControl().setThrottle(0f);
  50.             //Throttle: Adhara Slow: 0.35f | Other's adhara: 1f
  51.             /*for (int i = 10; i < 14; i++) {
  52.                 vessel.getParts().getEngines().get(i).setActive(true);
  53.             }*/
  54.  
  55.             System.out.println(stageName + " : " + "\n  0:" + impactPoint().getValue0() + "\n  1:" + impactPoint().getValue1() );
  56.  
  57.             for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  58.                 if(engine.getPart().getName().contains("cryoengine-375") && !engine.getPart().getTag().contains("secondEngine")) engine.setActive(true);
  59.             }
  60.             vessel.getControl().setThrottle(1f);
  61.             Rachel.getInstance().sendAlert("First Stage ignition", StageEnum.STAGE_1);
  62.             vessel.getControl().setSAS(true);
  63.             vessel.getAutoPilot().engage();
  64.             vessel.getAutoPilot().targetPitchAndHeading(90, Rachel.getInstance().getFlightInfo().getInclination());
  65.  
  66.  
  67.         } catch (Exception e) {
  68.             e.printStackTrace();
  69.         }
  70.     }
  71.  
  72.     @Override
  73.     public void meco() {
  74.         try {
  75.             for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  76.                 engine.setActive(false);
  77.             }
  78.             for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  79.                 engine.setThrustLimit(1f);
  80.             }
  81.             Rachel.getInstance().sendAlert("First Stage MECO", StageEnum.STAGE_1);
  82.         } catch (Exception e) {
  83.             e.printStackTrace();
  84.         }
  85.     }
  86.  
  87.     @Override
  88.     public void boostbackburn() {
  89.         Thread thread = new Thread(new Runnable() {
  90.             @Override
  91.             public void run() {
  92.                 try {
  93.                   //  if(!landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  94.                     vessel.getControl().setThrottle(0f);
  95.                     vessel.getControl().toggleActionGroup(4);
  96.                     //vessel.getControl().activateNextStage();
  97.                     vessel.getAutoPilot().engage();
  98.                     //-10
  99.  
  100.                     int pitch = 0;
  101.                     if((rocketBody.equals(RocketBody.SIDE_BOOSTER))) {
  102.                         pitch = 2;
  103.                     } else if (landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  104.                         pitch = 10;
  105.                     } else {
  106.                         pitch = 0;
  107.                     }
  108.                     SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  109.                     SpaceCenter.Flight flight = vessel.flight(refFrame);
  110.  
  111.                     int headingBase = /*(int)( 270 - Math.abs(flight.getHeading()));*/270;
  112.                     System.out.println("Heading" + headingBase + "  " + flight.getHeading());
  113.                     vessel.getAutoPilot().targetPitchAndHeading( pitch, headingBase);
  114.                     System.out.println(stageName + " : " + stageName + " : " + "Flip");
  115.  
  116.                     for (SpaceCenter.RCS rcs : vessel.getParts().getRCS()) {
  117.                         rcs.setEnabled(true);
  118.                     }
  119.                     vessel.getControl().setRCS(true);
  120.                     vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  121.                     //vessel.getControl().setThrottle(1f);
  122.  
  123.  
  124.  
  125.                     while (flight.getPitch() > (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 27 : 27) && flight.getHeading() > headingBase) {
  126.                         System.out.println(stageName + " : Pitch " + flight.getPitch() +  " Heading " + flight.getHeading());
  127.                     }
  128.  
  129.                     vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  130.  
  131.                     for (SpaceCenter.Part engine : vessel.getParts().withTag("sideEngine")) {
  132.                         engine.getEngine().setActive(true);
  133.                     }
  134.                     System.out.println(stageName + " : " + "Engine startup");
  135.                     Rachel.getInstance().getAnnaConnection().addEvent("Boostback Burn");
  136.                     vessel.getControl().setThrottle(1f);
  137.  
  138.                     vessel.getControl().setRCS(false);
  139.  
  140.  
  141.                     double maxLatDiff = (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 0.1 : 0.05);
  142.                     Pair<Double, Double> impact = impactPoint();
  143.                     while ((impact.getValue1() - maxLatDiff) > landingComplexTarget.getLong()/* || (impact.getValue0() - maxLatDiff) > landingComplexTarget.getLat()*/) {
  144.                         //if((impact.getValue1() - 0.2) > landingComplexTarget.getLong() && vessel.getParts().withTag("centerEngine").get(0).getEngine().getActive()) vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(false);
  145.                         impact = impactPoint();
  146.                         int correction = 0;
  147.                         if (impact.getValue0() - landingComplexTarget.getLat() > 0.01) {
  148.                             if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  149.                                 correction = headingBase - 45;
  150.                             } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  151.                                 correction = headingBase - 25;
  152.                             } else {
  153.                                 correction = headingBase - 5;
  154.                             }
  155.                             vessel.getAutoPilot().setTargetHeading(correction);
  156.                         } else if (impact.getValue0() - landingComplexTarget.getLat() < 0.01) {
  157.                             if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 20000) {
  158.                                 correction = headingBase + 45;
  159.                             } else if(metersBtwPoints(impact.getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  160.                                 correction = headingBase + 25;
  161.                             } else {
  162.                                 correction = headingBase + 5;
  163.                             }
  164.  
  165.                             vessel.getAutoPilot().setTargetHeading(correction);
  166.                         }
  167.                     }
  168.  
  169.                     System.out.println(stageName + " : " + "Engine shutdown");
  170.                     vessel.getControl().setThrottle(0f);
  171.  
  172.                    // }
  173.                     vessel.getAutoPilot().engage();
  174.                     vessel.getControl().setRCS(true);
  175.  
  176.  
  177.                     vessel.getAutoPilot().targetPitchAndHeading(90,0);
  178.  
  179.                     for (SpaceCenter.ControlSurface controlSurface : vessel.getParts().getControlSurfaces()) {
  180.                         controlSurface.setPitchEnabled(true);
  181.                         controlSurface.setYawEnabled(true);
  182.                     }
  183.  
  184.                     vessel.getControl().setBrakes(true);
  185.                     for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) {
  186.                         engine.setActive(false);
  187.                     }
  188.  
  189.                     entryburn();
  190.  
  191.  
  192.  
  193.  
  194.  
  195.                 } catch (Exception e) {
  196.                     e.printStackTrace();
  197.                 }
  198.             }
  199.         });
  200.  
  201.         thread.start();
  202.         thread.setPriority(1);
  203.     }
  204.  
  205.     @Override
  206.     public void entryburn() {
  207.         Thread thread = new Thread(new Runnable() {
  208.             @Override
  209.             public void run() {
  210.                 try {
  211.  
  212.                     SpaceCenter.Resources stageResources = vessel.getResources();
  213.                     Stream<Float> hydrogenResource = connection.addStream(stageResources, "amount", "LqdMethane");
  214.  
  215.                     System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214  * 100));
  216.  
  217.                     SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  218.                     SpaceCenter.Flight flight = vessel.flight(refFrame);
  219.  
  220.                     Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  221.                     while(verticalSpeed.get() > -0.01) { Thread.sleep(1000); }
  222.  
  223.                     Stream<Double> horizontalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getHorizontalSpeed");
  224.  
  225.  
  226.                     double retrograde = (Math.atan(Math.abs(verticalSpeed.get()) / horizontalSpeed.get()) * 180) / Math.PI;
  227.                     long time = System.currentTimeMillis();
  228.  
  229.                     int maxAngle = (rocketBody.equals(RocketBody.CENTER_CORE) ? 10 : (downrange > 600000 ? 50:70));
  230.                     if(landingComplexTarget == LandingComplexEnum.LandingComplex1A && rocketBody.equals(RocketBody.FIRST_STAGE))
  231.                         maxAngle = 80;
  232.  
  233.                     while (flight.getSurfaceAltitude() > 120000) { //65 000
  234.                         Thread.sleep(1000);
  235.                     }
  236.                     spaceCenter.setPhysicsWarpFactor(0);
  237.                     vessel.getAutoPilot().targetPitchAndHeading(maxAngle, 90);
  238.                     vessel.getAutoPilot().setTargetRoll(0f);
  239.  
  240.                     int correction = 0;
  241.                     if (impactPoint().getValue0() - landingComplexTarget.getLat() > 0.000000000001) {
  242.                         if(metersBtwPoints(impactPoint().getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  243.                             correction = 160 - 25;
  244.                         } else if(metersBtwPoints(impactPoint().getValue0(),0,landingComplexTarget.getLat(),0) > 5000) {
  245.                             correction = 160 - 10;
  246.                         } else {
  247.                             correction = 160 - 5;
  248.                         }
  249.                         vessel.getAutoPilot().setTargetHeading(correction);
  250.                     } else if (impactPoint().getValue0() - landingComplexTarget.getLat() < 0.000000000001) {
  251.                         if(metersBtwPoints(impactPoint().getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  252.                             correction = -20  - 25;
  253.                         } else if(metersBtwPoints(impactPoint().getValue0(),0,landingComplexTarget.getLat(),0) > 5000) {
  254.                             correction = -20  - 10;
  255.                         } else {
  256.                             correction = -20 - 5;
  257.                         }
  258.  
  259.                         vessel.getAutoPilot().setTargetHeading(correction);
  260.                     }
  261.                     System.out.println("Correction Init: " + correction + " " + vessel.getAutoPilot().getTargetHeading() + " - " + flight.getHeading());
  262.  
  263.                     Pair<Double, Double> impact;
  264.  
  265.                     while (flight.getSurfaceAltitude() > (rocketBody.equals(RocketBody.SIDE_BOOSTER) ? 92000 : (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? (downrange > 800000 ? 90000:70000) : 92000))) { //65 000
  266.                         Thread.sleep(1000);
  267.  
  268.                     }
  269.  
  270.                     spaceCenter.setPhysicsWarpFactor(0);
  271.                     vessel.getControl().setSAS(false);
  272.                     Rachel.getInstance().sendAlert("Entry burn start", StageEnum.STAGE_1);
  273.  
  274.                     vessel.getControl().setRCS(true);
  275.                     vessel.getParts().withTag("centerEngine").get(0).getEngine().setActive(true);
  276.                     Rachel.getInstance().getAnnaConnection().addEvent("Entry Burn");
  277.                     vessel.getControl().setThrottle(1f);
  278.  
  279.                     Thread.sleep(1000);
  280.                     for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
  281.                         sideEngine.getEngine().setActive(true);
  282.                         //sideEngine.getEngine().setThrustLimit(0.65f);
  283.                         sideEngine.getEngine().setThrustLimit(0.885f);
  284.                     }
  285.  
  286.  
  287.  
  288.                     /*while (verticalSpeed.get() < -700 || horizontalSpeed.get() > 1800) {
  289.                         //Thread.sleep(1000);
  290.  
  291.                         impact = impactPoint();
  292.  
  293.  
  294.                         if (impact.getValue0() - landingComplexTarget.getLat() > 0.00001) {
  295.                             if(metersBtwPoints(impactPoint().getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  296.                                 correction = 160 - 25;
  297.                             } else if(metersBtwPoints(impactPoint().getValue0(),0,landingComplexTarget.getLat(),0) > 5000) {
  298.                                 correction = 160 - 10;
  299.                             } else {
  300.                                 correction = 160 - 5;
  301.                             }
  302.                             vessel.getAutoPilot().setTargetHeading(correction);
  303.                         } else if (impactPoint().getValue0() - landingComplexTarget.getLat() < 0.00001) {
  304.                             if(metersBtwPoints(impactPoint().getValue0(),0,landingComplexTarget.getLat(),0) > 10000) {
  305.                                 correction = 45  - 25;
  306.                             } else if(metersBtwPoints(impactPoint().getValue0(),0,landingComplexTarget.getLat(),0) > 5000) {
  307.                                 correction = 30  - 10;
  308.                             } else {
  309.                                 correction = 25 - 5;
  310.                             }
  311.                             vessel.getAutoPilot().setTargetHeading(correction);
  312.                         }
  313.                         System.out.println("Correction: " + correction + " " + vessel.getAutoPilot().getTargetHeading() + " - " + flight.getHeading());
  314.                     }*/
  315.  
  316.                     while (verticalSpeed.get() < -700 || horizontalSpeed.get() > 1800) {
  317.                             double angle = 0;
  318.  
  319.  
  320.  
  321.                             if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000)) {
  322.                                 System.out.println(stageName + " : " + "Fin de guidance: 90°");
  323.                                 vessel.getAutoPilot().targetPitchAndHeading(90, 0);
  324.  
  325.                             } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > -0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) > -0.00000000000001) {
  326.                                 vessel.getAutoPilot().engage();
  327.                                 vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 225);
  328.                             } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > -0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat() < 0.00000000000001)) {
  329.                                 vessel.getAutoPilot().engage();
  330.                                 vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 315);
  331.                             } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < 0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) > -0.00000000000001) {
  332.                                 vessel.getAutoPilot().engage();
  333.                                 vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 135);
  334.                             } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < 0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) < 0.00000000000001) {
  335.                                 vessel.getAutoPilot().engage();
  336.                                 vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 45);
  337.                             } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > -0.00000000000001) {
  338.                                 vessel.getAutoPilot().engage();
  339.                                 vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 270);
  340.                             } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < 0.00000000000001) {
  341.                                 vessel.getAutoPilot().engage();
  342.                                 vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 90);
  343.                             } else if ((impactPoint().getValue0() - landingComplexTarget.getLat()) > -0.00000000000001) {
  344.                                 vessel.getAutoPilot().engage();
  345.                                 vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 180);
  346.                             } else if ((impactPoint().getValue0() - landingComplexTarget.getLat()) < 0.00000000000001) {
  347.                                 vessel.getAutoPilot().engage();
  348.                                 vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 0);
  349.                             } else {
  350.                                 vessel.getAutoPilot().targetPitchAndHeading(90, 0);
  351.                             }
  352.                         System.out.println("TP: "+vessel.getAutoPilot().getTargetPitch()+" - TH: "+vessel.getAutoPilot().getTargetHeading()+" || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  353.                     }
  354.  
  355.                     for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine")) {
  356.                         sideEngine.getEngine().setActive(true);
  357.                         sideEngine.getEngine().setThrustLimit(100f);
  358.                     }
  359.  
  360.  
  361.  
  362.  
  363.  
  364.                     //vessel.getControl().setSAS(true);
  365.                     //vessel.getControl().setSASMode(SpaceCenter.SASMode.RETROGRADE);
  366.                     vessel.getControl().setThrottle(0f);
  367.                     System.out.println(stageName + " : " + "End of entry burn engine guidance");
  368.                     System.out.println(stageName + " : " + "vSpeed: " + verticalSpeed.get());
  369.  
  370.                     for (SpaceCenter.Part sideEngine : vessel.getParts().withTag("sideEngine"))
  371.                         sideEngine.getEngine().setThrustLimit(0.30f);
  372.  
  373.                     System.out.println(stageName + " : " + "Entry burn shutdown, Time: " + ((System.currentTimeMillis() - time) / 1000) + " seconds");
  374.  
  375.  
  376.  
  377.  
  378.  
  379.                     //gridFinsGuidance(vessel);
  380.  
  381.                     System.out.println(stageName + " : " + "Fuel: " + (hydrogenResource.get() / 1030214  * 100));
  382.                     if(landingComplexTarget.equals(LandingComplexEnum.Droneship)) {
  383.                         liftDroneshipGuidance(vessel);
  384.                     } else {
  385.                         gridFinsGuidance(vessel);
  386.                     }
  387.  
  388.                 } catch (Exception e) { e.printStackTrace();}
  389.             }
  390.         });
  391.         thread.start();
  392.     }
  393.  
  394.     @Override
  395.     public void landingburn() {
  396.         new Thread(new Runnable() {
  397.             @Override
  398.             public void run() {
  399.                 try {
  400.                     //vessel = spaceCenter.getActiveVessel();
  401.                     restoreConnectionWithFirstStage(spaceCenter);
  402.                     vessel.getParts().setControlling(vessel.getParts().withName("proceduralAvionics").get(0));
  403.                     //spaceCenter.setActiveVessel(vessel);
  404.                     spaceCenter.setPhysicsWarpFactor(0);
  405.                     vessel.getControl().setRCS(true);
  406.                     boostbackburn();
  407.                     Rachel.getInstance().getAnnaConnection().updateVessel();
  408.  
  409.                     System.out.println(stageName + " : " + "Landing Burn is on");
  410.  
  411.                     Stream<Double> verticalSpeed = connection.addStream(vessel.flight(vessel.getOrbit().getBody().getReferenceFrame()), "getVerticalSpeed");
  412.                     while(verticalSpeed.get() > -0.01) { Thread.sleep(1000); }
  413.  
  414.                     SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  415.                     SpaceCenter.Flight flight = vessel.flight(refFrame);
  416.  
  417.  
  418.                     while (flight.getSurfaceAltitude() > 2000) { System.out.print(""); }
  419.  
  420.  
  421.                     Stream<Float> mass = connection.addStream(vessel, "getMass");
  422.  
  423.                     SpaceCenter.Resources stageResources = vessel.getResources();
  424.                     Stream<Float> hydrogenResource = connection.addStream(stageResources, "amount", "LqdHydrogen");
  425.  
  426.                     boolean engineGuidance = false;
  427.                     Rachel.getInstance().getAnnaConnection().addEvent("Landing Burn");
  428.                     while(flight.getSurfaceAltitude() > (landingComplexTarget.equals(LandingComplexEnum.Droneship) ? 52: 32)) {
  429.  
  430.                         double max_decel = vessel.getAvailableThrust() / mass.get() - vessel.getOrbit().getBody().getSurfaceGravity();
  431.                         double stop_dist = (Math.pow(verticalSpeed.get(),2) / (2 * max_decel));
  432.                         vessel.getControl().setThrottle((float)(stop_dist / (flight.getSurfaceAltitude() - 27)));
  433.  
  434.                         if(flight.getSurfaceAltitude() < 700 && !vessel.getControl().getLegs()) {
  435.                             vessel.getControl().setLegs(true);
  436.                         }
  437.                     }
  438.                     vessel.getControl().setThrottle(0f);
  439.                     for (SpaceCenter.Engine engine : vessel.getParts().getEngines()) { engine.setActive(false); }
  440.                     Rachel.getInstance().getAnnaConnection().addEvent("Landed");
  441.                     Rachel.getInstance().sendAlert("Adhara has landed", StageEnum.STAGE_1);
  442.                     Rachel.getInstance().sendAlert("Fuel remain: " +(hydrogenResource.get() / 887410  * 100) + "%", StageEnum.STAGE_1);
  443.                     Thread.sleep(5000);
  444.                     vessel.getControl().setRCS(false);
  445.                 } catch (Exception e) {
  446.                     e.printStackTrace();
  447.                 }
  448.             }
  449.         }).start();
  450.  
  451.     }
  452.  
  453.  
  454.     private void engineGuidance(SpaceCenter.Vessel vessel) {
  455.  
  456.         Thread thread = new Thread(new Runnable() {
  457.             @Override
  458.             public void run() {
  459.                 try {
  460.                     Rachel.getInstance().getAnnaConnection().addEvent("Engine Guidance");
  461.  
  462.                     SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  463.                     SpaceCenter.Flight flight = vessel.flight(refFrame);
  464.  
  465.                     System.out.println(stageName + " : " + "Engine guidance");
  466.                     double Distance =0;
  467.                     double maxAngle = 90;
  468.  
  469.                     System.out.println("Engine time: " + (System.currentTimeMillis() - time));
  470.                     while (flight.getSurfaceAltitude() > 500 && (!landingComplexTarget.equals(LandingComplexEnum.Droneship) || downrange > 600000)) {
  471.                         long time = System.currentTimeMillis();
  472.                         Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0);
  473.                         if (Distance > 1000) {
  474.                             maxAngle = 60;
  475.                         } else if (Distance > 500) {
  476.                             maxAngle = 80;
  477.                         } else if(Distance < 100) {
  478.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  479.                             maxAngle = 85;
  480.                         } else if(Distance < 50) {
  481.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  482.                             maxAngle = 88;
  483.                         } else if(Distance < 10) {
  484.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  485.                             maxAngle = 90;
  486.                         }
  487.  
  488.                         if(distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0) < 1) {
  489.                             System.out.println("Mode: 1 | TP: 90 - TH: 0 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  490.                             vessel.getAutoPilot().engage();
  491.                             vessel.getAutoPilot().targetPitchAndHeading(90, 0);
  492.  
  493.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > -0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) > -0.00000000000001) {
  494.                             System.out.println("Mode: 2 | TP: "+maxAngle+" - TH: 225 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  495.                             vessel.getAutoPilot().engage();
  496.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 225);
  497.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > -0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat() < 0.00000000000001)) {
  498.                             vessel.getAutoPilot().engage();
  499.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 315);
  500.                             System.out.println("Mode: 3 | TP: "+maxAngle+" - TH: 315 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  501.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < 0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) > -0.00000000000001) {
  502.                             vessel.getAutoPilot().engage();
  503.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 135);
  504.                             System.out.println("Mode: 4 | TP: "+maxAngle+" - TH: 135 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  505.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < 0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) < 0.00000000000001) {
  506.                             vessel.getAutoPilot().engage();
  507.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 45);
  508.                             System.out.println("Mode: 5 | TP: "+maxAngle+" - TH: 45 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  509.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > -0.00000000000001) {
  510.                             vessel.getAutoPilot().engage();
  511.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 270);
  512.                             System.out.println("Mode: 6 | TP: "+maxAngle+" - TH: 270 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  513.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < 0.00000000000001) {
  514.                             vessel.getAutoPilot().engage();
  515.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 90);
  516.                             System.out.println("Mode: 7 | TP: "+maxAngle+" - TH: 90 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  517.                         } else if ((impactPoint().getValue0() - landingComplexTarget.getLat()) > -0.00000000000001) {
  518.                             vessel.getAutoPilot().engage();
  519.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 180);
  520.                             System.out.println("Mode: 8 | TP: "+maxAngle+" - TH: 180 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  521.                         } else if ((impactPoint().getValue0() - landingComplexTarget.getLat()) < 0.00000000000001) {
  522.                             vessel.getAutoPilot().engage();
  523.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 0);
  524.                             System.out.println("Mode: 2 | TP: "+maxAngle+" - TH: 0 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  525.                         }
  526.  
  527.                     }
  528.                     System.out.println(stageName + " : " + "End of engine guidance");
  529.                     vessel.getAutoPilot().engage();
  530.                     vessel.getAutoPilot().targetPitchAndHeading(90, 0);
  531.  
  532.                 } catch (Exception e) { e.printStackTrace();}
  533.             }
  534.         });
  535.         thread.start();
  536.     }
  537.  
  538.     long time = System.currentTimeMillis();
  539.  
  540.     private void gridFinsGuidance(SpaceCenter.Vessel vessel) {
  541.  
  542.         Thread thread = new Thread(new Runnable() {
  543.             @Override
  544.             public void run() {
  545.                 try {
  546.                     Rachel.getInstance().getAnnaConnection().addEvent("Lift Guidance");
  547.                     Rachel.getInstance().sendAlert("Activate Gridfins guidance", StageEnum.STAGE_1);
  548.                     vessel.getControl().setRCS(true);
  549.  
  550.                     SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  551.                     SpaceCenter.Flight flight = vessel.flight(refFrame);
  552.  
  553.                     double Distance =0;
  554.  
  555.                     int maxAngle = 80;
  556.  
  557.  
  558.                     while (flight.getSurfaceAltitude() > 1500) {
  559.                         long time = System.currentTimeMillis();
  560.                         Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0,0);
  561.  
  562.                         if(Distance < 40000 && Distance > 1000) {
  563.                             maxAngle = 65;
  564.                         } else if(Distance < 1000 && Distance > 500) {
  565.                             maxAngle = 70;
  566.                         } else if(Distance < 500  && Distance > 250) {
  567.                             maxAngle = 70;
  568.                         } else if (Distance < 250  && Distance > 150) {
  569.                             maxAngle = 70;
  570.                         } else if(Distance < 150 && Distance > 50) {
  571.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  572.                             maxAngle = 80;
  573.                         } else if(Distance < 50 && Distance > 20) {
  574.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  575.                             maxAngle = 85;
  576.                         } else if(Distance < 20) {
  577.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  578.                             maxAngle = 87;
  579.                         }
  580.  
  581.                         if(flight.getSurfaceAltitude() > 20000 && Distance > 1500) {
  582.                             maxAngle = 30;
  583.                         }
  584.  
  585.  
  586.                         if(flight.getGForce() > 4) {
  587.                             maxAngle = maxAngle - 10;
  588.                             System.out.println("G Force !!");
  589.                         }
  590.  
  591.                         if (flight.getSurfaceAltitude() < 12000 && Distance > 500) {
  592.                             maxAngle = maxAngle - 10;
  593.                             System.out.println("Too Far: Add 12° of Angle");
  594.                         }
  595.  
  596.  
  597.                         if(distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0) < 5) {
  598.                             System.out.println("Mode: 1 | TP: 90 - TH: 0 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  599.                             vessel.getAutoPilot().targetPitchAndHeading(90, 0);
  600.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < -0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) <-0.00000000000001) {
  601.                             System.out.println("Mode: 2 | TP: "+maxAngle+" - TH: 225 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  602.                             vessel.getAutoPilot().engage();
  603.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 225);
  604.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < -0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat() > 0.00000000000001)) {
  605.                             System.out.println("Mode: 3 | TP: "+maxAngle+" - TH: 315 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  606.                             vessel.getAutoPilot().engage();
  607.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 315);
  608.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > 0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) < -0.00000000000001) {
  609.                             System.out.println("Mode: 4 | TP: "+maxAngle+" - TH: 135 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  610.                             vessel.getAutoPilot().engage();
  611.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 135);
  612.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > 0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) > 0.00000000000001) {
  613.                             System.out.println("Mode: 5 | TP: "+maxAngle+" - TH: 45 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  614.                             vessel.getAutoPilot().engage();
  615.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 45);
  616.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) < -0.00000000000001) {
  617.                             System.out.println("Mode: 6 | TP: "+maxAngle+" - TH: 270 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  618.                             vessel.getAutoPilot().engage();
  619.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 270);
  620.                         } else if ((impactPoint().getValue1() - landingComplexTarget.getLong()) > 0.00000000000001) {
  621.                             System.out.println("Mode: 7 | TP: "+maxAngle+" - TH: 90 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  622.                             vessel.getAutoPilot().engage();
  623.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 90);
  624.                         } else if ((impactPoint().getValue0() - landingComplexTarget.getLat()) < -0.00000000000001) {
  625.                             System.out.println("Mode: 8 | TP: "+maxAngle+" - TH: 180 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  626.                             vessel.getAutoPilot().engage();
  627.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 180);
  628.                         } else if ((impactPoint().getValue0() - landingComplexTarget.getLat()) > 0.00000000000001) {
  629.                             System.out.println("Mode: 9 | TP: "+maxAngle+" - TH: 0 || RP: "+ flight.getPitch() + " - RH" + flight.getHeading() );
  630.                             vessel.getAutoPilot().engage();
  631.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 0);
  632.                         }
  633.  
  634.  
  635.                         //Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0,0);
  636.                         //System.out.println(stageName + " : " + "Distance: " + Distance);
  637.                         //System.out.println(stageName + " : " + "Heading: " + vessel.getAutoPilot().getTargetHeading());
  638.                         //System.out.println(stageName + " : " + "Time: " + (System.currentTimeMillis() - time));
  639.  
  640.                     }
  641.                     time = System.currentTimeMillis();
  642.                     //if(Distance < 20)
  643.                     engineGuidance(vessel);
  644.  
  645.  
  646.  
  647.                 } catch (Exception e) { e.printStackTrace();}
  648.             }
  649.         });
  650.         thread.start();
  651.         thread.setPriority(Thread.MAX_PRIORITY);
  652.     }
  653.  
  654.     private void liftDroneshipGuidance(SpaceCenter.Vessel vessel) {
  655.  
  656.         Thread thread = new Thread(new Runnable() {
  657.             @Override
  658.             public void run() {
  659.                 try {
  660.                     Rachel.getInstance().getAnnaConnection().addEvent("Lift Guidance");
  661.                     Rachel.getInstance().sendAlert("Activate Lift Gridfins guidance", StageEnum.STAGE_1);
  662.                     vessel.getControl().setRCS(true);
  663.  
  664.                     SpaceCenter.ReferenceFrame refFrame = vessel.getSurfaceReferenceFrame();
  665.                     SpaceCenter.Flight flight = vessel.flight(refFrame);
  666.  
  667.                     double Distance =0;
  668.  
  669.                     int maxAngle = 80;
  670.  
  671.                     System.out.println(landingComplexTarget.getLat() + " " + (landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? 0.01 : 0)));
  672.                     System.out.println(landingComplexTarget.getLat() + " " + (landingComplexTarget.getLong() - (flight.getSurfaceAltitude() > 15000 ? 0.01 : 0)));
  673.                     while (flight.getSurfaceAltitude() > 1500) {
  674.                         long time = System.currentTimeMillis();
  675.                         Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0,0);
  676.                         if (Distance > 2000) {
  677.                             maxAngle = 70;
  678.                         } else if(Distance < 5000 && Distance > 1000) {
  679.                             maxAngle = (downrange > 600000 ? 65:70);
  680.                         } else if(Distance < 1000 && Distance > 500) {
  681.                             maxAngle = 65;
  682.                         } else if(Distance < 500  && Distance > 250) {
  683.                             maxAngle = 75;
  684.                         } else if (Distance < 250  && Distance > 100) {
  685.                             maxAngle = 75;
  686.                         } else if(Distance < 100 && Distance > 50) {
  687.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  688.                             maxAngle = 80;
  689.                         } else if(Distance < 50 && Distance > 20) {
  690.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  691.                             maxAngle = 85;
  692.                         } else if(Distance < 20) {
  693.                             //} else if ((distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), landingComplexTarget.getLong(), 0, 0) < 1000 && Distance > 100)) {
  694.                             maxAngle = 87;
  695.                         }
  696.  
  697.                         if(downrange > 600000 && Distance > 100) maxAngle = maxAngle -15;
  698.                         else if(downrange > 600000 && Distance < 60) maxAngle = maxAngle +5;
  699.                         // if(flight.getSurfaceAltitude() < 15000 || distance(impactPoint().getValue0(), (landingComplexTarget.getLat() + (flight.getSurfaceAltitude() < 15000 ? 0.01 : 0)),impactPoint().getValue1(), landingComplexTarget.getLong(),0.0,0.0) > 2000) {
  700.  
  701.  
  702.  
  703.  
  704.  
  705.  
  706.                         //calcul offset for deceleration: 0.025 offset
  707.                         double offset = 0.025 * (int)(downrange/100000);
  708.                         System.out.println((int)downrange/100000);
  709.                         System.out.println(offset);
  710.                         if (distance(impactPoint().getValue0(), landingComplexTarget.getLat(), impactPoint().getValue1(), (landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0)), 0.0, 0.0) < 5) {
  711.                             System.out.println("Mode: 1 | TP: 90 - TH: 0 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  712.                             vessel.getAutoPilot().targetPitchAndHeading(90, 0);
  713.                         } else if ((impactPoint().getValue1() - (landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0))) < -0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) < -0.00000000000001) {
  714.                             System.out.println("Mode: 2 | TP: " + maxAngle + " - TH: 225 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  715.                             vessel.getAutoPilot().engage();
  716.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 225);
  717.                         } else if ((impactPoint().getValue1() - (landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0))) < -0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat() > 0.00000000000001)) {
  718.                             System.out.println("Mode: 3 | TP: " + maxAngle + " - TH: 315 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  719.                             vessel.getAutoPilot().engage();
  720.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 315);
  721.                         } else if ((impactPoint().getValue1() - (landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0))) > 0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) < -0.00000000000001) {
  722.                             System.out.println("Mode: 4 | TP: " + maxAngle + " - TH: 135 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  723.                             vessel.getAutoPilot().engage();
  724.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 135);
  725.                         } else if ((impactPoint().getValue1() - (landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0))) > 0.00000000000001 && (impactPoint().getValue0() - landingComplexTarget.getLat()) > 0.00000000000001) {
  726.                             System.out.println("Mode: 5 | TP: " + maxAngle + " - TH: 45 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  727.                             vessel.getAutoPilot().engage();
  728.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 45);
  729.                         } else if ((impactPoint().getValue1() - (landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0))) < -0.00000000000001) {
  730.                             System.out.println("Mode: 6 | TP: " + maxAngle + " - TH: 270 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  731.                             vessel.getAutoPilot().engage();
  732.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 270);
  733.                         } else if ((impactPoint().getValue1() - (landingComplexTarget.getLong() + (flight.getSurfaceAltitude() > 15000 ? offset : 0))) > 0.00000000000001) {
  734.                             System.out.println("Mode: 7 | TP: " + maxAngle + " - TH: 90 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  735.                             vessel.getAutoPilot().engage();
  736.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 90);
  737.                         } else if ((impactPoint().getValue0() - landingComplexTarget.getLat()) < -0.00000000000001) {
  738.                             System.out.println("Mode: 8 | TP: " + maxAngle + " - TH: 180 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  739.                             vessel.getAutoPilot().engage();
  740.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 180);
  741.                         } else if ((impactPoint().getValue0() - landingComplexTarget.getLat()) > 0.00000000000001) {
  742.                             System.out.println("Mode: 9 | TP: " + maxAngle + " - TH: 0 || RP: " + flight.getPitch() + " - RH" + flight.getHeading());
  743.                             vessel.getAutoPilot().engage();
  744.                             vessel.getAutoPilot().targetPitchAndHeading((float) maxAngle, 0);
  745.                         }
  746.  
  747.  
  748.  
  749.  
  750.                         /*} else {
  751.                             vessel.getAutoPilot().targetPitchAndHeading(85, 0);
  752.                         }*/
  753.  
  754.                         //Distance = distance(impactPoint().getValue0(), landingComplexTarget.getLat(),impactPoint().getValue1(), landingComplexTarget.getLong(),0,0);
  755.                         //System.out.println(stageName + " : " + "Distance: " + Distance);
  756.                         //System.out.println(stageName + " : " + "Heading: " + vessel.getAutoPilot().getTargetHeading());
  757.                         //System.out.println(stageName + " : " + "Time: " + (System.currentTimeMillis() - time));
  758.  
  759.                     }
  760.                     time = System.currentTimeMillis();
  761.                     //if(Distance < 20)
  762.                     engineGuidance(vessel);
  763.  
  764.  
  765.  
  766.                 } catch (Exception e) { e.printStackTrace();}
  767.             }
  768.         });
  769.         thread.start();
  770.         thread.setPriority(10);
  771.     }
  772.  
  773.  
  774.     public double circle_distance(double lat1, double long1, double lat2, double long2, double radius) {
  775.         double local=  Math.pow(Math.sin((lat1-lat2)/2),2) + Math.pow(Math.cos(lat1)*Math.cos(lat2)*Math.sin((long1-long2)/2),2);
  776.  
  777.         return radius*Math.PI*Math.atan2(Math.sqrt(local),Math.sqrt(1-local))/90;
  778.     }
  779.  
  780.     public double distance(double lat1, double lat2, double lon1,
  781.                            double lon2, double el1, double el2) {
  782.  
  783.         final int R = 6371; // Radius of the earth
  784.  
  785.         double latDistance = Math.toRadians(lat2 - lat1);
  786.         double lonDistance = Math.toRadians(lon2 - lon1);
  787.         double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
  788.                 + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
  789.                 * Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
  790.         double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
  791.         double distance = R * c * 1000; // convert to meters
  792.  
  793.         double height = el1 - el2;
  794.  
  795.         distance = Math.pow(distance, 2) + Math.pow(height, 2);
  796.  
  797.         return Math.sqrt(distance);
  798.     }
  799.  
  800.  
  801.     /**
  802.      * Get first stage impact point
  803.      * @return Latitude / Longitude values.
  804.      */
  805.  
  806.     public Pair<Double, Double> impactPoint() {
  807.         try {
  808.             //System.out.println(Trajectories.newInstance(connection).impactPos().getValue0() + Trajectories.newInstance(connection).impactPos().getValue1());
  809.             return PR.newInstance(connection).getImpactPos(vessel);
  810.             //return Trajectories.newInstance(connection).impactPos();
  811.         } catch (Exception e) {
  812.         }
  813.  
  814.         return new Pair<>(0D,0D);
  815.     }
  816.  
  817.     public double metersBtwPoints(double lat1, double lon1, double lat2, double lon2) {
  818.         double R = 6371; // Radius of earth in KM
  819.         double dLat = lat2 * Math.PI / 180 - lat1 * Math.PI / 180;
  820.         double dLon = lon2 * Math.PI / 180 - lon1 * Math.PI / 180;
  821.         double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
  822.                 Math.cos(lat1 * Math.PI / 180) * Math.cos(lat2 * Math.PI / 180) *
  823.                         Math.sin(dLon/2) * Math.sin(dLon/2);
  824.         double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
  825.         double d = R * c;
  826.         return d * 1000; // meters
  827.     }
  828.  
  829.     public void restoreConnectionWithFirstStage(SpaceCenter spaceCenter) {
  830.         try {
  831.             System.out.println(stageName + " : " + "Recover network...");
  832.             for (SpaceCenter.Vessel spaceCenterVessel : spaceCenter.getVessels()) {
  833.  
  834.                 if (!(spaceCenterVessel.getMET() > 60)) {
  835.                     if(spaceCenterVessel.getParts().withName("proceduralAvionics").size() > 0) {
  836.                         System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().equals(stageName));
  837.                         System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().contains(stageName));
  838.                         System.out.println(stageName + " : " + spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag() + " " + stageName);
  839.                         if (spaceCenterVessel.getParts().withName("proceduralAvionics").get(0).getTag().equals(stageName)) {
  840.                             vessel = spaceCenterVessel;
  841.                             System.out.println(stageName + " : " + "New Vessel : " + this.vessel.getName());
  842.                             spaceCenterVessel.setName(stageName);
  843.                             break;
  844.                         }
  845.                     }
  846.                 }
  847.             }
  848.  
  849.             if(vessel == null) restoreConnectionWithFirstStage(spaceCenter);
  850.         } catch (Exception e) {
  851.             e.printStackTrace();
  852.         }
  853.     }
  854.  
  855.  
  856.     public LandingComplexEnum getLandingComplexTarget() {
  857.         return landingComplexTarget;
  858.     }
  859.  
  860.     //Should it land? Or should it splashdown ?
  861.     public boolean isShoulditland() {
  862.         return Shoulditland;
  863.     }
  864.  
  865.  
  866.     @Override
  867.     public void tick() {
  868.  
  869.     }
  870.  
  871.  
  872.  
  873. }
RAW Paste Data