Пример #1
0
// Keyboard interface handler
int MMU::clbkConsumeDirectKey (char *kstate)
{
	OBJHANDLE hvessel;
	if (KEYMOD_SHIFT (kstate)) 
	{
		return 0; // shift combinations are reserved
	}
	else if (KEYMOD_CONTROL (kstate)) 
	{
		// insert ctrl key combinations here
	}
	else 
	{ // unmodified keys
		if (KEYDOWN (kstate, OAPI_KEY_E)) { // "End EVA"
			if (oapiAcceptDelayedKey (OAPI_KEY_E, 1.0))
			{
				char name[256];
				char vname[256];
				UINT i;
				strcpy (vname, GetName());
				for (i=0;i<strlen(vname)+1;i++)
					name[i]=0;

				for (i=0;i<strlen(vname)-4;i++)
					name[i]=vname[i];
				//strncpy (name, vname,strlen(vname)+1-4);
				hvessel=oapiGetVesselByName(name);
				if (hvessel != 0)
					oapiSetFocusObject(hvessel);
			};
			return 1;
		}
	}
	return 0;
}
Пример #2
0
LRESULT CALLBACK WinProc(int nCode, WPARAM w, LPARAM l)
{
	if ((GetKeyState(VK_TAB) & 0x800)== 0 || (GetKeyState(w) & 0x800) == 0 || nCode < 0 || Ejection==TRUE)
		return CallNextHookEx(hhook, nCode, w, l);
	DWORD key = OAPI_KEY_TAB;
	if (!GetKey(w,key))
		return CallNextHookEx(hhook,nCode,w,l);

	VOBJ * v = g_UFA.GetFocus();
	if (v==NULL)
		return CallNextHookEx(hhook,nCode,w,l);
	char cbuf[255];
	switch(key)
	{
	case OAPI_KEY_EQUALS:
		{
			if (v->crew.GetCrewTotalNumber() < 1)
				sprintf(cbuf,"No one on board!");
			else
			sprintf(cbuf,"Selected member: %s",v->nextslot());
			v->hudprint.insert(cbuf);
			break;
		}
	case OAPI_KEY_UP:
		{
			EVA(v);
			break;
		}
	case OAPI_KEY_MINUS:
		{
			sprintf(cbuf,"Selected airlock: %d",v->nextlock()+1);
			v->hudprint.insert(cbuf);
			break;
		}
	case OAPI_KEY_RIGHT:
		{
			OBJHANDLE e = v->crew.GetObjHandleOfLastEVACrew();
			if (oapiIsVessel(e))
				oapiSetFocusObject(e);
			break;
		}
	case OAPI_KEY_LEFT:
		{
			oapiOpenDialog(g_hInst, IDD_DIALOG1 ,MsgProc,0);
			break;
		}
	case OAPI_KEY_E:
		{
			Ejection=TRUE;
			v->hudprint.insert("EJECTION!");
			lEjectionTime=oapiGetSimTime()-1;
			break;
		}
	}
	return CallNextHookEx(hhook, nCode, w, l);
}
Пример #3
0
int MMU::clbkConsumeBufferedKey (DWORD key, bool down, char *kstate)
{
	if (!down) return 0; // only process keydown events

	if (KEYMOD_SHIFT (kstate)) {
	} else if (KEYMOD_CONTROL (kstate)) {
	} else { // unmodified keys
		switch (key) {
		case OAPI_KEY_E: {  // end EVA
			DOCKHANDLE hDock = GetDockHandle (0);
			OBJHANDLE mate = GetDockStatus (hDock);
			if (mate) {
				oapiSetFocusObject(mate);
				oapiDeleteVessel (GetHandle(), mate);
			}
			} return 1;
		}
	}
	return 0;
}
Пример #4
0
void EVA::clbkPreStep (double simt, double SimDT, double mjd)

{
	char EVAName[256]="";
	char CSMName[256]="";
	char MSName[256]="";

	strcpy(EVAName,GetName());
	double VessCount;
	int i=0;
	VessCount=oapiGetVesselCount();
	hMaster=oapiGetVesselByIndex(i);
	while (i<VessCount)i++;{
	oapiGetObjectName(hMaster,MSName,256);
	strcpy(CSMName,MSName);strcat(CSMName,"-EVA");
		if (strcmp(CSMName,EVAName)==0)
		{
			i=int(VessCount);
		}
	}
	sprintf(oapiDebugString(), "EVA Cable Attached to %s", MSName);
	VESSELSTATUS csmV;
	VESSELSTATUS evaV;
	VESSEL *csmvessel;
	VECTOR3 rdist = {0,0,0};
	VECTOR3 posr  = {0,0,0};
	VECTOR3 rvel  = {0,0,0};
	VECTOR3 RelRot  = {0,0,0};
	double dist = 0.0;
	double Vel = 0.0;

	if (hMaster)
	{
		csmvessel = oapiGetVesselInterface(hMaster);
		oapiGetRelativePos (GetHandle() ,hMaster, &posr);
		oapiGetRelativeVel (GetHandle() ,hMaster , &rvel);
		GetStatus(evaV);
		csmvessel->GetStatus(csmV);
		GlobalRot (posr, RelRot);
		dist = sqrt(posr.x * posr.x + posr.y * posr.y + posr.z * posr.z);
		Vel = sqrt(rvel.x * rvel.x + rvel.y * rvel.y + rvel.z * rvel.z);
		if (dist >= 25)
		{
			rvel  = evaV.rvel-csmV.rvel;
			rvel.x = -rvel.x;
			rvel.y = -rvel.y;
			rvel.z = -rvel.z;
			GetStatus(evaV);
			csmvessel->GetStatus(csmV);
			evaV.rvel = csmV.rvel + rvel;
			DefSetState(&evaV);
		}
		if (GoDock1){
			sprintf(oapiDebugString(), "EVA Back CSM Mode Relative Distance M/s %f", dist);
			if (dist <= 0.55 && dist>=0.50 ){
				GoDock1 =false;
				oapiSetFocusObject(hMaster);
				oapiDeleteVessel(GetHandle());
			}
		}

	}
}