void clbkSaveState(FILEHANDLE scn)
{
SaveDefaultState (scn);
Crew.SaveAllMembersInOrbiterScenarios(scn);
}
void clbkLoadStateEx (FILEHANDLE scn, void *status)
{
char *line;
while (oapiReadScenario_nextline (scn, line))
{
if(Crew.LoadAllMembersFromOrbiterScenario(line)==TRUE)
continue;
// ORBITER, unrecognised option - pass to Orbiter's generic parser
ParseScenarioLineEx (line, status);
}
}
int clbkConsumeBufferedKey(DWORD key, bool down, char *kstate)
{
// only process keydown events
if (!down)
return 0;
if(key==OAPI_KEY_E)
{
int Returned=Crew.EvaCrewMember(Crew.GetCrewNameBySlotNumber(SelectedUmmuMember));
switch(Returned)
{
case TRANSFER_TO_DOCKED_SHIP_OK:
sprintf(SendFocusScreenMessage(),"Transfer to docked ship Ok - %s transfered",Crew.GetLastEvaedCrewName());SelectedUmmuMember=0;
break;
case EVA_OK:
sprintf(SendFocusScreenMessage(),"EVA OK - %s left the ship",Crew.GetLastEvaedCrewName());SelectedUmmuMember=0;
break;
case ERROR_NO_ONE_ON_BOARD:
strcpy(SendFocusScreenMessage(),"Error, no one on board, unable to EVA");
break;
case ERROR_AIRLOCK_CLOSED:
strcpy(SendFocusScreenMessage(),"Error, airlock is closed, unable to EVA");
break;
case ERROR_DOCKED_SHIP_HAVE_AIRLOCK_CLOSED:
strcpy(SendFocusScreenMessage(),"Error, docked ship's airlock is closed, unable to transfer");
break;
case ERROR_DOCKED_SHIP_IS_FULL:
strcpy(SendFocusScreenMessage(),"Error, docked ship is already full transfer failed");
break;
case ERROR_CREW_MEMBER_NOT_FOUND:
strcpy(SendFocusScreenMessage(),"Error, no crew by this name in ship");
break;
case ERROR_DOCKEDSHIP_DONOT_USE_UMMU:
strcpy(SendFocusScreenMessage(),"Error, docked ship do not use UMmu 1.5, ask author to add it See http://orbiter.dansteph.com");
break;
case ERROR_MISC_ERROR_EVAFAILED:
strcpy(SendFocusScreenMessage(),"Misc error with UMMU See http://orbiter.dansteph.com to install it again");
break;
}
return TRUE;
}
if(key==OAPI_KEY_1)
{
if(Crew.GetCrewTotalNumber()==0)
{
strcpy(SendFocusScreenMessage(),"Sorry no one aboard unable to select");
return 1;
}
if(SelectedUmmuMember<Crew.GetCrewTotalNumber()-1)
SelectedUmmuMember++;
char * Name=Crew.GetCrewNameBySlotNumber(SelectedUmmuMember);
sprintf(SendFocusScreenMessage(),"Slot %i %s \"%s\" aged %i Selected for EVA or Transfer, please press \"E\" to EVA \"ESC\" to eject",SelectedUmmuMember,Crew.GetCrewMiscIdBySlotNumber(SelectedUmmuMember),Name,Crew.GetCrewAgeBySlotNumber(SelectedUmmuMember));
return 1;
}
if(key==OAPI_KEY_2)
{
// we test there is someone aboard
if(Crew.GetCrewTotalNumber()==0)
{
strcpy(SendFocusScreenMessage(),"Sorry no one aboard unable to select");
return 1;
}
if(SelectedUmmuMember>0)
SelectedUmmuMember--;
char * Name=Crew.GetCrewNameBySlotNumber(SelectedUmmuMember);
sprintf(SendFocusScreenMessage(),"Slot %i %s \"%s\" aged %i Selected for EVA or Transfer, please press \"E\" to EVA \"ESC\" to eject",SelectedUmmuMember,Crew.GetCrewMiscIdBySlotNumber(SelectedUmmuMember),Name,Crew.GetCrewAgeBySlotNumber(SelectedUmmuMember));
return 1;
}
//---------------------------------------------------------------------------
// Ummu Key "A" Switch the airlock door on/off
if(key==OAPI_KEY_A)
{
// switch state
Crew.SetAirlockDoorState(!Crew.GetAirlockDoorState());
// display state
if(Crew.GetAirlockDoorState()==TRUE)
strcpy(SendFocusScreenMessage(),"Airlock is now open");
else
strcpy(SendFocusScreenMessage(),"Airlock is now closed");
return 1;
}
if(key==OAPI_KEY_ESCAPE)
{
if(Crew.EjectCrewMember(Crew.GetCrewNameBySlotNumber(SelectedUmmuMember))==EVA_OK)
sprintf(SendFocusScreenMessage(),"%s EJECTED",Crew.GetLastEvaedCrewName());SelectedUmmuMember=0;
return 1;
}
if(key==OAPI_KEY_C)
{
Crew.SetAlternateMeshToUseForEVASpacesuit("mmu"); // the stock mmu of orbiter located in "meshes/mmu.msh"
strcpy(SendFocusScreenMessage(),"Mesh changed");
return 1;
}
//---------------------------------------------------------------------------
// Get some infos Name of ship and total soul aboard
if(key==OAPI_KEY_S)
{
sprintf(SendFocusScreenMessage(),"%i souls aboard ship %s, %i seats available",Crew.GetCrewTotalNumber(),GetName(),4-Crew.GetCrewTotalNumber());
return 1;
}
return 0;
}
void clbkVisualCreated (VISHANDLE vis, int refcount)
{
if(UmmuSdKInitReturnCode==-999)
strcpy(SendFocusScreenMessage(),"This addon require UMMU addon wich is not installed or outdated. See http://orbiter.dansteph.com to install it");
else if(UmmuSdKInitReturnCode!=1)
strcpy(SendFocusScreenMessage(),"Misc error with UMMU See http://orbiter.dansteph.com to install it again");
else if(UmmuSdKInitReturnCode==1)
strcpy(SendFocusScreenMessage(),"Welcome in UMmu SDK Demo. Keyboard Key: E=EVA 1=select next 2=select previous A=close/open airlock ESC=eject S=get ship info");
}
void clbkPostStep (double simtt, double simdt, double mjd)
{
int ReturnCode=Crew.ProcessUniversalMMu();
switch(ReturnCode)
{
case UMMU_TRANSFERED_TO_OUR_SHIP:
sprintf(SendFocusScreenMessage(),"%s \"%s\" aged %i was transfered to our ship",Crew.GetCrewMiscIdByName(Crew.GetLastEnteredCrewName()),Crew.GetLastEnteredCrewName(),Crew.GetCrewAgeByName(Crew.GetLastEnteredCrewName()));
break;
case UMMU_RETURNED_TO_OUR_SHIP:
sprintf(SendFocusScreenMessage(),"%s \"%s\" aged %i entered into our ship",Crew.GetCrewMiscIdByName(Crew.GetLastEnteredCrewName()),Crew.GetLastEnteredCrewName(),Crew.GetCrewAgeByName(Crew.GetLastEnteredCrewName()));
break;
}
if(GroundContact()==TRUE)
{
// we check vertical speed
int I;
VECTOR3 vHorizonAirspeedVector={0};
GetHorizonAirspeedVector (vHorizonAirspeedVector);
double VertSpeed =vHorizonAirspeedVector.y;
if(VertSpeed<-3)
{
// we touched ground with more than -3 m/s, sorry dude, time to kill you all :(
for(I=0;I<Crew.GetCrewTotalNumber();I++)
{
Crew.SetCrewMemberPulseBySlotNumber(I,0); // set cardiac pulse to zero
}
strcpy(SendFocusScreenMessage(),"Oooh no ! Crash - All crew aboard killed");
}
}
// this below are used by the simple user text interface used in this demo
// see function "SendFocusScreenMessage" below for explaination.
if(GetHandle()==oapiGetFocusObject())
{
strcpy(oapiDebugString(),cOurMessage);
}
}
void clbkFocusChanged(bool getfocus,OBJHANDLE hNewVessel,OBJHANDLE hOldVessel)
{
// erase message if we focus to another vessel
if(!getfocus)
{
strcpy(oapiDebugString(),"");
}
};
UMMUCREWMANAGMENT Crew;
void clbkSetClassCaps_UMMu(void)
{
UmmuSdKInitReturnCode=Crew.InitUmmu(GetHandle());
float UMmuVersion=Crew.GetUserUMmuVersion();
Crew.DefineAirLockShape(TRUE,-1,1,-1,3,-2,4); // Airlock open, 2 meter large 4 meter high 6 meter long (vessel local coordinate)
Crew.SetMembersPosRotOnEVA(_V(0,0,3),_V(0,0,0)); // 3 meters in front of ship (z) facing direction of ship (vessel local coordinate)
Crew.SetMaxSeatAvailableInShip(5);
// IDEA: Use the MiscID parameter to EVA with different spacesuit (captain,girl,english people etc etc)
Crew.AddCrewMember("Peter Falcon",41,65,74,"Capt"); //(for name and id a-z A-Z 0-9 characters only)
Crew.AddCrewMember("Fanny Gorgeous",27,67,55,"Eng"); //(for name and id a-z A-Z 0-9 characters only)
Crew.AddCrewMember("George HealGood",15,70,45,"Doc"); //(for name and id a-z A-Z 0-9 characters only)
Crew.AddCrewMember("Albert Jr Falcon",15,70,45); //(for name and id a-z A-Z 0-9 characters only)
// this variables below are used by the simple user text interface used in this demo
// see function "SendFocusScreenMessage" below for explaination.
strcpy(cOurMessage,"");
}
// our special SetClassCapfunction added for more readability
int SelectedUmmuMember; // for the SDK demo, select the member to eva
int UmmuSdKInitReturnCode; // to display init message to user (in case Ummu isn't installed on Orbiter)
char cOurMessage[1000];
char *SendFocusScreenMessage()
{
return cOurMessage;
}
// If you want to use standard ID function see bottom of UMmuExample.cpp
int EvaCrewMemberWithStandardSpacesuit(char* CrewName)
{
char TempMiscID[5]={0};
int I=0;
char MeshToUse[26]={"ummu/ummu"}; // default mesh if not found
// retriew the crew's MiscID
strcpy(TempMiscID,Crew.GetCrewMiscIdByName(CrewName));
// search if we find this ID in the list
for(I=0;I<NUMBER_OF_MMU_TYPE;I++)
{
if(strcmp(UmmuMiscID[I],TempMiscID)==0)
{
// found ! copy the mesh filename to use for EVA
strcpy(MeshToUse,UmmuMeshUsed[I]);
break;
}
}
// Set the mesh filename to use
Crew.SetAlternateMeshToUseForEVASpacesuit(MeshToUse);
// Eva the crew member with this mesh
return Crew.EvaCrewMember(CrewName);
}