示例#1
0
// Callback from Target Selection Input Box
bool RVO_DialogFunc::clbkTGT(void *id, char *str, void *usrdata) {

  OBJHANDLE hTgtV;
  VESSEL* tv;
  bool DockFree = false;
  
  RVO_LCore* LC = (RVO_LCore*) usrdata;
  RVO_GCore* GC = LC->GC;
  RVO_VCore* VC = LC->VC;

  if (strlen(str) == 0) return true;    // Empty string - assume canceled dialog

  hTgtV = oapiGetVesselByName(str);
  if (!hTgtV) return true;               // String was not a vessel 

  tv = oapiGetVesselInterface(hTgtV);
  if (!tv) return true;               // Couldn't find the vessel interface
  if (tv == LC->v) return true;       // We can't dock with ourself (that would be rude!)

  // Target accepted 
  strcpy_s(VC->TargetText, 50, tv->GetName());
  VC->hTgtV = hTgtV;
  VC->tv = tv;

  VC->MaxPorts = VC->tv->DockCount();

  for (int i=0; i<VC->MaxPorts; i++) {

    VC->hDock = VC->tv->GetDockHandle(i);
    if (!VC->hDock) continue;                  // Couldn't find the dock??
    if (VC->tv->DockingStatus(i)==0) { // dock free
      DockFree = true;
      VC->tv->GetDockParams(VC->hDock, VC->rtvdPos, VC->rtvdDir, VC->rtvdRot);
      VC->CreatePortRotMatrix(VC->rtvPortOri,VC->rtvdDir,VC->rtvdRot);
      VC->PortNumber = i;
      break;
    }
  }

  if (!DockFree) {
    LC->showMessage = true;
    sprintf_s(LC->Message,"No free ports on %s!", VC->TargetText);
    VC->PortNumber = -1;
    VC->hDock = 0;
  }
  
  return true;

}
示例#2
0
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();
}
示例#3
0
void VOBJ::TimeStep(int SoundID)
{
	if (!oapiIsVessel(hook)){
		sprintf(msg, "Unknown Error");
		return;
	}
	if (!oapiGetVesselByIndex(iTarget) && mode == VTOV){
		mode=MAGIC;
		iTargetSource=0;
		iTarget=0;
	}
	if (VESSEL(hook).GetPropellantCount() < 1)
	{
		sprintf(msg, "No fuel sources available");
		return;
	}
	if (status==IDLE)
	{
		sprintf(msg, "IDLE: Waiting for action");
		return;
	}
	PlayMFDWave(SoundID, 0);
	if (mode==VTOV)
	{
		VESSEL * vHook = oapiGetVesselInterface(hook);
		VESSEL * vTarget = oapiGetVesselInterface(oapiGetVesselByIndex(iTarget));
		if (vTarget->GetPropellantCount() < 1)
		{
			sprintf(msg, "Target has no fuel sources");
			return;
		}
		PROPELLANT_HANDLE hpTarget = vTarget->GetPropellantHandleByIndex(iTargetSource);
		PROPELLANT_HANDLE hpHook   = vHook->GetPropellantHandleByIndex(iSelectedSource);
		if (!hpHook||!hpTarget){
			sprintf(msg, "Unknown Error!");
			return;
		}
		double maxMasstarget = vTarget->GetPropellantMaxMass(hpTarget);
		double massTarget = vTarget->GetPropellantMass(hpTarget);
		double maxMasshook = vHook->GetPropellantMaxMass(hpHook);
		double massHook = vHook->GetPropellantMass(hpHook);

		if (massTarget<CUT_OFF)
		{
			sprintf(msg, "No fuel left to transfer!");
			return;
		}
		if (fabs(maxMasshook-massHook) < CUT_OFF)
		{
			sprintf(msg, "Tank full");
			return;
		}
		if (hook == oapiGetVesselByIndex(iTarget))
		{
			if (iSelectedSource == iTargetSource)
			{
				sprintf(msg, "Cannot transfer fuel to the same source");
				return;
			}
		}
		double dFuelTrans = 0;
		if (massTarget-dTransferRate >= 0 && massHook+dTransferRate <= maxMasshook)
		{
			dFuelTrans = dTransferRate;
		}else
		{
			if (maxMasshook-massHook < massTarget)
			{
				dFuelTrans = maxMasshook-massHook;
			}else if (maxMasshook-massHook > massTarget)
			{
				dFuelTrans = massTarget;
			}else
				dFuelTrans = massTarget;
		}
		dFuelTrans*=oapiGetSimStep();
		vTarget->SetPropellantMass(hpTarget, massTarget-dFuelTrans);
		vHook->SetPropellantMass(hpHook, massHook+dFuelTrans);
		sprintf(msg, "Transfering %.2f%%", ((massHook+dFuelTrans)/maxMasshook)*100, 
			vTarget->GetName(), ((massTarget-dFuelTrans)/maxMasstarget)*100);
	}
	else if (mode == MAGIC)
	{
		VESSEL * v = oapiGetVesselInterface(hook);
		PROPELLANT_HANDLE hpr = v->GetPropellantHandleByIndex(iSelectedSource);
		if (!hpr)
		{
			sprintf(msg, "Unknown error!");
			return;
		}
		double mass = v->GetPropellantMass(hpr);
		double maxmass = v->GetPropellantMaxMass(hpr);
		if (fabs(maxmass-mass) < CUT_OFF){
			sprintf(msg, "Tank full");
			return;
		}
		double dFuelTrans = 0;
		if (mass+dTransferRate > maxmass)
			dFuelTrans = maxmass-mass;
		else
			dFuelTrans = dTransferRate;
		dFuelTrans*=oapiGetSimStep();
		v->SetPropellantMass(hpr, dFuelTrans+mass);
		sprintf(msg, "Transfering %.2f%%", ((mass+dFuelTrans)/maxmass)*100);
	}else if (mode == DUMPING)
	{
		VESSEL * v = oapiGetVesselInterface(hook);
		PROPELLANT_HANDLE hpr = v->GetPropellantHandleByIndex(iSelectedSource);
		if (!hpr)
		{
			sprintf(msg, "Unknown error!");
			return;
		}
		double mass = v->GetPropellantMass(hpr);
		double maxmass = v->GetPropellantMaxMass(hpr);
		if (mass <CUT_OFF)
		{
			sprintf(msg, "No more fuel left");
			return;
		}
		double dFuelTrans=0;
		if (mass-dTransferRate < 0)
			dFuelTrans = mass;
		else
			dFuelTrans = dTransferRate;
		dFuelTrans*=oapiGetSimStep();
		v->SetPropellantMass(hpr, mass-dFuelTrans);
		sprintf(msg, "Dumping %.2f%%", ((mass-dFuelTrans)/maxmass)*100);
	}
}