mirror of
https://github.com/swift-project/pilotclient.git
synced 2026-03-22 23:05:36 +08:00
Ref T717, function to send parts/situation for testing and in the model browser
This commit is contained in:
committed by
Mat Sutcliffe
parent
73b9371c73
commit
f80e093a0a
@@ -316,6 +316,9 @@ namespace BlackCore
|
||||
//! Test a remote aircraft
|
||||
virtual bool testRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, bool add) = 0;
|
||||
|
||||
//! Test update remote aircraft
|
||||
virtual bool testUpdateRemoteAircraft(const BlackMisc::Aviation::CCallsign cs, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) = 0;
|
||||
|
||||
//! Get matching setup
|
||||
virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const = 0;
|
||||
|
||||
|
||||
@@ -419,6 +419,16 @@ namespace BlackCore
|
||||
return false;
|
||||
}
|
||||
|
||||
//! \copydoc IContextSimulator::testUpdateRemoteAircraft
|
||||
virtual bool testUpdateRemoteAircraft(const BlackMisc::Aviation::CCallsign cs, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override
|
||||
{
|
||||
Q_UNUSED(cs);
|
||||
Q_UNUSED(situation);
|
||||
Q_UNUSED(parts);
|
||||
logEmptyContextWarning(Q_FUNC_INFO);
|
||||
return false;
|
||||
}
|
||||
|
||||
//! \copydoc IContextSimulator::setMatchingSetup
|
||||
virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const override
|
||||
{
|
||||
|
||||
@@ -1019,6 +1019,14 @@ namespace BlackCore
|
||||
return added;
|
||||
}
|
||||
|
||||
bool CContextSimulator::testUpdateRemoteAircraft(const CCallsign cs, const CAircraftSituation &situation, const CAircraftParts &parts)
|
||||
{
|
||||
if (!m_simulatorPlugin.second || !m_simulatorPlugin.second->isConnected()) { return false; }
|
||||
CAircraftSituation s = situation; // make sure to have correct callsign
|
||||
s.setCallsign(cs);
|
||||
return m_simulatorPlugin.second->testSendSituationAndParts(cs, s, parts);
|
||||
}
|
||||
|
||||
bool CContextSimulator::parseCommandLine(const QString &commandLine, const CIdentifier &originator)
|
||||
{
|
||||
Q_UNUSED(originator);
|
||||
|
||||
@@ -128,6 +128,7 @@ namespace BlackCore
|
||||
virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const override;
|
||||
virtual BlackMisc::CStatusMessageList copyFsxTerrainProbe(const BlackMisc::Simulation::CSimulatorInfo &simulator) override;
|
||||
virtual bool testRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, bool add) override;
|
||||
virtual bool testUpdateRemoteAircraft(const BlackMisc::Aviation::CCallsign cs, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
|
||||
|
||||
// also in IAircraftModelSetProvider
|
||||
virtual BlackMisc::Simulation::CAircraftModelList getModelSet() const override;
|
||||
|
||||
@@ -375,5 +375,10 @@ namespace BlackCore
|
||||
return m_dBusInterface->callDBusRet<bool>(QLatin1String("testRemoteAircraft"), aircraft, add);
|
||||
}
|
||||
|
||||
bool CContextSimulatorProxy::testUpdateRemoteAircraft(const CCallsign cs, const CAircraftSituation &situation, const CAircraftParts &parts)
|
||||
{
|
||||
return m_dBusInterface->callDBusRet<bool>(QLatin1String("testUpdateRemoteAircraft"), cs, situation, parts);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
@@ -111,6 +111,7 @@ namespace BlackCore
|
||||
virtual BlackMisc::Simulation::CAircraftMatcherSetup getMatchingSetup() const override;
|
||||
virtual BlackMisc::CStatusMessageList copyFsxTerrainProbe(const BlackMisc::Simulation::CSimulatorInfo &simulator) override;
|
||||
virtual bool testRemoteAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraft, bool add) override;
|
||||
virtual bool testUpdateRemoteAircraft(const BlackMisc::Aviation::CCallsign cs, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
|
||||
//! @}
|
||||
|
||||
private:
|
||||
|
||||
@@ -215,6 +215,9 @@ namespace BlackCore
|
||||
//! Test mode?
|
||||
bool isTestMode() const { return m_test; }
|
||||
|
||||
//! Send situation/parts for testing
|
||||
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) = 0;
|
||||
|
||||
//! Debug function to check state after all aircraft have been removed
|
||||
//! \remarks only in local developer builds
|
||||
virtual BlackMisc::CStatusMessageList debugVerifyStateAfterAllAircraftRemoved() const;
|
||||
|
||||
@@ -183,6 +183,14 @@ namespace BlackSimPlugin
|
||||
return m_interpolators[callsign]->getInterpolationMessages(setup.getInterpolatorMode());
|
||||
}
|
||||
|
||||
bool CSimulatorEmulated::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
|
||||
{
|
||||
if (!m_renderedAircraft.containsCallsign(callsign)) { return false; }
|
||||
m_renderedAircraft.setAircraftSituation(callsign, situation);
|
||||
m_renderedAircraft.setAircraftPartsSynchronized(callsign, parts);
|
||||
return true;
|
||||
}
|
||||
|
||||
void CSimulatorEmulated::highlightAircraft(const CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const CTime &displayTime)
|
||||
{
|
||||
if (canLog()) { m_monitorWidget->appendReceivingCall(Q_FUNC_INFO, aircraftToHighlight.toQString(), boolToTrueFalse(enableHighlight), displayTime.toQString()); }
|
||||
|
||||
@@ -69,6 +69,7 @@ namespace BlackSimPlugin
|
||||
virtual bool isPhysicallyRenderedAircraft(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
virtual BlackMisc::Aviation::CCallsignSet physicallyRenderedAircraft() const override;
|
||||
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
|
||||
|
||||
// ----- functions just logged -------
|
||||
virtual void highlightAircraft(const BlackMisc::Simulation::CSimulatedAircraft &aircraftToHighlight, bool enableHighlight, const BlackMisc::PhysicalQuantities::CTime &displayTime) override;
|
||||
|
||||
@@ -94,16 +94,16 @@ namespace BlackSimPlugin
|
||||
QDBusPendingReply<QStringList, QList<double>, QList<double>, QList<double>, QList<double>> reply = *watcher;
|
||||
if (!reply.isError())
|
||||
{
|
||||
const QStringList callsigns = reply.argumentAt<0>();
|
||||
const QList<double> latitudesDeg = reply.argumentAt<1>();
|
||||
const QList<double> longitudesDeg = reply.argumentAt<2>();
|
||||
const QList<double> elevationsM = reply.argumentAt<3>();
|
||||
const QStringList callsigns = reply.argumentAt<0>();
|
||||
const QList<double> latitudesDeg = reply.argumentAt<1>();
|
||||
const QList<double> longitudesDeg = reply.argumentAt<2>();
|
||||
const QList<double> elevationsM = reply.argumentAt<3>();
|
||||
const QList<double> verticalOffsets = reply.argumentAt<4>();
|
||||
setter(callsigns, latitudesDeg, longitudesDeg, elevationsM, verticalOffsets);
|
||||
setter(callsigns, latitudesDeg, longitudesDeg, elevationsM, verticalOffsets);
|
||||
}
|
||||
watcher->deleteLater();
|
||||
};
|
||||
m_dbusInterface->callDBusAsync(QLatin1String("getRemoteAircraftData"), callback, callsigns);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // ns
|
||||
} // ns
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
#define BLACKSIMPLUGIN_FLIGHTGEAR_TRAFFIC_PROXY_H
|
||||
|
||||
#include "blackmisc/genericdbusinterface.h"
|
||||
#include "blackmisc/aviation/aircraftsituation.h"
|
||||
#include "blackmisc/aviation/aircraftparts.h"
|
||||
#include "blackmisc/aviation/callsign.h"
|
||||
#include "blackmisc/geo/elevationplane.h"
|
||||
|
||||
@@ -47,21 +49,34 @@ namespace BlackSimPlugin
|
||||
const int s = callsigns.size();
|
||||
if (s != latitudesDeg.size()) { return false; }
|
||||
if (s != longitudesDeg.size()) { return false; }
|
||||
if (s != altitudesFt.size()) { return false; }
|
||||
if (s != altitudesFt.size()) { return false; }
|
||||
if (s != pitchesDeg.size()) { return false; }
|
||||
if (s != rollsDeg.size()) { return false; }
|
||||
if (s != headingsDeg.size()) { return false; }
|
||||
return true;
|
||||
}
|
||||
|
||||
QStringList callsigns; //!< List of callsigns
|
||||
//! Push back the latest situation
|
||||
void push_back(const BlackMisc::Aviation::CAircraftSituation &situation)
|
||||
{
|
||||
this->callsigns.push_back(situation.getCallsign().asString());
|
||||
this->latitudesDeg.push_back(situation.latitude().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
|
||||
this->longitudesDeg.push_back(situation.longitude().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
|
||||
this->altitudesFt.push_back(situation.getAltitude().value(BlackMisc::PhysicalQuantities::CLengthUnit::ft()));
|
||||
this->pitchesDeg.push_back(situation.getPitch().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
|
||||
this->rollsDeg.push_back(situation.getBank().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
|
||||
this->headingsDeg.push_back(situation.getHeading().value(BlackMisc::PhysicalQuantities::CAngleUnit::deg()));
|
||||
this->onGrounds.push_back(situation.getOnGround() == BlackMisc::Aviation::CAircraftSituation::OnGround);
|
||||
}
|
||||
|
||||
QStringList callsigns; //!< List of callsigns
|
||||
QList<double> latitudesDeg; //!< List of latitudes
|
||||
QList<double> longitudesDeg; //!< List of longitudes
|
||||
QList<double> altitudesFt; //!< List of altitudes
|
||||
QList<double> altitudesFt; //!< List of altitudes
|
||||
QList<double> pitchesDeg; //!< List of pitches
|
||||
QList<double> rollsDeg; //!< List of rolls
|
||||
QList<double> headingsDeg; //!< List of headings
|
||||
QList<bool> onGrounds; //!< List of onGrounds
|
||||
QList<bool> onGrounds; //!< List of onGrounds
|
||||
};
|
||||
|
||||
//! Planes surfaces
|
||||
@@ -70,6 +85,29 @@ namespace BlackSimPlugin
|
||||
//! Is empty?
|
||||
bool isEmpty() const { return callsigns.isEmpty(); }
|
||||
|
||||
//! Push back the latest parts
|
||||
void push_back(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftParts &parts)
|
||||
{
|
||||
this->callsigns.push_back(callsign.asString());
|
||||
this->gears.push_back(parts.isGearDown() ? 1 : 0);
|
||||
this->flaps.push_back(parts.getFlapsPercent() / 100.0);
|
||||
this->spoilers.push_back(parts.isSpoilersOut() ? 1 : 0);
|
||||
this->speedBrakes.push_back(parts.isSpoilersOut() ? 1 : 0);
|
||||
this->slats.push_back(parts.getFlapsPercent() / 100.0);
|
||||
this->wingSweeps.push_back(0.0);
|
||||
this->thrusts.push_back(parts.isAnyEngineOn() ? 0 : 0.75);
|
||||
this->elevators.push_back(0.0);
|
||||
this->rudders.push_back(0.0);
|
||||
this->ailerons.push_back(0.0);
|
||||
this->landLights.push_back(parts.getLights().isLandingOn());
|
||||
//! \todo KB 2019-09 Missing taxi lights in FG
|
||||
// this->taxiLights.push_back(parts.getLights().isTaxiOn());
|
||||
this->beaconLights.push_back(parts.getLights().isBeaconOn());
|
||||
this->strobeLights.push_back(parts.getLights().isStrobeOn());
|
||||
this->navLights.push_back(parts.getLights().isNavOn());
|
||||
this->lightPatterns.push_back(0);
|
||||
}
|
||||
|
||||
QStringList callsigns; //!< List of callsigns
|
||||
QList<double> gears; //!< List of gears
|
||||
QList<double> flaps; //!< List of flaps
|
||||
@@ -177,7 +215,6 @@ namespace BlackSimPlugin
|
||||
//! Get remote aircrafts data (lat, lon, elevation and CG)
|
||||
void getRemoteAircraftData(const QStringList &callsigns, const RemoteAircraftDataCallback &setter) const;
|
||||
|
||||
|
||||
private:
|
||||
BlackMisc::CGenericDBusInterface *m_dbusInterface = nullptr;
|
||||
};
|
||||
|
||||
@@ -149,6 +149,32 @@ namespace BlackSimPlugin
|
||||
return m_flightgearAircraftObjects[callsign].getInterpolationMessages(setup.getInterpolatorMode());
|
||||
}
|
||||
|
||||
bool CSimulatorFlightgear::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
|
||||
{
|
||||
if (!this->isConnected()) { return false; }
|
||||
if (!m_trafficProxy) { return false; }
|
||||
if (!m_flightgearAircraftObjects.contains(callsign)) { return false; }
|
||||
|
||||
int u = 0;
|
||||
if (!situation.isNull())
|
||||
{
|
||||
PlanesPositions planesPositions;
|
||||
planesPositions.push_back(situation);
|
||||
m_trafficProxy->setPlanesPositions(planesPositions);
|
||||
u++;
|
||||
}
|
||||
|
||||
if (!parts.isNull())
|
||||
{
|
||||
PlanesSurfaces surfaces;
|
||||
surfaces.push_back(callsign, parts);
|
||||
//! \todo KB 2091-09 FG parts sending missing
|
||||
// m_trafficProxy->setPlanesSurfaces(surfaces);
|
||||
u++;
|
||||
}
|
||||
return u > 0;
|
||||
}
|
||||
|
||||
void CSimulatorFlightgear::clearAllRemoteAircraftData()
|
||||
{
|
||||
m_aircraftAddedFailed.clear();
|
||||
|
||||
@@ -135,6 +135,7 @@ namespace BlackSimPlugin
|
||||
virtual QString getStatisticsSimulatorSpecific() const override;
|
||||
virtual void resetAircraftStatistics() override;
|
||||
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
|
||||
//! @}
|
||||
|
||||
//! Creates an appropriate dbus connection from the string describing it
|
||||
|
||||
@@ -348,8 +348,12 @@ namespace BlackSimPlugin
|
||||
|
||||
// Test only for successful position. FS9 requires constant positions
|
||||
if (!result.getInterpolationStatus().hasValidSituation()) { return; }
|
||||
this->sendMultiplayerPosition(result.getInterpolatedSituation());
|
||||
}
|
||||
|
||||
MPPositionSlewMode positionSlewMode = aircraftSituationToFS9(result.getInterpolatedSituation());
|
||||
void CFs9Client::sendMultiplayerPosition(const CAircraftSituation &situation)
|
||||
{
|
||||
MPPositionSlewMode positionSlewMode = aircraftSituationToFS9(situation);
|
||||
|
||||
QByteArray positionMessage;
|
||||
MultiPlayerPacketParser::writeType(positionMessage, CFs9Sdk::MULTIPLAYER_PACKET_ID_POSITION_SLEWMODE);
|
||||
|
||||
@@ -61,7 +61,9 @@ namespace BlackSimPlugin
|
||||
//! \copydoc BlackMisc::Simulation::CInterpolator::getInterpolationMessages
|
||||
BlackMisc::CStatusMessageList getInterpolationMessages(BlackMisc::Simulation::CInterpolationAndRenderingSetupBase::InterpolatorMode mode) const;
|
||||
|
||||
public slots:
|
||||
//! Send a situtaion (position)
|
||||
void sendMultiplayerPosition(const BlackMisc::Aviation::CAircraftSituation &situation);
|
||||
|
||||
//! Send new text message
|
||||
void sendTextMessage(const QString &textMessage);
|
||||
|
||||
|
||||
@@ -298,6 +298,22 @@ namespace BlackSimPlugin
|
||||
return client->getInterpolationMessages(setup.getInterpolatorMode());
|
||||
}
|
||||
|
||||
bool CSimulatorFs9::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
|
||||
{
|
||||
if (!m_hashFs9Clients.contains(callsign)) { return false; }
|
||||
CFs9Client *client = m_hashFs9Clients[callsign].data();
|
||||
if (!client) { return false; }
|
||||
|
||||
Q_UNUSED(parts);
|
||||
int u = 0;
|
||||
if (situation.isNull())
|
||||
{
|
||||
u++;
|
||||
client->sendMultiplayerPosition(situation);
|
||||
}
|
||||
return u > 0;
|
||||
}
|
||||
|
||||
bool CSimulatorFs9::isPhysicallyRenderedAircraft(const CCallsign &callsign) const
|
||||
{
|
||||
return m_hashFs9Clients.contains(callsign);
|
||||
|
||||
@@ -64,6 +64,7 @@ namespace BlackSimPlugin
|
||||
virtual void displayStatusMessage(const BlackMisc::CStatusMessage &message) const override;
|
||||
virtual void displayTextMessage(const BlackMisc::Network::CTextMessage &message) const override;
|
||||
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
|
||||
//! \@}
|
||||
|
||||
protected:
|
||||
|
||||
@@ -417,6 +417,26 @@ namespace BlackSimPlugin
|
||||
return (m_simConnectObjects[callsign]).getInterpolationMessages(setup.getInterpolatorMode());
|
||||
}
|
||||
|
||||
bool CSimulatorFsxCommon::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
|
||||
{
|
||||
if (!m_simConnectObjects.contains(callsign)) { return false; }
|
||||
CSimConnectObject simObject = m_simConnectObjects.value(callsign);
|
||||
int u = 0;
|
||||
if (!parts.isNull()) { this->sendRemoteAircraftPartsToSimulator(simObject, parts); u++; }
|
||||
if (!situation.isNull())
|
||||
{
|
||||
SIMCONNECT_DATA_INITPOSITION position = this->aircraftSituationToFsxPosition(situation, true);
|
||||
const bool traceSendId = this->isTracingSendId();
|
||||
const HRESULT hr = this->logAndTraceSendId(
|
||||
SimConnect_SetDataOnSimObject(
|
||||
m_hSimConnect, CSimConnectDefinitions::DataRemoteAircraftSetPosition,
|
||||
static_cast<SIMCONNECT_OBJECT_ID>(simObject.getObjectId()), 0, 0, sizeof(SIMCONNECT_DATA_INITPOSITION), &position),
|
||||
traceSendId, simObject, "Failed to set position", Q_FUNC_INFO, "SimConnect_SetDataOnSimObject");
|
||||
if (hr == S_OK) { u++; }
|
||||
}
|
||||
return u > 0;
|
||||
}
|
||||
|
||||
CSimConnectDefinitions::SimObjectRequest CSimulatorFsxCommon::requestToSimObjectRequest(DWORD requestId)
|
||||
{
|
||||
DWORD v = static_cast<DWORD>(CSimConnectDefinitions::SimObjectEndMarker);
|
||||
|
||||
@@ -155,6 +155,7 @@ namespace BlackSimPlugin
|
||||
virtual void resetAircraftStatistics() override;
|
||||
virtual void setFlightNetworkConnected(bool connected) override;
|
||||
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
|
||||
//! @}
|
||||
|
||||
//! \copydoc BlackMisc::Simulation::ISimulationEnvironmentProvider::requestElevation
|
||||
|
||||
@@ -152,6 +152,31 @@ namespace BlackSimPlugin
|
||||
return m_xplaneAircraftObjects[callsign].getInterpolationMessages(setup.getInterpolatorMode());
|
||||
}
|
||||
|
||||
bool CSimulatorXPlane::testSendSituationAndParts(const CCallsign &callsign, const CAircraftSituation &situation, const CAircraftParts &parts)
|
||||
{
|
||||
if (!this->isConnected()) { return false; }
|
||||
if (!m_trafficProxy) { return false; }
|
||||
if (!m_xplaneAircraftObjects.contains(callsign)) { return false; }
|
||||
|
||||
int u = 0;
|
||||
if (!situation.isNull())
|
||||
{
|
||||
PlanesPositions planesPositions;
|
||||
planesPositions.push_back(situation);
|
||||
m_trafficProxy->setPlanesPositions(planesPositions);
|
||||
u++;
|
||||
}
|
||||
|
||||
if (!parts.isNull())
|
||||
{
|
||||
PlanesSurfaces surfaces;
|
||||
surfaces.push_back(callsign, parts);
|
||||
m_trafficProxy->setPlanesSurfaces(surfaces);
|
||||
u++;
|
||||
}
|
||||
return u > 0;
|
||||
}
|
||||
|
||||
void CSimulatorXPlane::clearAllRemoteAircraftData()
|
||||
{
|
||||
m_aircraftAddedFailed.clear();
|
||||
|
||||
@@ -143,6 +143,7 @@ namespace BlackSimPlugin
|
||||
virtual QString getStatisticsSimulatorSpecific() const override;
|
||||
virtual void resetAircraftStatistics() override;
|
||||
virtual BlackMisc::CStatusMessageList getInterpolationMessages(const BlackMisc::Aviation::CCallsign &callsign) const override;
|
||||
virtual bool testSendSituationAndParts(const BlackMisc::Aviation::CCallsign &callsign, const BlackMisc::Aviation::CAircraftSituation &situation, const BlackMisc::Aviation::CAircraftParts &parts) override;
|
||||
//! @}
|
||||
|
||||
//! \copydoc BlackMisc::Simulation::ISimulationEnvironmentProvider::requestElevation
|
||||
|
||||
Reference in New Issue
Block a user