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); } }