From 940b7281c92c97b9990078f32196ce115e2994a1 Mon Sep 17 00:00:00 2001 From: tzobler Date: Tue, 17 Dec 2024 23:06:46 +0100 Subject: [PATCH] feat: add native msfs2024 support --- .gitignore | 1 + CMakeLists.txt | 2 + cmake/simconnect/CMakeLists.txt | 3 +- .../swift-plugin-simulators.xml | 448 ++++++++++-------- src/config/buildconfig.h | 3 + src/config/buildconfig.inc | 2 +- src/config/buildconfig_gen.inc.in | 7 +- src/core/fsd/enums.h | 1 + src/core/fsd/fsdclient.cpp | 1 + src/core/fsd/serializer.cpp | 10 +- .../components/configsimulatorcomponent.cpp | 7 + .../components/configsimulatorcomponent.ui | 7 + src/gui/components/dbownmodelscomponent.cpp | 63 ++- src/gui/components/dbownmodelsetcomponent.cpp | 16 + src/gui/components/simulatorselector.cpp | 27 +- src/gui/components/simulatorselector.ui | 14 + src/misc/simulation/aircraftmodel.cpp | 2 + .../aircraftmodelloaderprovider.cpp | 5 + .../simulation/aircraftmodelloaderprovider.h | 1 + src/misc/simulation/aircraftmodelutils.cpp | 6 + src/misc/simulation/autopublishdata.cpp | 1 + src/misc/simulation/data/modelcaches.cpp | 30 +- src/misc/simulation/data/modelcaches.h | 19 + src/misc/simulation/distributor.cpp | 9 +- src/misc/simulation/distributor.h | 1 + .../simulation/distributorlistpreferences.cpp | 2 + .../simulation/distributorlistpreferences.h | 2 + .../simulation/fscommon/aircraftcfgparser.cpp | 12 +- .../simulation/fscommon/aircraftcfgparser.h | 2 +- src/misc/simulation/fscommon/fscommonutil.cpp | 11 + src/misc/simulation/fscommon/fscommonutil.h | 9 + .../simulation/fscommon/fsdirectories.cpp | 89 ++++ src/misc/simulation/fscommon/fsdirectories.h | 24 +- .../simulation/settings/simulatorsettings.cpp | 21 +- .../simulation/settings/simulatorsettings.h | 18 + src/misc/simulation/simulatorinfo.cpp | 49 +- src/misc/simulation/simulatorinfo.h | 19 +- src/misc/simulation/simulatorinfolist.cpp | 1 + src/misc/simulation/simulatorplugininfo.cpp | 16 +- src/misc/simulation/simulatorplugininfo.h | 3 + src/plugins/simulator/CMakeLists.txt | 9 +- .../fsxcommon/simconnectdatadefinition.cpp | 17 + .../fsxcommon/simconnectdatadefinition.h | 4 + .../simulator/fsxcommon/simconnectsymbols.cpp | 31 ++ .../simulator/fsxcommon/simconnectsymbols.h | 2 + .../fsxcommon/simulatorfsxcommon.cpp | 12 +- src/plugins/simulator/msfs2024/CMakeLists.txt | 29 ++ .../simulator/msfs2024/simulatormsfs2024.cpp | 50 ++ .../simulator/msfs2024/simulatormsfs2024.h | 49 ++ .../simulator/msfs2024/simulatormsfs2024.json | 7 + .../simulatormsfs2024.json.license} | 0 .../msfs2024/simulatormsfs2024factory.cpp | 29 ++ .../msfs2024/simulatormsfs2024factory.h | 38 ++ .../simulator/msfsconfig/CMakeLists.txt | 27 -- .../msfsconfig/simulatormsfsconfig.cpp | 19 - .../msfsconfig/simulatormsfsconfig.h | 34 -- .../msfsconfig/simulatormsfsconfig.json | 3 - 57 files changed, 978 insertions(+), 346 deletions(-) create mode 100644 src/plugins/simulator/msfs2024/CMakeLists.txt create mode 100644 src/plugins/simulator/msfs2024/simulatormsfs2024.cpp create mode 100644 src/plugins/simulator/msfs2024/simulatormsfs2024.h create mode 100644 src/plugins/simulator/msfs2024/simulatormsfs2024.json rename src/plugins/simulator/{msfsconfig/simulatormsfsconfig.json.license => msfs2024/simulatormsfs2024.json.license} (100%) create mode 100644 src/plugins/simulator/msfs2024/simulatormsfs2024factory.cpp create mode 100644 src/plugins/simulator/msfs2024/simulatormsfs2024factory.h delete mode 100644 src/plugins/simulator/msfsconfig/CMakeLists.txt delete mode 100644 src/plugins/simulator/msfsconfig/simulatormsfsconfig.cpp delete mode 100644 src/plugins/simulator/msfsconfig/simulatormsfsconfig.h delete mode 100644 src/plugins/simulator/msfsconfig/simulatormsfsconfig.json diff --git a/.gitignore b/.gitignore index 670f69ce2..759db19d5 100644 --- a/.gitignore +++ b/.gitignore @@ -51,3 +51,4 @@ cmake-build-*/ /out/ /dist/ CMakeUserPresets.json +/third_party/externals diff --git a/CMakeLists.txt b/CMakeLists.txt index 2f8a566f4..17d0dbb35 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,6 +44,7 @@ cmake_dependent_option(SWIFT_BUILD_XSWIFTBUS "Build xswiftbus" ON "NOT SWIFT_WIN option(SWIFT_BUILD_FLIGHTGEAR_PLUGIN "Build Flightgear plugin" ON) option(SWIFT_BUILD_EMULATED_PLUGIN "Build Emulated plugin" ON) cmake_dependent_option(SWIFT_BUILD_MSFS_PLUGIN "Build MSFS plugin" ON WIN32 OFF) +cmake_dependent_option(SWIFT_BUILD_MSFS2024_PLUGIN "Build MSFS2024 plugin" ON WIN32 OFF) option(SWIFT_MINIFY_DEBUG_SYMBOLS "Minify debug symbols" OFF) option(SWIFT_USE_CRASHPAD "Use crashpad" OFF) @@ -197,6 +198,7 @@ message(STATUS "\t FS9: ${SWIFT_BUILD_FS9_PLUGIN}") message(STATUS "\t FSX: ${SWIFT_BUILD_FSX_PLUGIN}") message(STATUS "\t P3D: ${SWIFT_BUILD_P3D_PLUGIN}") message(STATUS "\t MSFS: ${SWIFT_BUILD_MSFS_PLUGIN}") +message(STATUS "\t MSFS2024: ${SWIFT_BUILD_MSFS2024_PLUGIN}") message(STATUS "\t XPLANE: ${SWIFT_BUILD_XPLANE_PLUGIN}") message(STATUS "\t XSWIFTBUS: ${SWIFT_BUILD_XPLANE_PLUGIN}") message(STATUS "\t FLIGHTGEAR: ${SWIFT_BUILD_FLIGHTGEAR_PLUGIN}") diff --git a/cmake/simconnect/CMakeLists.txt b/cmake/simconnect/CMakeLists.txt index 8c2dddabe..c2c7a29e6 100644 --- a/cmake/simconnect/CMakeLists.txt +++ b/cmake/simconnect/CMakeLists.txt @@ -4,7 +4,7 @@ # Checks if variable for SDK path is set and SimConnect.h does exist in the include path. # If not, disable building the simulator plugin and emit warning message -if(SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN) +if(SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN OR SWIFT_BUILD_MSFS2024_PLUGIN) add_library(externals_simconnect INTERFACE IMPORTED GLOBAL) target_compile_definitions(externals_simconnect INTERFACE SIMCONNECT_H_NOMANIFEST) target_compile_definitions(externals_simconnect INTERFACE BUID_SIMCONNECT_LIB) @@ -30,6 +30,7 @@ if(SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN) add_install_command(${PROJECT_SOURCE_DIR}/third_party/externals/win32-msvc/32/lib/SimConnect.dll) elseif(SWIFT_WIN64) list(APPEND LIBS SimConnect.MSFS.dll) + list(APPEND LIBS SimConnect.MSFS2024.dll) list(APPEND LIBS SimConnect.P3D-v4.0.dll) list(APPEND LIBS SimConnect.P3D-v4.1.dll) list(APPEND LIBS SimConnect.P3D-v4.2.dll) diff --git a/installer/installbuilder/swift-plugin-simulators.xml b/installer/installbuilder/swift-plugin-simulators.xml index 15ea38b8d..47b2c4d98 100644 --- a/installer/installbuilder/swift-plugin-simulators.xml +++ b/installer/installbuilder/swift-plugin-simulators.xml @@ -3,209 +3,247 @@ SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 --> - simulators - Simulator Plugins - 1 - 1 - 1 - - - fs2004 - FS9: Flight Sim 2004 - 1 - MS Flight Simulator 2004 Simulator Plugin - 1 - 1 - - - bin/plugins/simulator - ${installdir}/bin/plugins/simulator - bin_plugins_simulator - windows - - - ../../dist/bin/plugins/simulator/simulatorfs9.dll - - - - - - - windows - - - equals - ${architecture} - 32 - - - - - fsx - FSX: Flight Sim X - 1 - MS Flight Simulator X Simulator Plugin -This plugin acts as the interface between swift and FSX. - 1 - 1 - - - bin/plugins/simulator - ${installdir}/bin/plugins/simulator - bin_plugins_simulator - windows - - - ../../dist/bin/plugins/simulator/simulatorfsx.dll - - - ../../dist/bin/plugins/simulator/simulatorfsxconfig.dll - - - - - - - windows - - - equals - ${architecture} - 32 - - - - - msfs - MSFS: Flight Sim 2020 - 1 - MS Flight Simulator 2020 Simulator Plugin -This plugin acts as the interface between swift and MSFS. - 1 - 1 - - - bin/plugins/simulator - ${installdir}/bin/plugins/simulator - bin_plugins_simulator - windows - - - ../../dist/bin/plugins/simulator/simulatormsfs.dll - - - ../../dist/bin/plugins/simulator/simulatormsfsconfig.dll - - - - - - - windows - - - - - p3d - PREPAR3D - 1 - LM Prepar3D Simulator Plugin -This plugin acts as the interface between swift and P3D. - 1 - 1 - - - bin/plugins/simulator - ${installdir}/bin/plugins/simulator - bin_plugins_simulator - windows - - - ../../dist/bin/plugins/simulator/simulatorp3d.dll - - - ../../dist/bin/plugins/simulator/simulatorp3dconfig.dll - - - - - - - windows - - - - - xplane - X-Plane - 1 - X-Plane Simulator Plugin -This plugin acts as the interface between swift and X-Plane - 1 - 1 - - - bin/plugins/simulator - ${installdir}/bin/plugins/simulator - bin_plugins_simulator - all - - - 1 - ../../dist/bin/plugins/simulator/*simulatorxplane* - */*.pdb;*/*.debug;*/*.dSYM - - - - - - - flightgear - FlightGear - 1 - FlightGear Simulator Plugin -This plugin acts as the interface between swift and FlightGear - 1 - 1 - - - bin/plugins/simulator - ${installdir}/bin/plugins/simulator - bin_plugins_simulator - all - - - 1 - ../../dist/bin/plugins/simulator/*simulatorflightgear* - */*.pdb;*/*.debug;*/*.dSYM - - - - - - - emulated - Emulated Simulator - 1 - Emulated Simulator Plugin -This plugin emulates a running simulator. Use this for testing swift only - 0 - 1 - - - bin/plugins/simulator - ${installdir}/bin/plugins/simulator - bin_plugins_simulator - all - - - 1 - ../../dist/bin/plugins/simulator/*simulatoremulated* - */*.pdb;*/*.debug;*/*.dSYM - - - - - - + simulators + Simulator Plugins + 1 + 1 + 1 + + + fs2004 + FS9: Flight Sim 2004 + 1 + MS Flight Simulator 2004 Simulator Plugin + 1 + 1 + + + bin/plugins/simulator + ${installdir}/bin/plugins/simulator + bin_plugins_simulator + windows + + + ../../dist/bin/plugins/simulator/simulatorfs9.dll + + + + + + + windows + + + equals + ${architecture} + 32 + + + + + fsx + FSX: Flight Sim X + 1 + + MS Flight Simulator X Simulator Plugin + This plugin acts as the interface between swift and FSX. + + 1 + 1 + + + bin/plugins/simulator + ${installdir}/bin/plugins/simulator + bin_plugins_simulator + windows + + + ../../dist/bin/plugins/simulator/simulatorfsx.dll + + + ../../dist/bin/plugins/simulator/simulatorfsxconfig.dll + + + + + + + windows + + + equals + ${architecture} + 32 + + + + + msfs + MSFS: Flight Sim 2020 + 1 + + MS Flight Simulator 2020 Simulator Plugin + This plugin acts as the interface between swift and MSFS. + + 1 + 1 + + + bin/plugins/simulator + ${installdir}/bin/plugins/simulator + bin_plugins_simulator + windows + + + ../../dist/bin/plugins/simulator/simulatormsfs.dll + + + + + + + windows + + + + + msfs2024 + MSFS2024: Flight Sim 2024 + 1 + + MS Flight Simulator 2024 Simulator Plugin + This plugin acts as the interface between swift and MSFS2024. + + 1 + 1 + + + bin/plugins/simulator + ${installdir}/bin/plugins/simulator + bin_plugins_simulator + windows + + + ../../dist/bin/plugins/simulator/simulatormsfs2024.dll + + + + + + + windows + + + + + p3d + PREPAR3D + 1 + + LM Prepar3D Simulator Plugin + This plugin acts as the interface between swift and P3D. + + 1 + 1 + + + bin/plugins/simulator + ${installdir}/bin/plugins/simulator + bin_plugins_simulator + windows + + + ../../dist/bin/plugins/simulator/simulatorp3d.dll + + + ../../dist/bin/plugins/simulator/simulatorp3dconfig.dll + + + + + + + windows + + + + + xplane + X-Plane + 1 + + X-Plane Simulator Plugin + This plugin acts as the interface between swift and X-Plane + + 1 + 1 + + + bin/plugins/simulator + ${installdir}/bin/plugins/simulator + bin_plugins_simulator + all + + + 1 + ../../dist/bin/plugins/simulator/*simulatorxplane* + */*.pdb;*/*.debug;*/*.dSYM + + + + + + + flightgear + FlightGear + 1 + + FlightGear Simulator Plugin + This plugin acts as the interface between swift and FlightGear + + 1 + 1 + + + bin/plugins/simulator + ${installdir}/bin/plugins/simulator + bin_plugins_simulator + all + + + 1 + ../../dist/bin/plugins/simulator/*simulatorflightgear* + */*.pdb;*/*.debug;*/*.dSYM + + + + + + + emulated + Emulated Simulator + 1 + + Emulated Simulator Plugin + This plugin emulates a running simulator. Use this for testing swift only + + 0 + 1 + + + bin/plugins/simulator + ${installdir}/bin/plugins/simulator + bin_plugins_simulator + all + + + 1 + ../../dist/bin/plugins/simulator/*simulatoremulated* + */*.pdb;*/*.debug;*/*.dSYM + + + + + + diff --git a/src/config/buildconfig.h b/src/config/buildconfig.h index 24149d2ff..fae433a95 100644 --- a/src/config/buildconfig.h +++ b/src/config/buildconfig.h @@ -30,6 +30,9 @@ namespace swift::config //! with MSFS support? static constexpr bool isCompiledWithMSFSSupport(); // defined in buildconfig_gen.inc.in + //! with MSFS2024 support? + static constexpr bool isCompiledWithMSFS2024Support(); // defined in buildconfig_gen.inc.in + //! with FSUIPC support? static constexpr bool isCompiledWithFsuipcSupport(); // defined in buildconfig_gen.inc.in diff --git a/src/config/buildconfig.inc b/src/config/buildconfig.inc index e9be8194a..4ffa76eaa 100644 --- a/src/config/buildconfig.inc +++ b/src/config/buildconfig.inc @@ -14,7 +14,7 @@ namespace swift::config { constexpr bool CBuildConfig::isCompiledWithMsFlightSimulatorSupport() { - return CBuildConfig::isCompiledWithFs9Support() || CBuildConfig::isCompiledWithFsxSupport() || CBuildConfig::isCompiledWithP3DSupport() || isCompiledWithMSFSSupport(); + return CBuildConfig::isCompiledWithFs9Support() || CBuildConfig::isCompiledWithFsxSupport() || CBuildConfig::isCompiledWithP3DSupport() || isCompiledWithMSFSSupport() || isCompiledWithMSFS2024Support(); } constexpr bool CBuildConfig::isCompiledWithFlightSimulatorSupport() diff --git a/src/config/buildconfig_gen.inc.in b/src/config/buildconfig_gen.inc.in index fc6787c8f..80daa5cbe 100644 --- a/src/config/buildconfig_gen.inc.in +++ b/src/config/buildconfig_gen.inc.in @@ -25,7 +25,7 @@ constexpr bool swift::config::CBuildConfig::isCompiledWithFsxSupport() constexpr bool swift::config::CBuildConfig::isCompiledWithFsuipcSupport() { - return isCompiledWithFsxSupport() || isCompiledWithP3DSupport() || isCompiledWithFs9Support() || isCompiledWithMSFSSupport(); + return isCompiledWithFsxSupport() || isCompiledWithP3DSupport() || isCompiledWithFs9Support() || isCompiledWithMSFSSupport() || isCompiledWithMSFS2024Support(); } constexpr bool swift::config::CBuildConfig::isCompiledWithXPlaneSupport() @@ -43,6 +43,11 @@ constexpr bool swift::config::CBuildConfig::isCompiledWithMSFSSupport() return SWIFTCONFIG_${SWIFT_BUILD_MSFS_PLUGIN}; } +constexpr bool swift::config::CBuildConfig::isCompiledWithMSFS2024Support() +{ + return SWIFTCONFIG_${SWIFT_BUILD_MSFS2024_PLUGIN}; +} + constexpr int swift::config::CBuildConfig::versionMajor() { return ${SWIFT_VERSION_MAJOR}; } constexpr int swift::config::CBuildConfig::versionMinor() { return ${SWIFT_VERSION_MINOR}; } diff --git a/src/core/fsd/enums.h b/src/core/fsd/enums.h index 8d7e9453c..86e0c747f 100644 --- a/src/core/fsd/enums.h +++ b/src/core/fsd/enums.h @@ -53,6 +53,7 @@ namespace swift::core::fsd MSFS2004, /*!< MS Flight Simulator 2004 */ MSFSX, /*!< MS Flight Simulator X */ MSFS, /*!< MS Flight Simulator 2020 */ + MSFS2024, /*!< MS Flight Simulator 2024 */ XPLANE8, /*!< X-Plane 8 */ XPLANE9, /*!< X-Plane 9 */ XPLANE10, /*!< X-Plane 10 */ diff --git a/src/core/fsd/fsdclient.cpp b/src/core/fsd/fsdclient.cpp index 7f862d82f..51509a91f 100644 --- a/src/core/fsd/fsdclient.cpp +++ b/src/core/fsd/fsdclient.cpp @@ -205,6 +205,7 @@ namespace swift::core::fsd case CSimulatorInfo::FG: m_simType = SimType::FlightGear; break; case CSimulatorInfo::XPLANE: m_simType = SimType::XPLANE11; break; case CSimulatorInfo::MSFS: m_simType = SimType::MSFS; break; + case CSimulatorInfo::MSFS2024: m_simType = SimType::MSFS2024; break; default: m_simType = SimType::Unknown; break; } m_simTypeInfo = CSimulatorInfo(simulator); diff --git a/src/core/fsd/serializer.cpp b/src/core/fsd/serializer.cpp index 67ac22896..65f4f1ac1 100644 --- a/src/core/fsd/serializer.cpp +++ b/src/core/fsd/serializer.cpp @@ -168,6 +168,8 @@ namespace swift::core::fsd case SimType::MSCFS3: return "7"; case SimType::MSFS2004: return "8"; case SimType::MSFSX: return "9"; + case SimType::MSFS: return "10"; + case SimType::MSFS2024: return "11"; case SimType::XPLANE8: return "12"; case SimType::XPLANE9: return "13"; case SimType::XPLANE10: return "14"; @@ -178,10 +180,10 @@ namespace swift::core::fsd case SimType::P3Dv3: return "30"; case SimType::P3Dv4: return "30"; + // future versions // future versions case SimType::XPLANE12: - case SimType::P3Dv5: - case SimType::MSFS: return "0"; + case SimType::P3Dv5: return "0"; } Q_UNREACHABLE(); @@ -215,6 +217,10 @@ namespace swift::core::fsd return SimType::MSFS2004; else if (str == "9") return SimType::MSFSX; + else if (str == "10") + return SimType::MSFS; + else if (str == "11") + return SimType::MSFS2024; else if (str == "12") return SimType::XPLANE8; else if (str == "13") diff --git a/src/gui/components/configsimulatorcomponent.cpp b/src/gui/components/configsimulatorcomponent.cpp index 3fcca2aaa..e7dcbb9b4 100644 --- a/src/gui/components/configsimulatorcomponent.cpp +++ b/src/gui/components/configsimulatorcomponent.cpp @@ -59,6 +59,8 @@ namespace swift::gui::components (sims.isFS9() || !CFsDirectories::fs9Dir().isEmpty()) && CBuildConfig::isCompiledWithFs9Support(); const bool msfs = (sims.isMSFS() || !CFsDirectories::msfsDir().isEmpty()) && CBuildConfig::isCompiledWithMSFSSupport(); + const bool msfs2024 = (sims.isMSFS2024() || !CFsDirectories::msfs2024Dir().isEmpty()) && + CBuildConfig::isCompiledWithMSFS2024Support(); const bool xp = sims.isXPlane() && CBuildConfig::isCompiledWithXPlaneSupport(); const bool fg = sims.isFG() && CBuildConfig::isCompiledWithFGSupport(); @@ -68,6 +70,7 @@ namespace swift::gui::components ui->cb_XP->setChecked(xp); ui->cb_FG->setChecked(fg); ui->cb_MSFS->setChecked(msfs); + ui->cb_MSFS2024->setChecked(msfs2024); ui->cb_P3D->setEnabled(CBuildConfig::isCompiledWithP3DSupport()); ui->cb_FSX->setEnabled(CBuildConfig::isCompiledWithFsxSupport()); @@ -75,6 +78,7 @@ namespace swift::gui::components ui->cb_XP->setEnabled(CBuildConfig::isCompiledWithXPlaneSupport()); ui->cb_FG->setEnabled(CBuildConfig::isCompiledWithFGSupport()); ui->cb_MSFS->setEnabled(CBuildConfig::isCompiledWithMSFSSupport()); + ui->cb_MSFS2024->setEnabled(CBuildConfig::isCompiledWithMSFS2024Support()); CGuiUtility::checkBoxReadOnly(ui->cb_P3D, !CBuildConfig::isCompiledWithP3DSupport()); CGuiUtility::checkBoxReadOnly(ui->cb_FSX, !CBuildConfig::isCompiledWithFsxSupport()); @@ -82,6 +86,7 @@ namespace swift::gui::components CGuiUtility::checkBoxReadOnly(ui->cb_XP, !CBuildConfig::isCompiledWithXPlaneSupport()); CGuiUtility::checkBoxReadOnly(ui->cb_FG, !CBuildConfig::isCompiledWithFGSupport()); CGuiUtility::checkBoxReadOnly(ui->cb_MSFS, !CBuildConfig::isCompiledWithMSFSSupport()); + CGuiUtility::checkBoxReadOnly(ui->cb_MSFS2024, !CBuildConfig::isCompiledWithMSFS2024Support()); if (p3d) { ui->comp_SettingsSimulator->setSimulator(CSimulatorInfo(CSimulatorInfo::P3D)); } else if (fsx) { ui->comp_SettingsSimulator->setSimulator(CSimulatorInfo(CSimulatorInfo::FSX)); } @@ -89,6 +94,7 @@ namespace swift::gui::components else if (xp) { ui->comp_SettingsSimulator->setSimulator(CSimulatorInfo(CSimulatorInfo::XPLANE)); } else if (fg) { ui->comp_SettingsSimulator->setSimulator(CSimulatorInfo(CSimulatorInfo::FG)); } else if (msfs) { ui->comp_SettingsSimulator->setSimulator(CSimulatorInfo(CSimulatorInfo::MSFS)); } + else if (msfs2024) { ui->comp_SettingsSimulator->setSimulator(CSimulatorInfo(CSimulatorInfo::MSFS2024)); } } QStringList CConfigSimulatorComponent::selectedSimsToPluginIds() @@ -102,6 +108,7 @@ namespace swift::gui::components if (ui->cb_XP->isChecked()) { ids << CSimulatorPluginInfo::xplanePluginIdentifier(); } if (ui->cb_FG->isChecked()) { ids << CSimulatorPluginInfo::fgPluginIdentifier(); } if (ui->cb_MSFS->isChecked()) { ids << CSimulatorPluginInfo::msfsPluginIdentifier(); } + if (ui->cb_MSFS2024->isChecked()) { ids << CSimulatorPluginInfo::msfs2024PluginIdentifier(); } return ids; } diff --git a/src/gui/components/configsimulatorcomponent.ui b/src/gui/components/configsimulatorcomponent.ui index 5d91c1b22..bbdc0879b 100644 --- a/src/gui/components/configsimulatorcomponent.ui +++ b/src/gui/components/configsimulatorcomponent.ui @@ -92,6 +92,13 @@ + + + + MSFS2024 (64-bit) + + + diff --git a/src/gui/components/dbownmodelscomponent.cpp b/src/gui/components/dbownmodelscomponent.cpp index 0aa5bdc36..ed9faac0f 100644 --- a/src/gui/components/dbownmodelscomponent.cpp +++ b/src/gui/components/dbownmodelscomponent.cpp @@ -393,6 +393,19 @@ namespace swift::gui::components } menuActions.addAction(m_loadActions[5], CMenuAction::pathSimulator()); } + if (sims.isMSFS2024()) + { + if (!m_loadActions[6]) + { + m_loadActions[6] = new QAction(CIcons::appModels16(), "MSFS2024 models", this); + connect(m_loadActions[6], &QAction::triggered, ownModelsComp, [ownModelsComp](bool checked) { + if (!ownModelsComp) { return; } + Q_UNUSED(checked) + ownModelsComp->setSimulator(CSimulatorInfo::msfs2024(), true); + }); + } + menuActions.addAction(m_loadActions[6], CMenuAction::pathSimulator()); + } // with models loaded I allow a refresh reload // I need those models because I want to merge with DB data in the loader @@ -400,8 +413,9 @@ namespace swift::gui::components { if (m_reloadActions.isEmpty()) { - m_reloadActions = QList({ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr }); + m_reloadActions = + QList({ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, + nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }); } menuActions.addMenu(CIcons::refresh16(), "Force model reload", CMenuAction::pathSimulatorModelsReload()); @@ -571,6 +585,33 @@ namespace swift::gui::components menuActions.addAction(m_reloadActions[10], CMenuAction::pathSimulatorModelsReload()); menuActions.addAction(m_reloadActions[11], CMenuAction::pathSimulatorModelsReload()); } + if (sims.isMSFS2024()) + { + if (!m_reloadActions[12]) + { + m_reloadActions[12] = new QAction(CIcons::appModels16(), "MSFS2024 models", this); + connect(m_reloadActions[12], &QAction::triggered, ownModelsComp, [ownModelsComp](bool checked) { + if (!ownModelsComp) { return; } + Q_UNUSED(checked) + ownModelsComp->requestSimulatorModels(CSimulatorInfo::msfs2024(), + IAircraftModelLoader::InBackgroundNoCache); + }); + m_reloadActions[13] = new QAction(CIcons::appModels16(), "MSFS2024 models from directoy", this); + connect(m_reloadActions[13], &QAction::triggered, ownModelsComp, [ownModelsComp](bool checked) { + if (!ownModelsComp) { return; } + Q_UNUSED(checked) + const CSimulatorInfo sim(CSimulatorInfo::MSFS2024); + const QString dir = ownModelsComp->directorySelector(sim); + if (!dir.isEmpty()) + { + ownModelsComp->requestSimulatorModels(sim, IAircraftModelLoader::InBackgroundNoCache, + QStringList(dir)); + } + }); + } + menuActions.addAction(m_reloadActions[12], CMenuAction::pathSimulatorModelsReload()); + menuActions.addAction(m_reloadActions[13], CMenuAction::pathSimulatorModelsReload()); + } } else { @@ -582,7 +623,8 @@ namespace swift::gui::components if (m_clearCacheActions.isEmpty()) { - m_clearCacheActions = QList({ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }); + m_clearCacheActions = + QList({ nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr }); } menuActions.addMenu(CIcons::delete16(), "Clear model caches", CMenuAction::pathSimulatorModelsClearCache()); if (sims.isFSX()) @@ -590,7 +632,7 @@ namespace swift::gui::components if (!m_clearCacheActions[0]) { m_clearCacheActions[0] = new QAction(CIcons::appModels16(), "Clear FSX cache", this); - connect(m_loadActions[0], &QAction::triggered, ownModelsComp, [ownModelsComp](bool checked) { + connect(m_clearCacheActions[0], &QAction::triggered, ownModelsComp, [ownModelsComp](bool checked) { if (!ownModelsComp) { return; } Q_UNUSED(checked) ownModelsComp->clearSimulatorCache(CSimulatorInfo::fsx()); @@ -663,6 +705,19 @@ namespace swift::gui::components } menuActions.addAction(m_clearCacheActions[5], CMenuAction::pathSimulatorModelsClearCache()); } + if (sims.isMSFS2024()) + { + if (!m_clearCacheActions[6]) + { + m_clearCacheActions[6] = new QAction(CIcons::appModels16(), "Clear MSFS2024 cache", this); + connect(m_clearCacheActions[6], &QAction::triggered, ownModelsComp, [ownModelsComp](bool checked) { + if (!ownModelsComp) { return; } + Q_UNUSED(checked) + ownModelsComp->clearSimulatorCache(CSimulatorInfo::msfs2024()); + }); + } + menuActions.addAction(m_clearCacheActions[6], CMenuAction::pathSimulatorModelsClearCache()); + } if (sims.isXPlane() && CBuildConfig::isRunningOnWindowsNtPlatform() && CBuildConfig::buildWordSize() == 64) { diff --git a/src/gui/components/dbownmodelsetcomponent.cpp b/src/gui/components/dbownmodelsetcomponent.cpp index d34ef4509..39fe3a1c9 100644 --- a/src/gui/components/dbownmodelsetcomponent.cpp +++ b/src/gui/components/dbownmodelsetcomponent.cpp @@ -604,6 +604,22 @@ namespace swift::gui::components }); m_setNewActions.append(a); } + if (sims.isMSFS2024()) + { + QAction *a = new QAction(CIcons::appModels16(), "MSFS2024 models", this); + connect(a, &QAction::triggered, ownModelSetComp, [ownModelSetComp](bool checked) { + Q_UNUSED(checked) + ownModelSetComp->setSimulator(CSimulatorInfo(CSimulatorInfo::MSFS2024)); + }); + m_setActions.append(a); + + a = new QAction(CIcons::appModels16(), "New set MSFS2024 models", this); + connect(a, &QAction::triggered, ownModelSetComp, [ownModelSetComp](bool checked) { + Q_UNUSED(checked) + ownModelSetComp->setModelSet(CAircraftModelList(), CSimulatorInfo(CSimulatorInfo::MSFS2024)); + }); + m_setNewActions.append(a); + } QAction *a = new QAction(CIcons::appDistributors16(), "Apply distributor preferences", this); connect(a, &QAction::triggered, ownModelSetComp, diff --git a/src/gui/components/simulatorselector.cpp b/src/gui/components/simulatorselector.cpp index d241468c2..5377ed2ba 100644 --- a/src/gui/components/simulatorselector.cpp +++ b/src/gui/components/simulatorselector.cpp @@ -38,6 +38,7 @@ namespace swift::gui::components connect(ui->rb_FG, &QRadioButton::toggled, this, &CSimulatorSelector::radioButtonChanged); connect(ui->rb_XPlane, &QRadioButton::toggled, this, &CSimulatorSelector::radioButtonChanged); connect(ui->rb_MSFS, &QRadioButton::toggled, this, &CSimulatorSelector::radioButtonChanged); + connect(ui->rb_MSFS2024, &QRadioButton::toggled, this, &CSimulatorSelector::radioButtonChanged); connect(ui->cb_FS9, &QRadioButton::toggled, this, &CSimulatorSelector::checkBoxChanged); connect(ui->cb_FSX, &QRadioButton::toggled, this, &CSimulatorSelector::checkBoxChanged); @@ -45,6 +46,7 @@ namespace swift::gui::components connect(ui->cb_FG, &QRadioButton::toggled, this, &CSimulatorSelector::checkBoxChanged); connect(ui->cb_XPlane, &QRadioButton::toggled, this, &CSimulatorSelector::checkBoxChanged); connect(ui->cb_MSFS, &QRadioButton::toggled, this, &CSimulatorSelector::checkBoxChanged); + connect(ui->cb_MSFS2024, &QRadioButton::toggled, this, &CSimulatorSelector::checkBoxChanged); connect(ui->cb_Simulators, &QComboBox::currentTextChanged, this, &CSimulatorSelector::comboBoxChanged); } @@ -79,10 +81,12 @@ namespace swift::gui::components default: case CheckBoxes: return CSimulatorInfo(ui->cb_FSX->isChecked(), ui->cb_FS9->isChecked(), ui->cb_XPlane->isChecked(), - ui->cb_P3D->isChecked(), ui->cb_FG->isChecked(), ui->cb_MSFS->isChecked()); + ui->cb_P3D->isChecked(), ui->cb_FG->isChecked(), ui->cb_MSFS->isChecked(), + ui->cb_MSFS2024->isChecked()); case RadioButtons: return CSimulatorInfo(ui->rb_FSX->isChecked(), ui->rb_FS9->isChecked(), ui->rb_XPlane->isChecked(), - ui->rb_P3D->isChecked(), ui->rb_FG->isChecked(), ui->rb_MSFS->isChecked()); + ui->rb_P3D->isChecked(), ui->rb_FG->isChecked(), ui->rb_MSFS->isChecked(), + ui->rb_MSFS2024->isChecked()); case ComboBox: return CSimulatorInfo(ui->cb_Simulators->currentText()); } } @@ -99,6 +103,7 @@ namespace swift::gui::components ui->cb_P3D->setChecked(simulator.isP3D()); ui->cb_FG->setChecked(simulator.isFG()); ui->cb_MSFS->setChecked(simulator.isMSFS()); + ui->cb_MSFS2024->setChecked(simulator.isMSFS2024()); // Combo ui->cb_Simulators->setCurrentText(simulator.toQString(true)); @@ -134,6 +139,11 @@ namespace swift::gui::components ui->rb_MSFS->setChecked(simulator.isMSFS()); return; } + if (simulator.isMSFS2024()) + { + ui->rb_MSFS2024->setChecked(simulator.isMSFS2024()); + return; + } } void CSimulatorSelector::setToLastSelection() @@ -211,6 +221,7 @@ namespace swift::gui::components ui->cb_P3D->setChecked(true); ui->cb_FG->setChecked(true); ui->cb_MSFS->setChecked(true); + ui->cb_MSFS2024->setChecked(true); // radio ui->rb_P3D->setChecked(true); @@ -225,6 +236,7 @@ namespace swift::gui::components ui->cb_P3D->setChecked(false); ui->cb_FG->setChecked(false); ui->cb_MSFS->setChecked(false); + ui->cb_MSFS2024->setChecked(false); } bool CSimulatorSelector::isUnselected() const @@ -235,11 +247,13 @@ namespace swift::gui::components default: case CheckBoxes: c = ui->cb_FSX->isChecked() || ui->cb_FS9->isChecked() || ui->cb_XPlane->isChecked() || - ui->cb_P3D->isChecked() || ui->cb_FG->isChecked() || ui->cb_MSFS->isChecked(); + ui->cb_P3D->isChecked() || ui->cb_FG->isChecked() || ui->cb_MSFS->isChecked() || + ui->cb_MSFS2024->isChecked(); break; case RadioButtons: c = ui->rb_FSX->isChecked() || ui->rb_FS9->isChecked() || ui->rb_XPlane->isChecked() || - ui->rb_P3D->isChecked() || ui->rb_FG->isChecked() || ui->rb_MSFS->isChecked(); + ui->rb_P3D->isChecked() || ui->rb_FG->isChecked() || ui->rb_MSFS->isChecked() || + ui->rb_MSFS2024->isChecked(); break; case ComboBox: const int i = ui->cb_Simulators->currentIndex(); @@ -257,7 +271,8 @@ namespace swift::gui::components default: case CheckBoxes: c = ui->cb_FSX->isChecked() && ui->cb_FS9->isChecked() && ui->cb_XPlane->isChecked() && - ui->cb_P3D->isChecked() && ui->cb_FG->isChecked() && ui->cb_MSFS->isChecked(); + ui->cb_P3D->isChecked() && ui->cb_FG->isChecked() && ui->cb_MSFS->isChecked() && + ui->cb_MSFS2024->isChecked(); break; case RadioButtons: // actually this should never be true @@ -304,6 +319,7 @@ namespace swift::gui::components ui->rb_P3D->setEnabled(!readOnly); ui->rb_FG->setEnabled(!readOnly); ui->rb_MSFS->setEnabled(!readOnly); + ui->rb_MSFS2024->setEnabled(!readOnly); ui->cb_Simulators->setEnabled(!readOnly); @@ -397,5 +413,6 @@ namespace swift::gui::components ui->cb_Simulators->insertItem(cbi++, CSimulatorInfo::xplane().toQString()); ui->cb_Simulators->insertItem(cbi++, CSimulatorInfo::fg().toQString()); ui->cb_Simulators->insertItem(cbi++, CSimulatorInfo::msfs().toQString()); + ui->cb_Simulators->insertItem(cbi++, CSimulatorInfo::msfs2024().toQString()); } } // namespace swift::gui::components diff --git a/src/gui/components/simulatorselector.ui b/src/gui/components/simulatorselector.ui index b309b86de..0879059bc 100644 --- a/src/gui/components/simulatorselector.ui +++ b/src/gui/components/simulatorselector.ui @@ -95,6 +95,13 @@ + + + + MSFS2024 + + + @@ -173,6 +180,13 @@ + + + + MSFS2024 + + + diff --git a/src/misc/simulation/aircraftmodel.cpp b/src/misc/simulation/aircraftmodel.cpp index 46081cf92..374eacd9b 100644 --- a/src/misc/simulation/aircraftmodel.cpp +++ b/src/misc/simulation/aircraftmodel.cpp @@ -106,6 +106,8 @@ namespace swift::misc::simulation obj.insert("simfs9", QJsonValue(flag)); flag = CDatastoreUtility::boolToDbYN(sim.isMSFS()); obj.insert("simmsfs", QJsonValue(flag)); + flag = CDatastoreUtility::boolToDbYN(sim.isMSFS2024()); + obj.insert("simmsfs2024", QJsonValue(flag)); flag = CDatastoreUtility::boolToDbYN(sim.isXPlane()); obj.insert("simxplane", QJsonValue(flag)); flag = CDatastoreUtility::boolToDbYN(sim.isFG()); diff --git a/src/misc/simulation/aircraftmodelloaderprovider.cpp b/src/misc/simulation/aircraftmodelloaderprovider.cpp index 13e686e3c..f81c7e196 100644 --- a/src/misc/simulation/aircraftmodelloaderprovider.cpp +++ b/src/misc/simulation/aircraftmodelloaderprovider.cpp @@ -69,6 +69,11 @@ namespace swift::misc::simulation if (!m_loaderMsfs) { m_loaderMsfs = this->initLoader(CSimulatorInfo::msfs()); } return m_loaderMsfs; } + case CSimulatorInfo::MSFS2024: + { + if (!m_loaderMsfs2024) { m_loaderMsfs2024 = this->initLoader(CSimulatorInfo::msfs2024()); } + return m_loaderMsfs2024; + } default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } return nullptr; diff --git a/src/misc/simulation/aircraftmodelloaderprovider.h b/src/misc/simulation/aircraftmodelloaderprovider.h index 337aa7480..4e8fdfd21 100644 --- a/src/misc/simulation/aircraftmodelloaderprovider.h +++ b/src/misc/simulation/aircraftmodelloaderprovider.h @@ -58,6 +58,7 @@ namespace swift::misc::simulation IAircraftModelLoader *m_loaderFS9 = nullptr; IAircraftModelLoader *m_loaderFG = nullptr; IAircraftModelLoader *m_loaderMsfs = nullptr; + IAircraftModelLoader *m_loaderMsfs2024 = nullptr; //! Init the loader IAircraftModelLoader *initLoader(const CSimulatorInfo &simulator); diff --git a/src/misc/simulation/aircraftmodelutils.cpp b/src/misc/simulation/aircraftmodelutils.cpp index b2bb01eb2..7682dc04e 100644 --- a/src/misc/simulation/aircraftmodelutils.cpp +++ b/src/misc/simulation/aircraftmodelutils.cpp @@ -193,6 +193,12 @@ namespace swift::misc::simulation models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir); specificTests.push_back(specificTests2); } + else if (simulator.isMSFS2024()) + { + const CStatusMessageList specificTests2 = fscommon::CFsCommonUtil::validateMSFS2024SimObjectsPath( + models, validModels, invalidModels, ignoreEmpty, stopAtFailedFiles, wasStopped, simulatorDir); + specificTests.push_back(specificTests2); + } } else if (simulator.isXPlane() || models.isLikelyXPlaneModelList()) { diff --git a/src/misc/simulation/autopublishdata.cpp b/src/misc/simulation/autopublishdata.cpp index b9d0e9d7d..5b8b4d697 100644 --- a/src/misc/simulation/autopublishdata.cpp +++ b/src/misc/simulation/autopublishdata.cpp @@ -221,6 +221,7 @@ namespace swift::misc::simulation this->insert("testModelString5", CSimulatorInfo::fsx()); this->insert("testModelString6", CSimulatorInfo::fsx()); this->insert("testModelString7", CSimulatorInfo::msfs()); + this->insert("testModelString8", CSimulatorInfo::msfs2024()); } const QString &CAutoPublishData::fileBaseName() diff --git a/src/misc/simulation/data/modelcaches.cpp b/src/misc/simulation/data/modelcaches.cpp index 1a83ac4a3..96946fe4f 100644 --- a/src/misc/simulation/data/modelcaches.cpp +++ b/src/misc/simulation/data/modelcaches.cpp @@ -42,11 +42,12 @@ namespace swift::misc::simulation::data QString IMultiSimulatorModelCaches::getInfoStringFsFamily() const { - static const QString is("FSX: %1, P3D: %2, FS9: %3, MSFS: %4"); + static const QString is("FSX: %1, P3D: %2, FS9: %3, MSFS: %4, MSFS2024: %5"); return is.arg(this->getCachedModelsCount(CSimulatorInfo::FSX)) .arg(this->getCachedModelsCount(CSimulatorInfo::P3D)) .arg(this->getCachedModelsCount(CSimulatorInfo::FS9)) - .arg(this->getCachedModelsCount(CSimulatorInfo::MSFS)); + .arg(this->getCachedModelsCount(CSimulatorInfo::MSFS)) + .arg(this->getCachedModelsCount(CSimulatorInfo::MSFS2024)); } QString IMultiSimulatorModelCaches::getCacheCountAndTimestamp(const CSimulatorInfo &simulator) const @@ -72,6 +73,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: m_syncXPlane = synchronized; break; case CSimulatorInfo::FG: m_syncFG = synchronized; break; case CSimulatorInfo::MSFS: m_syncMsfs = synchronized; break; + case CSimulatorInfo::MSFS2024: m_syncMsfs2024 = synchronized; break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); break; } } @@ -102,6 +104,10 @@ namespace swift::misc::simulation::data if (this->hasOtherVersionFile(info, CSimulatorInfo::fg())) { sim.addSimulator(CSimulatorInfo::fg()); } if (this->hasOtherVersionFile(info, CSimulatorInfo::xplane())) { sim.addSimulator(CSimulatorInfo::xplane()); } if (this->hasOtherVersionFile(info, CSimulatorInfo::msfs())) { sim.addSimulator(CSimulatorInfo::msfs()); } + if (this->hasOtherVersionFile(info, CSimulatorInfo::msfs2024())) + { + sim.addSimulator(CSimulatorInfo::msfs2024()); + } return sim; } @@ -114,6 +120,7 @@ namespace swift::misc::simulation::data this->getFilename(CSimulatorInfo::XPLANE), this->getFilename(CSimulatorInfo::FG), this->getFilename(CSimulatorInfo::MSFS), + this->getFilename(CSimulatorInfo::MSFS2024), }); } @@ -207,6 +214,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.get(); case CSimulatorInfo::FG: return m_modelCacheFG.get(); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.get(); + case CSimulatorInfo::MSFS2024: return m_modelCacheMsfs2024.get(); default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); return CAircraftModelList(); } } @@ -226,6 +234,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: msg = m_modelCacheXP.set(setModels); break; case CSimulatorInfo::FG: msg = m_modelCacheFG.set(setModels); break; case CSimulatorInfo::MSFS: msg = m_modelCacheMsfs.set(setModels); break; + case CSimulatorInfo::MSFS2024: msg = m_modelCacheMsfs2024.set(setModels); break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); return CStatusMessage(); } this->emitCacheChanged(simulator); // set @@ -249,6 +258,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_syncXPlane; case CSimulatorInfo::FG: return m_syncFG; case CSimulatorInfo::MSFS: return m_syncMsfs; + case CSimulatorInfo::MSFS2024: return m_syncMsfs2024; default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); break; } return false; @@ -281,6 +291,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.getAvailableTimestamp(); case CSimulatorInfo::FG: return m_modelCacheFG.getAvailableTimestamp(); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.getAvailableTimestamp(); + case CSimulatorInfo::MSFS2024: return m_modelCacheMsfs2024.getAvailableTimestamp(); default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); return QDateTime(); } } @@ -300,6 +311,8 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.set(m_modelCacheXP.get(), ts.toMSecsSinceEpoch()); case CSimulatorInfo::FG: return m_modelCacheFG.set(m_modelCacheFG.get(), ts.toMSecsSinceEpoch()); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.set(m_modelCacheMsfs.get(), ts.toMSecsSinceEpoch()); + case CSimulatorInfo::MSFS2024: + return m_modelCacheMsfs2024.set(m_modelCacheMsfs2024.get(), ts.toMSecsSinceEpoch()); default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } return CStatusMessage(); @@ -320,6 +333,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.getFilename(); case CSimulatorInfo::FG: return m_modelCacheFG.getFilename(); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.getFilename(); + case CSimulatorInfo::MSFS2024: return m_modelCacheMsfs2024.getFilename(); default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); break; } return {}; @@ -336,6 +350,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.isSaved(); case CSimulatorInfo::FG: return m_modelCacheFG.isSaved(); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.isSaved(); + case CSimulatorInfo::MSFS2024: return m_modelCacheMsfs2024.isSaved(); default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); break; } return false; @@ -354,6 +369,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: m_modelCacheXP.synchronize(); break; case CSimulatorInfo::FG: m_modelCacheFG.synchronize(); break; case CSimulatorInfo::MSFS: m_modelCacheMsfs.synchronize(); break; + case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.synchronize(); break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); break; } this->markCacheAsAlreadySynchronized(simulator, true); @@ -373,6 +389,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: m_modelCacheXP.admit(); break; case CSimulatorInfo::FG: m_modelCacheFG.admit(); break; case CSimulatorInfo::MSFS: m_modelCacheMsfs.admit(); break; + case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.admit(); break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); break; } return true; @@ -414,6 +431,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.get(); case CSimulatorInfo::FG: return m_modelCacheFG.get(); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.get(); + case CSimulatorInfo::MSFS2024: return m_modelCacheMsfs2024.get(); default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); return CAircraftModelList(); } } @@ -444,6 +462,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: msg = m_modelCacheXP.set(orderedModels); break; case CSimulatorInfo::FG: msg = m_modelCacheFG.set(orderedModels); break; case CSimulatorInfo::MSFS: msg = m_modelCacheMsfs.set(orderedModels); break; + case CSimulatorInfo::MSFS2024: msg = m_modelCacheMsfs2024.set(orderedModels); break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "wrong simulator"); return CStatusMessage(); } this->emitCacheChanged(simulator); // set @@ -461,6 +480,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.getAvailableTimestamp(); case CSimulatorInfo::FG: return m_modelCacheFG.getAvailableTimestamp(); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.getAvailableTimestamp(); + case CSimulatorInfo::MSFS2024: return m_modelCacheMsfs2024.getAvailableTimestamp(); default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); return QDateTime(); } } @@ -480,6 +500,8 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.set(m_modelCacheXP.get(), ts.toMSecsSinceEpoch()); case CSimulatorInfo::FG: return m_modelCacheFG.set(m_modelCacheFG.get(), ts.toMSecsSinceEpoch()); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.set(m_modelCacheMsfs.get(), ts.toMSecsSinceEpoch()); + case CSimulatorInfo::MSFS2024: + return m_modelCacheMsfs2024.set(m_modelCacheMsfs2024.get(), ts.toMSecsSinceEpoch()); default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } return CStatusMessage(); @@ -500,6 +522,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.getFilename(); case CSimulatorInfo::FG: return m_modelCacheFG.getFilename(); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.getFilename(); + case CSimulatorInfo::MSFS2024: return m_modelCacheMsfs2024.getFilename(); default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } return {}; @@ -516,6 +539,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: return m_modelCacheXP.isSaved(); case CSimulatorInfo::FG: return m_modelCacheFG.isSaved(); case CSimulatorInfo::MSFS: return m_modelCacheMsfs.isSaved(); + case CSimulatorInfo::MSFS2024: return m_modelCacheMsfs2024.isSaved(); default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } return false; @@ -534,6 +558,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: m_modelCacheXP.synchronize(); break; case CSimulatorInfo::FG: m_modelCacheFG.synchronize(); break; case CSimulatorInfo::MSFS: m_modelCacheMsfs.synchronize(); break; + case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.synchronize(); break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } this->markCacheAsAlreadySynchronized(simulator, true); @@ -553,6 +578,7 @@ namespace swift::misc::simulation::data case CSimulatorInfo::XPLANE: m_modelCacheXP.admit(); break; case CSimulatorInfo::FG: m_modelCacheFG.admit(); break; case CSimulatorInfo::MSFS: m_modelCacheMsfs.admit(); break; + case CSimulatorInfo::MSFS2024: m_modelCacheMsfs2024.admit(); break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } return true; diff --git a/src/misc/simulation/data/modelcaches.h b/src/misc/simulation/data/modelcaches.h index 9d287cf44..7927cc340 100644 --- a/src/misc/simulation/data/modelcaches.h +++ b/src/misc/simulation/data/modelcaches.h @@ -74,6 +74,13 @@ namespace swift::misc::simulation::data static const char *key() { return "modelcachemsfs"; } }; + //! MSFS2024 + struct TModelCacheMsfs2024 : public TModelCache + { + //! Key in data cache + static const char *key() { return "modelcachemsfs2024"; } + }; + //! Last selection struct TModelCacheLastSelection : public TDataTrait { @@ -133,6 +140,13 @@ namespace swift::misc::simulation::data static const char *key() { return "modelsetmsfs"; } }; + //! MSFS2024 + struct TModelSetCacheMsfs2024 : public TModelCache + { + //! Key in data cache + static const char *key() { return "modelsetmsfs2024"; } + }; + //! Last selection struct TSimulatorLastSelection : public TDataTrait { @@ -296,6 +310,7 @@ namespace swift::misc::simulation::data void changedXP() { this->emitCacheChanged(CSimulatorInfo::xplane()); } void changedFG() { this->emitCacheChanged(CSimulatorInfo::fg()); } void changedMsfs() { this->emitCacheChanged(CSimulatorInfo::msfs()); } + void changedMsfs2024() { this->emitCacheChanged(CSimulatorInfo::msfs2024()); } //! @} //! Is the cache already synchronized? @@ -314,6 +329,7 @@ namespace swift::misc::simulation::data std::atomic_bool m_syncFG { false }; std::atomic_bool m_syncXPlane { false }; std::atomic_bool m_syncMsfs { false }; + std::atomic_bool m_syncMsfs2024 { false }; //! @} }; @@ -350,6 +366,7 @@ namespace swift::misc::simulation::data CData m_modelCacheXP { this, &CModelCaches::changedXP }; //!< XP cache CData m_modelCacheFG { this, &CModelCaches::changedFG }; //!< XP cache CData m_modelCacheMsfs { this, &CModelCaches::changedMsfs }; //!< MSFS cache + CData m_modelCacheMsfs2024 { this, &CModelCaches::changedMsfs2024 }; //!< MSFS2024 cache //! Non virtual version (can be used in ctor) void synchronizeCacheImpl(const CSimulatorInfo &simulator); @@ -392,6 +409,8 @@ namespace swift::misc::simulation::data CData m_modelCacheXP { this, &CModelSetCaches::changedXP }; //!< XP cache CData m_modelCacheFG { this, &CModelSetCaches::changedFG }; //!< FG cache CData m_modelCacheMsfs { this, &CModelSetCaches::changedMsfs }; //!< MSFS cache + CData m_modelCacheMsfs2024 { this, + &CModelSetCaches::changedMsfs2024 }; //!< MSFS2024 cache //! Non virtual version (can be used in ctor) void synchronizeCacheImpl(const CSimulatorInfo &simulator); diff --git a/src/misc/simulation/distributor.cpp b/src/misc/simulation/distributor.cpp index cfe024ecd..f60997b8e 100644 --- a/src/misc/simulation/distributor.cpp +++ b/src/misc/simulation/distributor.cpp @@ -229,7 +229,8 @@ namespace swift::misc::simulation const QSet &CDistributor::standardAllFsFamily() { - static const QSet fsFamily({ standardFS9(), standardFSX(), standardP3D(), standardMsfs() }); + static const QSet fsFamily( + { standardFS9(), standardFSX(), standardP3D(), standardMsfs(), standardMsfs2024() }); return fsFamily; } @@ -257,6 +258,12 @@ namespace swift::misc::simulation return k; } + const QString &CDistributor::standardMsfs2024() + { + static const QString k("MSFS2024"); + return k; + } + QString CDistributor::unifyKeyOrAlias(const QString &value) { return removeChars(value.trimmed().toUpper(), [](QChar c) { return !c.isLetterOrNumber(); }); diff --git a/src/misc/simulation/distributor.h b/src/misc/simulation/distributor.h index c20a8d234..e98e9821b 100644 --- a/src/misc/simulation/distributor.h +++ b/src/misc/simulation/distributor.h @@ -133,6 +133,7 @@ namespace swift::misc::simulation static const QString &xplaneBlueBell(); static const QString &xplaneXcsl(); static const QString &standardMsfs(); + static const QString &standardMsfs2024(); //! @} private: diff --git a/src/misc/simulation/distributorlistpreferences.cpp b/src/misc/simulation/distributorlistpreferences.cpp index 25f35e773..306fd8dc4 100644 --- a/src/misc/simulation/distributorlistpreferences.cpp +++ b/src/misc/simulation/distributorlistpreferences.cpp @@ -22,6 +22,7 @@ namespace swift::misc::simulation case CSimulatorInfo::FG: return m_distributorsFG; case CSimulatorInfo::XPLANE: return m_distributorsXPlane; case CSimulatorInfo::MSFS: return m_distributorsMsfs; + case CSimulatorInfo::MSFS2024: return m_distributorsMsfs2024; default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } @@ -50,6 +51,7 @@ namespace swift::misc::simulation case CSimulatorInfo::FG: m_distributorsFG = d; break; case CSimulatorInfo::XPLANE: m_distributorsXPlane = d; break; case CSimulatorInfo::MSFS: m_distributorsMsfs = d; break; + case CSimulatorInfo::MSFS2024: m_distributorsMsfs2024 = d; break; default: Q_ASSERT_X(false, Q_FUNC_INFO, "Wrong simulator"); break; } } diff --git a/src/misc/simulation/distributorlistpreferences.h b/src/misc/simulation/distributorlistpreferences.h index ed98e7fb9..4d2ccecc6 100644 --- a/src/misc/simulation/distributorlistpreferences.h +++ b/src/misc/simulation/distributorlistpreferences.h @@ -53,6 +53,7 @@ namespace swift::misc::simulation CDistributorList m_distributorsXPlane; CDistributorList m_distributorsFG; CDistributorList m_distributorsMsfs; + CDistributorList m_distributorsMsfs2024; CSimulatorInfo m_lastUpdatedSimulator; SWIFT_METACLASS( @@ -63,6 +64,7 @@ namespace swift::misc::simulation SWIFT_METAMEMBER(distributorsXPlane), SWIFT_METAMEMBER(distributorsFG), SWIFT_METAMEMBER(distributorsMsfs), + SWIFT_METAMEMBER(distributorsMsfs2024), SWIFT_METAMEMBER(lastUpdatedSimulator)); }; } // namespace swift::misc::simulation diff --git a/src/misc/simulation/fscommon/aircraftcfgparser.cpp b/src/misc/simulation/fscommon/aircraftcfgparser.cpp index 506a0d84e..4d7a416ab 100644 --- a/src/misc/simulation/fscommon/aircraftcfgparser.cpp +++ b/src/misc/simulation/fscommon/aircraftcfgparser.cpp @@ -153,8 +153,11 @@ namespace swift::misc::simulation::fscommon // set directory with name filters, get aircraft.cfg and sub directories static const QString NoNameFilter; QDir dir(directory, NoNameFilter, QDir::Name, QDir::Files | QDir::AllDirs | QDir::NoDotAndDotDot); - // for MSFS we only need aircraft.cfg - dir.setNameFilters(fileNameFilters(getSimulator().isMSFS())); + // TODO TZ: still have to figure out how msfs2024 handles this + // for MSFS2020 we only need aircraft.cfg + // MSFS2024 has aircraft.cfg only in communityfolder + // a solution for the aircraft from the marketplace may be prepared by ASOBO + dir.setNameFilters(fileNameFilters(getSimulator().isMSFS(), getSimulator().isMSFS2024())); if (!dir.exists()) { return CAircraftCfgEntriesList(); // can happen if there are shortcuts or linked dirs not available @@ -464,9 +467,10 @@ namespace swift::misc::simulation::fscommon return content; } - const QStringList &CAircraftCfgParser::fileNameFilters(bool isMSFS) + // TODO TZ: MSFS2024 currently has aircraft.cfg only in the community folder + const QStringList &CAircraftCfgParser::fileNameFilters(bool isMSFS, bool isMSFS2024) { - if (CBuildConfig::buildWordSize() == 32 || isMSFS) + if (CBuildConfig::buildWordSize() == 32 || isMSFS || isMSFS2024) { static const QStringList f({ "aircraft.cfg" }); return f; diff --git a/src/misc/simulation/fscommon/aircraftcfgparser.h b/src/misc/simulation/fscommon/aircraftcfgparser.h index 1af923bd4..4fdc9bff5 100644 --- a/src/misc/simulation/fscommon/aircraftcfgparser.h +++ b/src/misc/simulation/fscommon/aircraftcfgparser.h @@ -89,7 +89,7 @@ namespace swift::misc static QString getFixedIniLineContent(const QString &line); //! Files to be used - static const QStringList &fileNameFilters(bool isMSFS); + static const QStringList &fileNameFilters(bool isMSFS, bool isMSFS2024); //! Exclude the sub directories not to be parsed static bool isExcludedSubDirectory(const QString &excludeDirectory); diff --git a/src/misc/simulation/fscommon/fscommonutil.cpp b/src/misc/simulation/fscommon/fscommonutil.cpp index bd14ae5eb..e8c8d1e0d 100644 --- a/src/misc/simulation/fscommon/fscommonutil.cpp +++ b/src/misc/simulation/fscommon/fscommonutil.cpp @@ -230,6 +230,17 @@ namespace swift::misc::simulation::fscommon stopAtFailedFiles, stopped); } + CStatusMessageList CFsCommonUtil::validateMSFS2024SimObjectsPath( + const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, + bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &stopped, const QString &simulatorDir) + { + Q_UNUSED(simulatorDir) + const QStringList simObjectPaths = CFsDirectories::msfs2024SimObjectsDirPath(); + return CFsCommonUtil::validateSimObjectsPath(QSet(simObjectPaths.begin(), simObjectPaths.end()), + models, validModels, invalidModels, ignoreEmptyFileNames, + stopAtFailedFiles, stopped); + } + CStatusMessageList CFsCommonUtil::validateSimObjectsPath(const QSet &simObjectDirs, const CAircraftModelList &models, CAircraftModelList &validModels, CAircraftModelList &invalidModels, diff --git a/src/misc/simulation/fscommon/fscommonutil.h b/src/misc/simulation/fscommon/fscommonutil.h index 7cde5deb1..07bfa55fc 100644 --- a/src/misc/simulation/fscommon/fscommonutil.h +++ b/src/misc/simulation/fscommon/fscommonutil.h @@ -67,6 +67,15 @@ namespace swift::misc::simulation::fscommon bool ignoreEmptyFileNames, int stopAtFailedFiles, std::atomic_bool &wasStopped, const QString &simulatorDir); + //! Validate if known SimObjects path are used + //! \remark only for MSFS2024 + static CStatusMessageList validateMSFS2024SimObjectsPath(const CAircraftModelList &models, + CAircraftModelList &validModels, + CAircraftModelList &invalidModels, + bool ignoreEmptyFileNames, int stopAtFailedFiles, + std::atomic_bool &wasStopped, + const QString &simulatorDir); + private: //! Validate if known SimObjects path are used //! \remark only for P3D/FSX diff --git a/src/misc/simulation/fscommon/fsdirectories.cpp b/src/misc/simulation/fscommon/fsdirectories.cpp index 8346de509..dc92c8086 100644 --- a/src/misc/simulation/fscommon/fsdirectories.cpp +++ b/src/misc/simulation/fscommon/fsdirectories.cpp @@ -181,9 +181,70 @@ namespace swift::misc::simulation::fscommon if (!d.exists()) { continue; } return msfs2024Package; } + // then we look for steam-edition + for (QString path : locations) + { + // there seems to be no constant for the roaming directory, so we have to do some magic + // https://doc.qt.io/qt-6/qstandardpaths.html + path.replace("Local", "Roaming"); + const QString msfsPackage = CFileUtils::appendFilePaths(path, "Microsoft Flight Simulator 2024"); + const QString fileName = CFileUtils::appendFilePaths(msfsPackage, "UserCfg.opt"); + const QFileInfo fi(fileName); + if (!fi.exists()) { continue; } + return msfsPackage; + } return {}; } + const QString &CFsDirectories::msfs2024Dir() + { + static const QString dir(msfs2024DirImpl()); + return dir; + } + + QString msfs2024PackagesDirImpl() + { + QString userCfg = ""; + + QString msfs2024Directory(CFsDirectories::msfs2024Dir()); + // for Steam edition + if (msfs2024Directory.contains("Roaming", Qt::CaseInsensitive)) + { + userCfg = CFileUtils::appendFilePaths(msfs2024Directory, "UserCfg.opt"); + } + else + { + userCfg = CFileUtils::appendFilePaths(CFileUtils::appendFilePaths(msfs2024Directory, "LocalCache"), + "UserCfg.opt"); + } + + QFile file(userCfg); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { return {}; } + + QTextStream in(&file); + while (!in.atEnd()) + { + QString line = in.readLine(); + if (line.contains("InstalledPackagesPath")) + { + // change the split separator because of path names with multiple spaces in Steamedition + QStringList split = line.split("\""); + // we have 2 quotation marks in the line so 3 parts + if (split.size() != 3) { return {}; } + QString packagePath = split[1].remove("\""); + const QDir dir(packagePath); + if (dir.exists()) { return packagePath; } + } + } + return {}; + } + + const QString &CFsDirectories::msfs2024PackagesDir() + { + static const QString dir(msfs2024PackagesDirImpl()); + return dir; + } + QString fsxSimObjectsDirFromRegistryImpl() { const QString fsxPath = CFileUtils::normalizeFilePathToQtStandard(CFsDirectories::fsxDirFromRegistry()); @@ -211,6 +272,13 @@ namespace swift::misc::simulation::fscommon return CFileUtils::normalizeFilePathToQtStandard(msfsPackagesDirImpl()); } + QString msfs2024SimObjectsDirImpl() + { + QString dir(CFsDirectories::msfs2024Dir()); + if (dir.isEmpty()) { return {}; } + return CFileUtils::normalizeFilePathToQtStandard(msfs2024PackagesDirImpl()); + } + const QString &CFsDirectories::fsxSimObjectsDir() { static const QString dir(fsxSimObjectsDirImpl()); @@ -223,6 +291,11 @@ namespace swift::misc::simulation::fscommon return dir; } + const QString &CFsDirectories::msfs2024SimObjectsDir() + { + static const QString dir(msfs2024SimObjectsDirImpl()); + return dir; + } QString CFsDirectories::fsxSimObjectsDirFromSimDir(const QString &simDir) { if (simDir.isEmpty()) { return {}; } @@ -263,6 +336,16 @@ namespace swift::misc::simulation::fscommon return exclude; } + const QStringList &CFsDirectories::msfs2024SimObjectsExcludeDirectoryPatterns() + { + static const QStringList exclude { + "landingchallenge", + "tutorials", + + }; + return exclude; + } + QString p3dDirFromRegistryImpl() { QString p3dPath; @@ -365,6 +448,12 @@ namespace swift::misc::simulation::fscommon return Path; } + QStringList CFsDirectories::msfs2024SimObjectsDirPath(const QString &simObjectsDir) + { + Q_UNUSED(simObjectsDir); + static const QStringList Path { CFsDirectories::msfs2024SimObjectsDir() }; + return Path; + } QStringList CFsDirectories::p3dSimObjectsDirPlusAddOnXmlSimObjectsPaths(const QString &simObjectsDir, const QString &versionHint) { diff --git a/src/misc/simulation/fscommon/fsdirectories.h b/src/misc/simulation/fscommon/fsdirectories.h index c07b8f118..d2d307904 100644 --- a/src/misc/simulation/fscommon/fsdirectories.h +++ b/src/misc/simulation/fscommon/fsdirectories.h @@ -38,6 +38,9 @@ namespace swift::misc::simulation::fscommon //! MSFS's simobject dir, resolved from multiple sources static const QString &msfsSimObjectsDir(); + //! MSFS's simobject dir, resolved from multiple sources + static const QString &msfs2024SimObjectsDir(); + //! FSX aircraft dir, relative to simulator directory static QString fsxSimObjectsDirFromSimDir(const QString &simDir); @@ -47,12 +50,18 @@ namespace swift::misc::simulation::fscommon //! Exclude directories for simObjects static const QStringList &msfs20SimObjectsExcludeDirectoryPatterns(); + //! Exclude directories for simObjects + static const QStringList &msfs2024SimObjectsExcludeDirectoryPatterns(); + //! FSX's simObject dir and the add on dirs static QStringList fsxSimObjectsDirPlusAddOnXmlSimObjectsPaths(const QString &simObjectsDir = ""); //! MSFS's simObject dir and the add on dirs static QStringList msfsSimObjectsDirPath(const QString &simObjectsDir = ""); + //! MSFS2024's simObject dir and the add on dirs + static QStringList msfs2024SimObjectsDirPath(const QString &simObjectsDir = ""); + //! P3D's simObject dir and the add on dirs static QStringList p3dSimObjectsDirPlusAddOnXmlSimObjectsPaths(const QString &simObjectsDir, const QString &versionHint); @@ -84,6 +93,12 @@ namespace swift::misc::simulation::fscommon //! MSFS's packages dir static const QString &msfsPackagesDir(); + //! MSFS directory from different sources + static const QString &msfs2024Dir(); + + //! MSFS's packages dir + static const QString &msfs2024PackagesDir(); + //! FS9 directory obtained from registry static const QString &fs9DirFromRegistry(); @@ -126,19 +141,10 @@ namespace swift::misc::simulation::fscommon //! Get all the SimObjects paths from all config files static QSet allFsxSimObjectPaths(); - // TODO TZ - //! Get all the SimObjects paths from all config files - // static QSet allMsfsSimObjectPaths(); - //! Find the config files (fsx.cfg) // C:/Users/Joe Doe/AppData/Roaming/Microsoft/FSX/fsx.cfg static QStringList findFsxConfigFiles(); - // TODO TZ - //! Find the config files (fsx.cfg) - // C:/Users/Joe Doe/AppData/Roaming/Microsoft/FSX/fsx.cfg - // static QStringList findMsfsConfigFiles(); - //! Get all the SimObjects paths from fsx.cfg // SimObjectPaths.0=SimObjects\Airplanes static QSet fsxSimObjectsPaths(const QStringList &fsxFiles, bool checked); diff --git a/src/misc/simulation/settings/simulatorsettings.cpp b/src/misc/simulation/settings/simulatorsettings.cpp index 085ea6cc0..20d72b798 100644 --- a/src/misc/simulation/settings/simulatorsettings.cpp +++ b/src/misc/simulation/settings/simulatorsettings.cpp @@ -197,6 +197,7 @@ namespace swift::misc::simulation::settings case CSimulatorInfo::FSX: return m_simSettingsFsx.get(); case CSimulatorInfo::P3D: return m_simSettingsP3D.get(); case CSimulatorInfo::MSFS: return m_simSettingsMsfs.get(); + case CSimulatorInfo::MSFS2024: return m_simSettingsMsfs2024.get(); case CSimulatorInfo::XPLANE: return m_simSettingsXP.get(); default: Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); break; @@ -220,6 +221,7 @@ namespace swift::misc::simulation::settings case CSimulatorInfo::FSX: return m_simSettingsFsx.set(settings); case CSimulatorInfo::P3D: return m_simSettingsP3D.set(settings); case CSimulatorInfo::MSFS: return m_simSettingsMsfs.set(settings); + case CSimulatorInfo::MSFS2024: return m_simSettingsMsfs2024.set(settings); case CSimulatorInfo::XPLANE: return m_simSettingsXP.set(settings); default: Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); break; } @@ -257,6 +259,7 @@ namespace swift::misc::simulation::settings case CSimulatorInfo::FSX: break; case CSimulatorInfo::P3D: break; case CSimulatorInfo::MSFS: break; + case CSimulatorInfo::MSFS2024: break; case CSimulatorInfo::XPLANE: { if (settings.hasModelDirectories()) @@ -282,6 +285,7 @@ namespace swift::misc::simulation::settings case CSimulatorInfo::FSX: return m_simSettingsFsx.setAndSave(settings); case CSimulatorInfo::P3D: return m_simSettingsP3D.setAndSave(settings); case CSimulatorInfo::MSFS: return m_simSettingsMsfs.setAndSave(settings); + case CSimulatorInfo::MSFS2024: return m_simSettingsMsfs2024.setAndSave(settings); case CSimulatorInfo::XPLANE: return m_simSettingsXP.setAndSave(settings); default: Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); break; } @@ -304,6 +308,7 @@ namespace swift::misc::simulation::settings case CSimulatorInfo::FSX: return m_simSettingsFsx.save(); case CSimulatorInfo::P3D: return m_simSettingsP3D.save(); case CSimulatorInfo::MSFS: return m_simSettingsMsfs.save(); + case CSimulatorInfo::MSFS2024: return m_simSettingsMsfs2024.save(); case CSimulatorInfo::XPLANE: return m_simSettingsXP.save(); default: Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); break; } @@ -374,6 +379,8 @@ namespace swift::misc::simulation::settings void CMultiSimulatorSettings::onMsfsSettingsChanged() { this->emitSettingsChanged(CSimulatorInfo::msfs()); } + void CMultiSimulatorSettings::onMsfs2024SettingsChanged() { this->emitSettingsChanged(CSimulatorInfo::msfs2024()); } + void CMultiSimulatorSettings::onXPSettingsChanged() { this->emitSettingsChanged(CSimulatorInfo::xplane()); } void CMultiSimulatorSettings::onFGSettingsChanged() { this->emitSettingsChanged(CSimulatorInfo::fg()); } @@ -584,6 +591,8 @@ namespace swift::misc::simulation::settings } break; case CSimulatorInfo::XPLANE: dirs = QStringList({ CXPlaneUtil::modelDirectoriesFromSimDir(s) }); break; + case CSimulatorInfo::MSFS: dirs = QStringList({ CFsDirectories::msfsSimObjectsDir() }); break; + case CSimulatorInfo::MSFS2024: dirs = QStringList({ CFsDirectories::msfs2024SimObjectsDir() }); break; default: break; } @@ -678,11 +687,19 @@ namespace swift::misc::simulation::settings } case CSimulatorInfo::MSFS: { - static const QString msfs = CFsDirectories::msfsPackagesDir(); + static const QString msfs = CFileUtils::normalizeFilePathToQtStandard(CFsDirectories::msfsPackagesDir()); if (msfs.isEmpty()) { return e; } static const QStringList md { msfs }; return md; } + case CSimulatorInfo::MSFS2024: + { + static const QString msfs2024 = + CFileUtils::normalizeFilePathToQtStandard(CFsDirectories::msfs2024PackagesDir()); + if (msfs2024.isEmpty()) { return e; } + static const QStringList md { msfs2024 }; + return md; + } case CSimulatorInfo::XPLANE: { return CXPlaneUtil::xplaneModelDirectories(); @@ -703,6 +720,7 @@ namespace swift::misc::simulation::settings case CSimulatorInfo::FSX: return CFsDirectories::fsxDir(); case CSimulatorInfo::P3D: return CFsDirectories::p3dDir(); case CSimulatorInfo::MSFS: return CFsDirectories::msfsDir(); + case CSimulatorInfo::MSFS2024: return CFsDirectories::msfs2024Dir(); case CSimulatorInfo::XPLANE: return CXPlaneUtil::xplaneRootDir(); default: Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); break; } @@ -722,6 +740,7 @@ namespace swift::misc::simulation::settings case CSimulatorInfo::P3D: return CFsDirectories::p3dSimObjectsExcludeDirectoryPatterns(); case CSimulatorInfo::XPLANE: return CXPlaneUtil::xplaneModelExcludeDirectoryPatterns(); case CSimulatorInfo::MSFS: return CFsDirectories::msfs20SimObjectsExcludeDirectoryPatterns(); + case CSimulatorInfo::MSFS2024: return CFsDirectories::msfs2024SimObjectsExcludeDirectoryPatterns(); default: Q_ASSERT_X(simulator.isSingleSimulator(), Q_FUNC_INFO, "No single simulator"); break; } return empty; diff --git a/src/misc/simulation/settings/simulatorsettings.h b/src/misc/simulation/settings/simulatorsettings.h index 58babda54..c683177b3 100644 --- a/src/misc/simulation/settings/simulatorsettings.h +++ b/src/misc/simulation/settings/simulatorsettings.h @@ -354,6 +354,20 @@ namespace swift::misc::simulation::settings } }; + //! Trait for simulator settings + struct TSimulatorMsfs2024 : public TSettingTrait + { + //! \copydoc swift::misc::TSettingTrait::key + static const char *key() { return "settingssimulatormsfs2024"; } + + //! \copydoc swift::misc::TSettingTrait::humanReadable + static const QString &humanReadable() + { + static const QString name("MSFS2024 settings"); + return name; + } + }; + //! Selected P3D version (64bit) struct TP3DVersion : public TSettingTrait { @@ -545,6 +559,9 @@ namespace swift::misc::simulation::settings CSetting m_simSettingsMsfs { this, &CMultiSimulatorSettings::onMsfsSettingsChanged }; //!< MSFS settings + CSetting m_simSettingsMsfs2024 { + this, &CMultiSimulatorSettings::onMsfs2024SettingsChanged + }; //!< MSFS settings CSetting m_simSettingsXP { this, &CMultiSimulatorSettings::onXPSettingsChanged }; //!< XP settings CSetting m_simSettingsFG { this, &CMultiSimulatorSettings::onFGSettingsChanged }; //!< FG settings @@ -554,6 +571,7 @@ namespace swift::misc::simulation::settings void onFs9SettingsChanged(); void onP3DSettingsChanged(); void onMsfsSettingsChanged(); + void onMsfs2024SettingsChanged(); void onXPSettingsChanged(); void onFGSettingsChanged(); //! @} diff --git a/src/misc/simulation/simulatorinfo.cpp b/src/misc/simulation/simulatorinfo.cpp index 6f641df03..56d4ad93e 100644 --- a/src/misc/simulation/simulatorinfo.cpp +++ b/src/misc/simulation/simulatorinfo.cpp @@ -41,8 +41,8 @@ namespace swift::misc::simulation CSimulatorInfo::CSimulatorInfo(Simulator simulator) : m_simulator(static_cast(simulator)) {} - CSimulatorInfo::CSimulatorInfo(bool fsx, bool fs9, bool xp, bool p3d, bool fg, bool msfs) - : m_simulator(boolToFlag(fsx, fs9, xp, p3d, fg, msfs)) + CSimulatorInfo::CSimulatorInfo(bool fsx, bool fs9, bool xp, bool p3d, bool fg, bool msfs, bool msfs2024) + : m_simulator(boolToFlag(fsx, fs9, xp, p3d, fg, msfs, msfs2024)) {} CSimulatorInfo::CSimulatorInfo(int flagsAsInt) : m_simulator(flagsAsInt) {} @@ -61,9 +61,11 @@ namespace swift::misc::simulation bool CSimulatorInfo::isMSFS() const { return getSimulator().testFlag(MSFS); } + bool CSimulatorInfo::isMSFS2024() const { return getSimulator().testFlag(MSFS2024); } + bool CSimulatorInfo::isAnySimulator() const { - return isFSX() || isFS9() || isXPlane() || isP3D() || isFG() || isMSFS(); + return isFSX() || isFS9() || isXPlane() || isP3D() || isFG() || isMSFS() || isMSFS2024(); } bool CSimulatorInfo::isSingleSimulator() const { return this->numberSimulators() == 1; } @@ -74,14 +76,14 @@ namespace swift::misc::simulation bool CSimulatorInfo::isAllSimulators() const { - return isFSX() && isFS9() && isXPlane() && isP3D() && isFG() && isMSFS(); + return isFSX() && isFS9() && isXPlane() && isP3D() && isFG() && isMSFS() && isMSFS2024(); } - bool CSimulatorInfo::isMicrosoftSimulator() const { return isFSX() || isFS9() || isMSFS(); } + bool CSimulatorInfo::isMicrosoftSimulator() const { return isFSX() || isFS9() || isMSFS() || isMSFS2024(); } bool CSimulatorInfo::isMicrosoftOrPrepare3DSimulator() const { return isMicrosoftSimulator() || isP3D(); } - bool CSimulatorInfo::isFsxP3DFamily() const { return isFSX() || isP3D() || isMSFS(); } + bool CSimulatorInfo::isFsxP3DFamily() const { return isFSX() || isP3D() || isMSFS() || isMSFS2024(); } int CSimulatorInfo::numberSimulators() const { @@ -91,6 +93,7 @@ namespace swift::misc::simulation if (isP3D()) { c++; } if (isFG()) { c++; } if (isMSFS()) { c++; } + if (isMSFS2024()) { c++; } return c; } @@ -125,7 +128,8 @@ namespace swift::misc::simulation (s.testFlag(P3D) ? QStringLiteral("P3D ") : QString()) % (s.testFlag(XPLANE) ? QStringLiteral("XPlane ") : QString()) % (s.testFlag(FG) ? QStringLiteral("FG ") : QString()) % - (s.testFlag(MSFS) ? QStringLiteral("MSFS ") : QString()); + (s.testFlag(MSFS) ? QStringLiteral("MSFS ") : QString()) % + (s.testFlag(MSFS2024) ? QStringLiteral("MSFS2024 ") : QString()); return str.trimmed(); } @@ -151,6 +155,7 @@ namespace swift::misc::simulation if (m_simulator & FG) { set.insert(CSimulatorInfo(FG)); } if (m_simulator & XPLANE) { set.insert(CSimulatorInfo(XPLANE)); } if (m_simulator & MSFS) { set.insert(CSimulatorInfo(MSFS)); } + if (m_simulator & MSFS2024) { set.insert(CSimulatorInfo(MSFS2024)); } return set; } @@ -175,7 +180,8 @@ namespace swift::misc::simulation return m.info(u"Simulators OK for model"); } - CSimulatorInfo::Simulator CSimulatorInfo::boolToFlag(bool fsx, bool fs9, bool xp, bool p3d, bool fg, bool msfs) + CSimulatorInfo::Simulator CSimulatorInfo::boolToFlag(bool fsx, bool fs9, bool xp, bool p3d, bool fg, bool msfs, + bool msfs2024) { Simulator s = fsx ? FSX : None; if (fs9) { s |= FS9; } @@ -183,6 +189,7 @@ namespace swift::misc::simulation if (p3d) { s |= P3D; } if (fg) { s |= FG; } if (msfs) { s |= MSFS; } + if (msfs2024) { s |= MSFS2024; } return s; } @@ -200,6 +207,12 @@ namespace swift::misc::simulation { s |= P3D; } + if (i.contains("msfs2024")) + { + s |= MSFS2024; + return s; + } + if (i.contains("msfs")) { s |= MSFS; } return s; } @@ -241,6 +254,7 @@ namespace swift::misc::simulation bool p3d = false; bool fg = false; bool msfs = false; + bool msfs2024 = false; if (CBuildConfig::isRunningOnWindowsNtPlatform()) { @@ -248,11 +262,12 @@ namespace swift::misc::simulation fsx = !CFsDirectories::fsxSimObjectsDir().isEmpty() && !CFsDirectories::fsxDir().isEmpty(); p3d = !CFsDirectories::p3dDir().isEmpty() && !CFsDirectories::p3dSimObjectsDir().isEmpty(); msfs = !CFsDirectories::msfsDir().isEmpty() && !CFsDirectories::msfsPackagesDir().isEmpty(); + msfs2024 = !CFsDirectories::msfs2024Dir().isEmpty() && !CFsDirectories::msfs2024PackagesDir().isEmpty(); } const bool xp = !CXPlaneUtil::xplaneRootDir().isEmpty(); - sim.setSimulator(CSimulatorInfo::boolToFlag(fsx, fs9, xp, p3d, fg, msfs)); + sim.setSimulator(CSimulatorInfo::boolToFlag(fsx, fs9, xp, p3d, fg, msfs, msfs2024)); return sim; } @@ -287,6 +302,7 @@ namespace swift::misc::simulation const QJsonValue jp3d = json.value(prefix % u"simp3d"); const QJsonValue jfg = json.value(prefix % u"simfg"); const QJsonValue jmsfs = json.value(prefix % u"simmsfs"); + const QJsonValue jmsfs2024 = json.value(prefix % u"simmsfs2024"); // we handle bool JSON values and bool as string const bool fsx = jfsx.isBool() ? jfsx.toBool() : CDatastoreUtility::dbBoolStringToBool(jfsx.toString()); @@ -295,8 +311,10 @@ namespace swift::misc::simulation const bool p3d = jp3d.isBool() ? jp3d.toBool() : CDatastoreUtility::dbBoolStringToBool(jp3d.toString()); const bool fg = jfg.isBool() ? jfg.toBool() : CDatastoreUtility::dbBoolStringToBool(jfg.toString()); const bool msfs = jmsfs.isBool() ? jmsfs.toBool() : CDatastoreUtility::dbBoolStringToBool(jmsfs.toString()); + const bool msfs2024 = + jmsfs2024.isBool() ? jmsfs2024.toBool() : CDatastoreUtility::dbBoolStringToBool(jmsfs2024.toString()); - const CSimulatorInfo simInfo(fsx, fs9, xp, p3d, fg, msfs); + const CSimulatorInfo simInfo(fsx, fs9, xp, p3d, fg, msfs, msfs2024); return simInfo; } @@ -319,13 +337,14 @@ namespace swift::misc::simulation int CCountPerSimulator::getCountForFsFamilySimulators() const { return this->getCount(CSimulatorInfo::fsx()) + this->getCount(CSimulatorInfo::p3d()) + - this->getCount(CSimulatorInfo::fs9()) + this->getCount(CSimulatorInfo::msfs()); + this->getCount(CSimulatorInfo::fs9()) + this->getCount(CSimulatorInfo::msfs()) + + this->getCount(CSimulatorInfo::msfs2024()); } int CCountPerSimulator::getCountForFsxFamilySimulators() const { return this->getCount(CSimulatorInfo::fsx()) + this->getCount(CSimulatorInfo::p3d()) + - this->getCount(CSimulatorInfo::msfs()); + this->getCount(CSimulatorInfo::msfs()) + this->getCount(CSimulatorInfo::msfs2024()); } int CCountPerSimulator::getMaximum() const { return *std::min_element(m_counts.begin(), m_counts.end()); } @@ -353,7 +372,8 @@ namespace swift::misc::simulation { return u"FSX: " % QString::number(m_counts[0]) % u" P3D: " % QString::number(m_counts[1]) % u" FS9: " % QString::number(m_counts[2]) % u" XPlane: " % QString::number(m_counts[3]) % u" FG: " % - QString::number(m_counts[4]) % u" MSFS: " % QString::number(m_counts[5]); + QString::number(m_counts[4]) % u" MSFS: " % QString::number(m_counts[5]) % u" MSFS2024: " % + QString::number(m_counts[6]); } void CCountPerSimulator::setCount(int count, const CSimulatorInfo &simulator) @@ -375,6 +395,7 @@ namespace swift::misc::simulation if (simulator.isXPlane()) { m_counts[3]++; } if (simulator.isFG()) { m_counts[4]++; } if (simulator.isMSFS()) { m_counts[5]++; } + if (simulator.isMSFS2024()) { m_counts[6]++; } } int CCountPerSimulator::internalIndex(const CSimulatorInfo &simulator) @@ -388,6 +409,7 @@ namespace swift::misc::simulation case CSimulatorInfo::XPLANE: return 3; case CSimulatorInfo::FG: return 4; case CSimulatorInfo::MSFS: return 5; + case CSimulatorInfo::MSFS2024: return 6; default: return CSimulatorInfo::NumberOfSimulators; // unknown } } @@ -402,6 +424,7 @@ namespace swift::misc::simulation case 3: return CSimulatorInfo(CSimulatorInfo::XPLANE); case 4: return CSimulatorInfo(CSimulatorInfo::FG); case 5: return CSimulatorInfo(CSimulatorInfo::MSFS); + case 6: return CSimulatorInfo(CSimulatorInfo::MSFS2024); default: return CSimulatorInfo(CSimulatorInfo::None); } } diff --git a/src/misc/simulation/simulatorinfo.h b/src/misc/simulation/simulatorinfo.h index 3e732c827..ce9bda03c 100644 --- a/src/misc/simulation/simulatorinfo.h +++ b/src/misc/simulation/simulatorinfo.h @@ -50,14 +50,15 @@ namespace swift::misc::simulation P3D = 1 << 3, FG = 1 << 4, MSFS = 1 << 5, + MSFS2024 = 1 << 6, FSX_P3D = FSX | P3D, - AllFsFamily = FSX | FS9 | P3D | MSFS, - All = FSX | FS9 | XPLANE | P3D | FG | MSFS + AllFsFamily = FSX | FS9 | P3D | MSFS | MSFS2024, + All = FSX | FS9 | XPLANE | P3D | FG | MSFS | MSFS2024 }; Q_DECLARE_FLAGS(Simulator, SimulatorFlag) //! Number of known individual simulators - static constexpr int NumberOfSimulators = 6; + static constexpr int NumberOfSimulators = 7; //! Default constructor CSimulatorInfo(); @@ -75,7 +76,7 @@ namespace swift::misc::simulation CSimulatorInfo(int flagsAsInt); //! Constructor - CSimulatorInfo(bool isFSX, bool isFS9, bool xp, bool isP3D, bool fg, bool msfs); + CSimulatorInfo(bool isFSX, bool isFS9, bool xp, bool isP3D, bool fg, bool msfs, bool msfs2024); //! Unspecified simulator bool isUnspecified() const; @@ -98,6 +99,9 @@ namespace swift::misc::simulation //! MSFS? bool isMSFS() const; + //! MSFS2024? + bool isMSFS2024() const; + //! Any simulator? bool isAnySimulator() const; @@ -172,7 +176,7 @@ namespace swift::misc::simulation CStatusMessage validateSimulatorsForModel() const; //! Bool flags to enum - static Simulator boolToFlag(bool isFSX, bool isFS9, bool xp, bool isP3D, bool fg, bool msfs); + static Simulator boolToFlag(bool isFSX, bool isFS9, bool xp, bool isP3D, bool fg, bool msfs, bool msfs2024); //! Identifer, as provided by plugin static Simulator identifierToSimulator(const QString &identifier); @@ -230,6 +234,11 @@ namespace swift::misc::simulation static const CSimulatorInfo s(MSFS); return s; } + static const CSimulatorInfo &msfs2024() + { + static const CSimulatorInfo s(MSFS2024); + return s; + } //! @} private: diff --git a/src/misc/simulation/simulatorinfolist.cpp b/src/misc/simulation/simulatorinfolist.cpp index 8a0b47d0f..8df66ecea 100644 --- a/src/misc/simulation/simulatorinfolist.cpp +++ b/src/misc/simulation/simulatorinfolist.cpp @@ -50,6 +50,7 @@ namespace swift::misc::simulation if (sim.isFSX()) { sims.push_back(CSimulatorInfo(CSimulatorInfo::FSX)); } if (sim.isP3D()) { sims.push_back(CSimulatorInfo(CSimulatorInfo::P3D)); } if (sim.isMSFS()) { sims.push_back(CSimulatorInfo(CSimulatorInfo::MSFS)); } + if (sim.isMSFS2024()) { sims.push_back(CSimulatorInfo(CSimulatorInfo::MSFS2024)); } if (sim.isXPlane()) { sims.push_back(CSimulatorInfo(CSimulatorInfo::XPLANE)); } return sims; } diff --git a/src/misc/simulation/simulatorplugininfo.cpp b/src/misc/simulation/simulatorplugininfo.cpp index c42d16126..9d922ace8 100644 --- a/src/misc/simulation/simulatorplugininfo.cpp +++ b/src/misc/simulation/simulatorplugininfo.cpp @@ -65,6 +65,8 @@ namespace swift::misc::simulation if (s.testFlag(CSimulatorInfo::XPLANE)) { return CSimulatorPluginInfo::xplanePluginIdentifier(); } if (s.testFlag(CSimulatorInfo::FG)) { return CSimulatorPluginInfo::fgPluginIdentifier(); } if (s.testFlag(CSimulatorInfo::MSFS)) { return CSimulatorPluginInfo::msfsPluginIdentifier(); } + if (s.testFlag(CSimulatorInfo::MSFS2024)) { return CSimulatorPluginInfo::msfs2024PluginIdentifier(); } + return e; } @@ -104,6 +106,12 @@ namespace swift::misc::simulation return s; } + const QString &CSimulatorPluginInfo::msfs2024PluginIdentifier() + { + static const QString s("org.swift-project.plugins.simulator.msfs2024"); + return s; + } + const QString &CSimulatorPluginInfo::emulatedPluginIdentifier() { static const QString s("org.swift-project.plugins.simulator.emulated"); @@ -114,7 +122,7 @@ namespace swift::misc::simulation { static const QStringList identifiers({ fsxPluginIdentifier(), p3dPluginIdentifier(), xplanePluginIdentifier(), fs9PluginIdentifier(), emulatedPluginIdentifier(), fgPluginIdentifier(), - msfsPluginIdentifier() }); + msfsPluginIdentifier(), msfs2024PluginIdentifier() }); return identifiers; } @@ -126,7 +134,9 @@ namespace swift::misc::simulation return QStringList { xplanePluginIdentifier(), fgPluginIdentifier() }; } - return QStringList { fsxPluginIdentifier(), msfsPluginIdentifier(), p3dPluginIdentifier(), - xplanePluginIdentifier(), fgPluginIdentifier() }; + return QStringList { + fsxPluginIdentifier(), msfsPluginIdentifier(), p3dPluginIdentifier(), + xplanePluginIdentifier(), fgPluginIdentifier(), msfs2024PluginIdentifier(), + }; } } // namespace swift::misc::simulation diff --git a/src/misc/simulation/simulatorplugininfo.h b/src/misc/simulation/simulatorplugininfo.h index a08bed257..cc898197e 100644 --- a/src/misc/simulation/simulatorplugininfo.h +++ b/src/misc/simulation/simulatorplugininfo.h @@ -86,6 +86,9 @@ namespace swift::misc::simulation //! Plugin identifier (MSFS 2020) static const QString &msfsPluginIdentifier(); + //! Plugin identifier (MSFS 2024) + static const QString &msfs2024PluginIdentifier(); + //! Plugin identifier (emulated simulator plugin) static const QString &emulatedPluginIdentifier(); diff --git a/src/plugins/simulator/CMakeLists.txt b/src/plugins/simulator/CMakeLists.txt index 7255bc0f0..4572f5131 100644 --- a/src/plugins/simulator/CMakeLists.txt +++ b/src/plugins/simulator/CMakeLists.txt @@ -18,11 +18,11 @@ if(SWIFT_BUILD_XPLANE_PLUGIN) add_subdirectory(xplaneconfig) endif() -if(SWIFT_BUILD_FS9_PLUGIN OR SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN) +if(SWIFT_BUILD_FS9_PLUGIN OR SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN OR SWIFT_BUILD_MSFS2024_PLUGIN) add_subdirectory(fscommon) endif() -if(SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN) +if(SWIFT_BUILD_FSX_PLUGIN OR SWIFT_BUILD_P3D_PLUGIN OR SWIFT_BUILD_MSFS_PLUGIN OR SWIFT_BUILD_MSFS2024_PLUGIN) add_subdirectory(fsxcommon) endif() @@ -37,7 +37,10 @@ endif() if(SWIFT_BUILD_MSFS_PLUGIN) add_subdirectory(msfs) - add_subdirectory(msfsconfig) + endif() + +if(SWIFT_BUILD_MSFS2024_PLUGIN) + add_subdirectory(msfs2024) endif() if(SWIFT_BUILD_FSX_PLUGIN) diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp index b91935b48..20c19ccd1 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.cpp @@ -84,6 +84,7 @@ namespace swift::simplugin::fsxcommon hr += initSimulatorEnvironment(hSimConnect); hr += initSbDataArea(hSimConnect); if (simInfo.isMSFS()) { hr += initMSFSTransponder(hSimConnect); } + if (simInfo.isMSFS2024()) { hr += initMSFS2024Transponder(hSimConnect); } return hr; } @@ -424,6 +425,22 @@ namespace swift::simplugin::fsxcommon return hr; } + HRESULT CSimConnectDefinitions::initMSFS2024Transponder(const HANDLE hSimConnect) + { + HRESULT hr = s_ok(); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataTransponderModeMSFS, + "TRANSPONDER STATE:1", "Enum"); + hr += SimConnect_AddToDataDefinition(hSimConnect, CSimConnectDefinitions::DataTransponderModeMSFS, + "TRANSPONDER IDENT:1", "Bool"); + if (isFailure(hr)) + { + CLogMessage(static_cast(nullptr)) + .error(u"SimConnect error: MSFS2024 transponder data definitions %1") + << hr; + } + return hr; + } + DataDefinitionRemoteAircraftPartsWithoutLights::DataDefinitionRemoteAircraftPartsWithoutLights() { this->resetToInvalid(); diff --git a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h index 140bbe257..b5d6f9b82 100644 --- a/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h +++ b/src/plugins/simulator/fsxcommon/simconnectdatadefinition.h @@ -271,6 +271,7 @@ namespace swift::simplugin::fsxcommon ClientAreaSquawkBox }; + // TODO TZ: are there any changes in MSFS2024 //! Handles SimConnect data definitions class FSXCOMMON_EXPORT CSimConnectDefinitions { @@ -354,6 +355,9 @@ namespace swift::simplugin::fsxcommon //! Initialize data definition for MSFS transponder static HRESULT initMSFSTransponder(const HANDLE hSimConnect); + + //! Initialize data definition for MSFS transponder + static HRESULT initMSFS2024Transponder(const HANDLE hSimConnect); }; } // namespace swift::simplugin::fsxcommon diff --git a/src/plugins/simulator/fsxcommon/simconnectsymbols.cpp b/src/plugins/simulator/fsxcommon/simconnectsymbols.cpp index 3857f565d..c2f12ef4b 100644 --- a/src/plugins/simulator/fsxcommon/simconnectsymbols.cpp +++ b/src/plugins/simulator/fsxcommon/simconnectsymbols.cpp @@ -351,6 +351,37 @@ bool loadAndResolveMSFSimConnect() } } +bool loadAndResolveMSFS2024SimConnect() +{ + // Check if already loaded + if (gSymbols.SimConnect_Open) { return true; } + + QString simConnectFileName(QStringLiteral("SimConnect.MSFS2024")); + + QLibrary simConnectDll(simConnectFileName); + simConnectDll.setLoadHints(QLibrary::PreventUnloadHint); + if (simConnectDll.load()) + { + const bool resolvedCommon = resolveCommonSimConnectSymbols(simConnectDll); + if (!resolvedCommon) + { + CLogMessage(CLogCategories::driver()).error(u"Failed to resolve common symbols from SimConnect.dll: '%1'") + << simConnectFileName; + return false; + } + + CLogMessage(CLogCategories::driver()).info(u"Loaded and resolved MSFS2024 symbols from SimConnect.dll: '%1'") + << simConnectFileName; + return resolvedCommon; + } + else + { + CLogMessage(CLogCategories::driver()).error(u"Failed to load SimConnect.dll: '%1' '%2'") + << simConnectFileName << simConnectDll.errorString(); + return false; + } +} + #else bool loadAndResolveFsxSimConnect(bool manifestProbing) { diff --git a/src/plugins/simulator/fsxcommon/simconnectsymbols.h b/src/plugins/simulator/fsxcommon/simconnectsymbols.h index 01eb193a5..f8fe6c997 100644 --- a/src/plugins/simulator/fsxcommon/simconnectsymbols.h +++ b/src/plugins/simulator/fsxcommon/simconnectsymbols.h @@ -39,6 +39,8 @@ inline bool loadAndResolveP3DSimConnectByString(const QString &version) FSXCOMMON_EXPORT bool loadAndResolveMSFSimConnect(); +FSXCOMMON_EXPORT bool loadAndResolveMSFS2024SimConnect(); + #else //! Load and resolve FSX SimConnect. diff --git a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp index be95577dc..4f58d6cb4 100644 --- a/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp +++ b/src/plugins/simulator/fsxcommon/simulatorfsxcommon.cpp @@ -509,7 +509,8 @@ namespace swift::simplugin::fsxcommon const CFsxP3DSettings settings = m_detailsSettings.getSettings(this->getSimulatorInfo()); m_useAddSimulatedObj = settings.isAddingAsSimulatedObjectEnabled(); m_useSbOffsets = settings.isSbOffsetsEnabled(); - if (this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS()) + if (this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS() || + this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS2024()) { m_useSbOffsets = false; // Always disable SbOffsets for MSFS. Using new transponder mode property directly } @@ -533,7 +534,9 @@ namespace swift::simplugin::fsxcommon SIMCONNECT_PERIOD_SECOND, SIMCONNECT_DATA_REQUEST_FLAG_CHANGED), "Cannot request sim.env.", Q_FUNC_INFO, "SimConnect_RequestDataOnSimObject"); - if (!this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS()) + // TODO TZ use MSFS2024 FSUIPC? + if (!this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS() && + !this->getSimulatorPluginInfo().getSimulatorInfo().isMSFS2024()) { // Request the data from SB only when its changed and only ONCE so we don't have to run a 1sec event to // get/set this info ;) there was a bug with SIMCONNECT_CLIENT_DATA_PERIOD_ON_SET, see @@ -3113,6 +3116,11 @@ namespace swift::simplugin::fsxcommon // MSFS 2020 drivers only works with MSFS return connectedSimName.contains("kittyhawk"); } + else if (pluginSim.isMSFS2024()) + { + // MSFS2024 drivers only works with MSFS2024 + return connectedSimName.contains("sunrise"); + } return false; } diff --git a/src/plugins/simulator/msfs2024/CMakeLists.txt b/src/plugins/simulator/msfs2024/CMakeLists.txt new file mode 100644 index 000000000..d04f63955 --- /dev/null +++ b/src/plugins/simulator/msfs2024/CMakeLists.txt @@ -0,0 +1,29 @@ +# SPDX-FileCopyrightText: Copyright (C) swift Project Community / Contributors +# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 + +add_library(simulatormsfs2024 SHARED + simulatormsfs2024.cpp + simulatormsfs2024.h + simulatormsfs2024.json + simulatormsfs2024factory.cpp + simulatormsfs2024factory.h +) + +set_target_properties(simulatormsfs2024 PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/bin/plugins/simulator) +set_target_properties(simulatormsfs2024 PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/bin/plugins/simulator) + +target_include_directories(simulatormsfs2024 PUBLIC ${PROJECT_SOURCE_DIR}/src) + +target_link_libraries(simulatormsfs2024 + PUBLIC + fscommon + fsxcommon + core + misc + Qt::Core +) + +install(TARGETS simulatormsfs2024 + LIBRARY DESTINATION bin/plugins/simulator + RUNTIME DESTINATION bin/plugins/simulator + ) diff --git a/src/plugins/simulator/msfs2024/simulatormsfs2024.cpp b/src/plugins/simulator/msfs2024/simulatormsfs2024.cpp new file mode 100644 index 000000000..fa9497ed3 --- /dev/null +++ b/src/plugins/simulator/msfs2024/simulatormsfs2024.cpp @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: Copyright (C) 2020 swift Project Community / Contributors +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 + +#include "simulatorMsFs2024.h" + +#include "../fsxcommon/simconnectsymbols.h" + +using namespace swift::misc; +using namespace swift::misc::aviation; +using namespace swift::misc::physical_quantities; +using namespace swift::misc::geo; +using namespace swift::misc::network; +using namespace swift::misc::simulation; +using namespace swift::misc::simulation::fscommon; +using namespace swift::core; +using namespace swift::simplugin::fsxcommon; + +namespace swift::simplugin::msfs2024 +{ + CSimulatorMsFs2024::CSimulatorMsFs2024(const CSimulatorPluginInfo &info, IOwnAircraftProvider *ownAircraftProvider, + IRemoteAircraftProvider *remoteAircraftProvider, + IClientProvider *clientProvider, QObject *parent) + : CSimulatorFsxCommon(info, ownAircraftProvider, remoteAircraftProvider, clientProvider, parent) + { + this->setDefaultModel({ "Airbus A320 Neo Asobo", CAircraftModel::TypeModelMatchingDefaultModel, + "Airbus A320 default model", CAircraftIcaoCode("A320", "L2J") }); + } + + bool CSimulatorMsFs2024::connectTo() + { + if (!loadAndResolveMSFS2024SimConnect()) { return false; } + return CSimulatorFsxCommon::connectTo(); + } + + void CSimulatorMsFs2024::setTrueAltitude(CAircraftSituation &aircraftSituation, + const DataDefinitionOwnAircraft &simulatorOwnAircraft) + { + aircraftSituation.setAltitude( + CAltitude(simulatorOwnAircraft.altitudeCalibratedFt, CAltitude::MeanSeaLevel, CLengthUnit::ft())); + m_altitudeDelta = { simulatorOwnAircraft.altitudeFt - simulatorOwnAircraft.altitudeCalibratedFt, + CLengthUnit::ft() }; + } + + void CSimulatorMsFs2024Listener::startImpl() + { + if (!loadAndResolveMSFS2024SimConnect()) { return; } + CSimulatorFsxCommonListener::startImpl(); + } + +} // namespace swift::simplugin::msfs2024 diff --git a/src/plugins/simulator/msfs2024/simulatormsfs2024.h b/src/plugins/simulator/msfs2024/simulatormsfs2024.h new file mode 100644 index 000000000..2ca045eee --- /dev/null +++ b/src/plugins/simulator/msfs2024/simulatormsfs2024.h @@ -0,0 +1,49 @@ +// SPDX-FileCopyrightText: Copyright (C) 2020 swift Project Community / Contributors +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 + +//! \file + +#ifndef SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFS2024_H +#define SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFS2024_H + +#include "../fsxcommon/simulatorfsxcommon.h" + +namespace swift::simplugin::msfs2024 +{ + //! FSX simulator implementation + class CSimulatorMsFs2024 : public swift::simplugin::fsxcommon::CSimulatorFsxCommon + { + Q_OBJECT + + public: + //! Constructor, parameters as in \sa swift::core::ISimulatorFactory::create + CSimulatorMsFs2024(const swift::misc::simulation::CSimulatorPluginInfo &info, + swift::misc::simulation::IOwnAircraftProvider *ownAircraftProvider, + swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider, + swift::misc::network::IClientProvider *clientProvider, QObject *parent = nullptr); + + //! \name ISimulator implementations + //! @{ + virtual bool connectTo() override; + //! @} + + virtual void + setTrueAltitude(swift::misc::aviation::CAircraftSituation &aircraftSituation, + const swift::simplugin::fsxcommon::DataDefinitionOwnAircraft &simulatorOwnAircraft) override; + }; + + //! Listener for MSFS2024 + class CSimulatorMsFs2024Listener : public fsxcommon::CSimulatorFsxCommonListener + { + Q_OBJECT + + public: + //! Constructor + using CSimulatorFsxCommonListener::CSimulatorFsxCommonListener; + + protected: + virtual void startImpl() override; + }; +} // namespace swift::simplugin::msfs2024 + +#endif // guard diff --git a/src/plugins/simulator/msfs2024/simulatormsfs2024.json b/src/plugins/simulator/msfs2024/simulatormsfs2024.json new file mode 100644 index 000000000..399f83fd8 --- /dev/null +++ b/src/plugins/simulator/msfs2024/simulatormsfs2024.json @@ -0,0 +1,7 @@ +{ + "identifier" : "org.swift-project.plugins.simulator.msfs2024", + "name" : "Flight Simulator 2024", + "simulator" : "msfs2024", + "description" : "Microsoft Flight Simulator 2024", + "config" : "org.swift-project.plugins.simulator.msfs2024.config" +} diff --git a/src/plugins/simulator/msfsconfig/simulatormsfsconfig.json.license b/src/plugins/simulator/msfs2024/simulatormsfs2024.json.license similarity index 100% rename from src/plugins/simulator/msfsconfig/simulatormsfsconfig.json.license rename to src/plugins/simulator/msfs2024/simulatormsfs2024.json.license diff --git a/src/plugins/simulator/msfs2024/simulatormsfs2024factory.cpp b/src/plugins/simulator/msfs2024/simulatormsfs2024factory.cpp new file mode 100644 index 000000000..64395fcb9 --- /dev/null +++ b/src/plugins/simulator/msfs2024/simulatormsfs2024factory.cpp @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 + +#include "simulatormsfs2024factory.h" + +#include "simulatormsfs2024.h" + +#include "misc/simulation/simulatorplugininfo.h" + +using namespace swift::misc::network; +using namespace swift::misc::simulation; +using namespace swift::core; + +namespace swift::simplugin::msfs2024 +{ + ISimulator *CSimulatorMsFs2024Factory::create(const CSimulatorPluginInfo &info, + IOwnAircraftProvider *ownAircraftProvider, + IRemoteAircraftProvider *remoteAircraftProvider, + IClientProvider *clientProvider) + { + Q_ASSERT(ownAircraftProvider); + return new CSimulatorMsFs2024(info, ownAircraftProvider, remoteAircraftProvider, clientProvider, this); + } + + ISimulatorListener *CSimulatorMsFs2024Factory::createListener(const CSimulatorPluginInfo &info) + { + return new CSimulatorMsFs2024Listener(info); + } +} // namespace swift::simplugin::msfs2024 diff --git a/src/plugins/simulator/msfs2024/simulatormsfs2024factory.h b/src/plugins/simulator/msfs2024/simulatormsfs2024factory.h new file mode 100644 index 000000000..bf776ed18 --- /dev/null +++ b/src/plugins/simulator/msfs2024/simulatormsfs2024factory.h @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors +// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 + +//! \file + +#ifndef SWIFT_SIMPLUGIN_SIMULATOR_MSFS2024FACTORY_H +#define SWIFT_SIMPLUGIN_SIMULATOR_MSFS2024FACTORY_H + +#include +#include + +#include "core/simulator.h" +#include "misc/simulation/simulatorplugininfo.h" + +namespace swift::simplugin::msfs2024 +{ + //! Factory implementation to create CSimulatorFsx instances + class CSimulatorMsFs2024Factory : public QObject, public swift::core::ISimulatorFactory + { + Q_OBJECT + Q_PLUGIN_METADATA(IID "org.swift-project.swift_core.simulatorinterface" FILE "simulatormsfs2024.json") + Q_INTERFACES(swift::core::ISimulatorFactory) + + public: + //! \copydoc swift::core::ISimulatorFactory::create + virtual swift::core::ISimulator * + create(const swift::misc::simulation::CSimulatorPluginInfo &info, + swift::misc::simulation::IOwnAircraftProvider *ownAircraftProvider, + swift::misc::simulation::IRemoteAircraftProvider *remoteAircraftProvider, + swift::misc::network::IClientProvider *clientProvider) override; + + //! \copydoc swift::core::ISimulatorFactory::createListener + virtual swift::core::ISimulatorListener * + createListener(const swift::misc::simulation::CSimulatorPluginInfo &info) override; + }; +} // namespace swift::simplugin::msfs2024 + +#endif // guard diff --git a/src/plugins/simulator/msfsconfig/CMakeLists.txt b/src/plugins/simulator/msfsconfig/CMakeLists.txt deleted file mode 100644 index a416ab811..000000000 --- a/src/plugins/simulator/msfsconfig/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (C) swift Project Community / Contributors -# SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 - -add_library(simulatormsfsconfig SHARED - simulatormsfsconfig.cpp - simulatormsfsconfig.h - simulatormsfsconfig.json -) - -set_target_properties(simulatormsfsconfig PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/bin/plugins/simulator) -set_target_properties(simulatormsfsconfig PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/bin/plugins/simulator) - -target_include_directories(simulatormsfsconfig PUBLIC ${PROJECT_SOURCE_DIR}/src) - -target_link_libraries(simulatormsfsconfig - PUBLIC - gui - misc - Qt::Core - PRIVATE - fsxcommon -) - -install(TARGETS simulatormsfsconfig - LIBRARY DESTINATION bin/plugins/simulator - RUNTIME DESTINATION bin/plugins/simulator -) diff --git a/src/plugins/simulator/msfsconfig/simulatormsfsconfig.cpp b/src/plugins/simulator/msfsconfig/simulatormsfsconfig.cpp deleted file mode 100644 index f3aa525c0..000000000 --- a/src/plugins/simulator/msfsconfig/simulatormsfsconfig.cpp +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 - -#include "simulatormsfsconfig.h" - -#include "../fsxcommon/simulatorfsxconfigwindow.h" - -namespace swift::simplugin::msfs -{ - CSimulatorMsfsConfig::CSimulatorMsfsConfig(QObject *parent) : QObject(parent) - { - // void - } - - swift::gui::CPluginConfigWindow *CSimulatorMsfsConfig::createConfigWindow(QWidget *parent) - { - return new fsxcommon::CSimulatorFsxConfigWindow("MSFS", parent); - } -} // namespace swift::simplugin::msfs diff --git a/src/plugins/simulator/msfsconfig/simulatormsfsconfig.h b/src/plugins/simulator/msfsconfig/simulatormsfsconfig.h deleted file mode 100644 index 024fd1fed..000000000 --- a/src/plugins/simulator/msfsconfig/simulatormsfsconfig.h +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-FileCopyrightText: Copyright (C) 2017 swift Project Community / Contributors -// SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1 - -//! \file - -#ifndef SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFSCONFIG_H -#define SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFSCONFIG_H - -#include "gui/pluginconfig.h" - -namespace swift::simplugin::msfs -{ - /*! - * Window for setting up the MSFS plugin. - */ - class CSimulatorMsfsConfig : public QObject, public swift::gui::IPluginConfig - { - Q_OBJECT - Q_PLUGIN_METADATA(IID "org.swift-project.swiftgui.pluginconfiginterface" FILE "simulatormsfsconfig.json") - Q_INTERFACES(swift::gui::IPluginConfig) - - public: - //! Ctor - CSimulatorMsfsConfig(QObject *parent = nullptr); - - //! Dtor - virtual ~CSimulatorMsfsConfig() {} - - //! \copydoc swift::gui::IPluginConfig::createConfigWindow() - swift::gui::CPluginConfigWindow *createConfigWindow(QWidget *parent) override; - }; -} // namespace swift::simplugin::msfs - -#endif // SWIFT_SIMPLUGIN_MSFS_SIMULATORMSFSCONFIG_H diff --git a/src/plugins/simulator/msfsconfig/simulatormsfsconfig.json b/src/plugins/simulator/msfsconfig/simulatormsfsconfig.json deleted file mode 100644 index 9e2ce2e6e..000000000 --- a/src/plugins/simulator/msfsconfig/simulatormsfsconfig.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "identifier" : "org.swift-project.plugins.simulator.msfs.config" -}