From 40d5d918baf19b565da0352f3e97afde37064009 Mon Sep 17 00:00:00 2001 From: James Turner Date: Thu, 30 Aug 2018 15:23:45 +0100 Subject: [PATCH] Allow local acft to override packaged acft MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When an explicit aircraft-dir is set, check this location before checking installed packages. This allows setting —aircraft and -aircraft-dir to correctly take precedence over a package. --- src/Main/fg_init.cxx | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/Main/fg_init.cxx b/src/Main/fg_init.cxx index 45352ed7f..a3bb328e2 100644 --- a/src/Main/fg_init.cxx +++ b/src/Main/fg_init.cxx @@ -193,6 +193,24 @@ public: _cache = autoSave->getNode("sim/startup/path-cache", true); } + /** + * @brief haveExplicitAircraft - check if the combination of /sim/aircraft + * and /sim/aircraft-dir defines an explicit -set.xml. We need to detect + * this case to short-circuit package detection + * @return + */ + bool haveExplicitAircraft() const + { + const std::string aircraftDir = fgGetString("/sim/aircraft-dir", ""); + if (aircraftDir.empty()) { + return false; + } + + const std::string aircraft = fgGetString( "/sim/aircraft", ""); + SGPath setFile = SGPath::fromUtf8(aircraftDir) / (aircraft + "-set.xml"); + return setFile.exists(); + } + bool loadAircraft() { std::string aircraft = fgGetString( "/sim/aircraft", ""); @@ -624,11 +642,18 @@ int fgInitAircraft(bool reinit) flightgear::Options::sharedInstance()->initAircraft(); } + FindAndCacheAircraft f(globals->get_props()); + const bool haveExplicit = f.haveExplicitAircraft(); + SGSharedPtr pkgRoot(globals->packageRoot()); SGPropertyNode* aircraftProp = fgGetNode("/sim/aircraft", true); - string aircraftId(aircraftProp->getStringValue()); - PackageRef acftPackage = pkgRoot->getPackageById(aircraftId); + + PackageRef acftPackage; + if (!haveExplicit) { + acftPackage = pkgRoot->getPackageById(aircraftId); + } + if (acftPackage) { if (acftPackage->isInstalled()) { SG_LOG(SG_GENERAL, SG_INFO, "Loading aircraft from package:" << acftPackage->qualifiedId()); @@ -667,7 +692,6 @@ int fgInitAircraft(bool reinit) initAircraftDirsNasalSecurity(); - FindAndCacheAircraft f(globals->get_props()); if (!f.loadAircraft()) { return flightgear::FG_OPTIONS_ERROR; }