]> git.mxchange.org Git - flightgear.git/blobdiff - src/Main/fg_init.cxx
Automatic tower positioning
[flightgear.git] / src / Main / fg_init.cxx
index 9eb8ae7a96b576906e9bbae5b1e87e907acc3332..50329b39f48506467809f5d548a0face5ee1e64e 100644 (file)
@@ -793,14 +793,44 @@ static bool fgSetTowerPosFromAirportID( const string& id) {
 
 struct FGTowerLocationListener : SGPropertyChangeListener {
     void valueChanged(SGPropertyNode* node) {
-        const string id(node->getStringValue());
+        string id(node->getStringValue());
+        if (fgGetBool("/sim/tower/auto-position",true))
+        {
+            // enforce using closest airport when auto-positioning is enabled 
+            const char* closest_airport = fgGetString("/sim/airport/closest-airport-id", "");
+            if (closest_airport && (id != closest_airport))
+            {
+                id = closest_airport;
+                node->setStringValue(id);
+            }
+        }
         fgSetTowerPosFromAirportID(id);
     }
 };
 
+struct FGClosestTowerLocationListener : SGPropertyChangeListener
+{
+    void valueChanged(SGPropertyNode* )
+    {
+        // closest airport has changed
+        if (fgGetBool("/sim/tower/auto-position",true))
+        {
+            // update tower position
+            const char* id = fgGetString("/sim/airport/closest-airport-id", "");
+            if (id && *id!=0)
+                fgSetString("/sim/tower/airport-id", id);
+        }
+    }
+};
+
 void fgInitTowerLocationListener() {
     fgGetNode("/sim/tower/airport-id",  true)
         ->addChangeListener( new FGTowerLocationListener(), true );
+    FGClosestTowerLocationListener* ntcl = new FGClosestTowerLocationListener();
+    fgGetNode("/sim/airport/closest-airport-id", true)
+        ->addChangeListener(ntcl , true );
+    fgGetNode("/sim/tower/auto-position", true)
+           ->addChangeListener(ntcl, true );
 }
 
 static void fgApplyStartOffset(const SGGeod& aStartPos, double aHeading, double aTargetHeading = HUGE_VAL)
@@ -1163,6 +1193,7 @@ bool fgInitPosition() {
         // An airport + parking position is requested
         if ( fgSetPosFromAirportIDandParkpos( apt, parkpos ) ) {
             // set tower position
+            fgSetString("/sim/airport/closest-airport-id",  apt.c_str());
             fgSetString("/sim/tower/airport-id",  apt.c_str());
             set_pos = true;
         }
@@ -1173,7 +1204,8 @@ bool fgInitPosition() {
         if ( fgSetPosFromAirportIDandRwy( apt, rwy_no, rwy_req ) ) {
             // set tower position (a little off the heading for single
             // runway airports)
-           fgSetString("/sim/tower/airport-id",  apt.c_str());
+            fgSetString("/sim/airport/closest-airport-id",  apt.c_str());
+            fgSetString("/sim/tower/airport-id",  apt.c_str());
             set_pos = true;
         }
     }
@@ -1183,7 +1215,8 @@ bool fgInitPosition() {
         if ( fgSetPosFromAirportIDandHdg( apt, hdg ) ) {
             // set tower position (a little off the heading for single
             // runway airports)
-           fgSetString("/sim/tower/airport-id",  apt.c_str());
+            fgSetString("/sim/airport/closest-airport-id",  apt.c_str());
+            fgSetString("/sim/tower/airport-id",  apt.c_str());
             set_pos = true;
         }
     }