1
0
Fork 0

Crash fix: warn doing fallback for heliport runways

Due to an apt.dat bug, EGEL (Coll) is actually a heliport (Eddystone
lighthouse) with zero runways. Guard against this case to avoid a
crash.
This commit is contained in:
James Turner 2018-09-10 10:44:49 +01:00
parent ef98b667b4
commit 14a1390a68
2 changed files with 17 additions and 5 deletions

View file

@ -498,7 +498,9 @@ bool FGAIFlightPlan::createTakeOff(FGAIAircraft * ac, bool firstFlight,
}
FGRunway * rwy = apt->getRunwayByIdent(activeRunway);
assert( rwy != NULL );
if (!rwy)
return false;
double airportElev = apt->getElevation();
double d = accelDistance(vTaxiMetric, vRotateMetric, accelMetric) + ACCEL_POINT;
@ -565,6 +567,9 @@ bool FGAIFlightPlan::createClimb(FGAIAircraft * ac, bool firstFlight,
}
} else {
FGRunway* runway = apt->getRunwayByIdent(activeRunway);
if (!runway)
return false;
SGGeod cur = runway->end();
if (!waypoints.empty()) {
cur = waypoints.back()->getPos();
@ -610,7 +615,8 @@ bool FGAIFlightPlan::createDescent(FGAIAircraft * ac, FGAirport * apt,
apt->getDynamics()->getActiveRunway(rwyClass, 2, activeRunway,
heading);
FGRunway * rwy = apt->getRunwayByIdent(activeRunway);
assert( rwy != NULL );
if (!rwy)
return false;
// Create a slow descent path that ends 250 lateral to the runway.
double initialTurnRadius = getTurnRadius(vDescent, true);
@ -924,7 +930,9 @@ bool FGAIFlightPlan::createLanding(FGAIAircraft * ac, FGAirport * apt,
char buffer[12];
FGRunway * rwy = apt->getRunwayByIdent(activeRunway);
assert( rwy != NULL );
if (!rwy)
return false;
SGGeod threshold = rwy->threshold();
double currElev = threshold.getElevationFt();

View file

@ -582,6 +582,10 @@ string FGAirportDynamics::fallbackGetActiveRunway(int action, double heading)
}
} // of group building phase
if (groups.empty()) {
SG_LOG(SG_AI, SG_DEV_WARN, "fallbackGetActiveRunway: airport " << parent()->ident() << " has no runways");
return {};
}
// select highest scored group based on cross/tail wind
for (git = groups.begin(); git != groups.end(); ++git) {
@ -656,7 +660,7 @@ bool FGAirportDynamics::innerGetActiveRunway(const string & trafficType,
if (!rwyPrefs.available()) {
runway = fallbackGetActiveRunway(action, heading);
return true;
return !runway.empty();
}
RunwayGroup *currRunwayGroup = 0;
@ -819,7 +823,7 @@ void FGAirportDynamics::getActiveRunway(const string & trafficType,
string FGAirportDynamics::chooseRunwayFallback()
{
FGRunway *rwy = _ap->getActiveRunwayForUsage();
return rwy->ident();
return rwy ? rwy->ident() : std::string();
}
double FGAirportDynamics::getElevation() const