void LEM::SeparateStage (UINT stage) { ResetThrusters(); VESSELSTATUS vs1; VECTOR3 ofs1 = _V(0,-5,0); VECTOR3 vel1 = _V(0,0,0); if (stage == 1) { GetStatus (vs1); vs1.eng_main = vs1.eng_hovr = 0.0; VECTOR3 rofs1, rvel1 = {vs1.rvel.x, vs1.rvel.y, vs1.rvel.z}; Local2Global (ofs1, vs1.rpos); GlobalRot (vel1, rofs1); vs1.rvel.x = rvel1.x+rofs1.x; vs1.rvel.y = rvel1.y+rofs1.y; vs1.rvel.z = rvel1.z+rofs1.z; vs1.vrot.x = 0.0; vs1.vrot.y = 0.0; vs1.vrot.z = 0.0; GetStatus (vs1); // Wrong sound, is Saturn staging // StageS.play(NOLOOP, 150); char VName[256]; strcpy (VName, GetName()); strcat (VName, "-DESCENTSTG"); hdsc = oapiCreateVessel(VName, "ProjectApollo/sat5LMDSC", vs1); SetLmAscentHoverStage(); } }
void LEM::ToggleEVA() { ToggleEva = false; if (CDREVA_IP) { // Nothing for now, the EVA is ended, when the LEVA vessel calls StopEVA /// \todo Support for 2 LEVA vessels } else { VESSELSTATUS vs1; GetStatus(vs1); // The LM must be in landed state if (vs1.status != 1) return; CDREVA_IP = true; OBJHANDLE hbody = GetGravityRef(); double radius = oapiGetSize(hbody); vs1.vdata[0].x += 4.5 * sin(vs1.vdata[0].z) / radius; vs1.vdata[0].y += 4.5 * cos(vs1.vdata[0].z) / radius; char VName[256]=""; strcpy (VName, GetName()); strcat (VName, "-LEVA"); hLEVA = oapiCreateVessel(VName,"ProjectApollo/LEVA",vs1); SwitchFocusToLeva = 10; LEVA *leva = (LEVA *) oapiGetVesselInterface(hLEVA); if (leva) { LEVASettings evas; evas.MissionNo = agc.GetApolloNo(); evas.Realism = Realism; leva->SetEVAStats(evas); } } }
DLLCLBK void opcPreStep(double simt, double simdt, double mjd) { if (Init==FALSE) { if (ConfigLoaded==FALSE) g_UFA.init(); LoadOptions(); Init=TRUE; srand(time(NULL)); return; } g_UFA.TimeStep(); HUD.TimeStep(); VOBJ * v = g_UFA.GetFocus(); if (v==NULL) return; char cbuf[255]; if (Ejection==TRUE) { if (lEjectionTime>oapiGetSimTime()) return; lEjectionTime=oapiGetSimTime()+1; int crewcount = v->crew.GetCrewTotalNumber(); if (!crewcount){ Ejection=FALSE; return; } double eVel = 0; VESSEL * vessel = NULL; VESSEL * focus = oapiGetFocusInterface(); VESSELSTATUS vs; OBJHANDLE hVes=NULL; if (VESSEL(v->hook).GetAtmPressure() < 2.5) { eVel=5; v->crew.SetEjectPosRotRelSpeed(_V(0, 0, 0),_V(0,1,0), _V(eVel,eVel, 0)); v->crew.EjectCrewMember(v->crew.GetCrewNameBySlotNumber(0)); }else { v->crew.SetEjectPosRotRelSpeed(_V(0, 0, 0),_V(0,1,0), _V(0,0, 0)); v->crew.EjectCrewMember(v->crew.GetCrewNameBySlotNumber(0)); } hVes = v->crew.GetObjHandleOfLastEVACrew(); if (!oapiIsVessel(hVes)) return; vessel = oapiGetVesselInterface(hVes); sprintf(cbuf,"%s-pack",vessel->GetName()); vessel->GetStatus(vs); oapiCreateVessel(cbuf,"Ummuturbopack",vs); } double yofs = Y_OFS_START; for (int i = 0; i < v->hudprint.m.size(); i++) { sprintf(cbuf,"%s",v->hudprint.m[i].c_str()); HUD.Add(0.0001,v->hook,HUD._D(X_OFS_START,1,yofs,1,Size,COLOR,cbuf)); yofs+=LINE_SPACE; } HUD.TimeStep(); }