فهرست منبع

yuzu/main: Ensure NCAs are registered in content provider when launching from CLI

Fixes updates and DLC not being loaded when launching yuzu from the command line.

Similar to https://github.com/yuzu-emu/yuzu/pull/11357.
Fixes https://github.com/yuzu-emu/yuzu/issues/8352,
FearlessTobi 2 سال پیش
والد
کامیت
59b3c30f94
2فایلهای تغییر یافته به همراه39 افزوده شده و 0 حذف شده
  1. 38 0
      src/yuzu/main.cpp
  2. 1 0
      src/yuzu/main.h

+ 38 - 0
src/yuzu/main.cpp

@@ -1811,6 +1811,43 @@ bool GMainWindow::SelectAndSetCurrentUser(
     return true;
 }
 
+void GMainWindow::ConfigureFilesystemProvider(const std::string& filepath) {
+    // Ensure all NCAs are registered before launching the game
+    const auto file = vfs->OpenFile(filepath, FileSys::Mode::Read);
+    if (!file) {
+        return;
+    }
+
+    auto loader = Loader::GetLoader(*system, file);
+    if (!loader) {
+        return;
+    }
+
+    const auto file_type = loader->GetFileType();
+    if (file_type == Loader::FileType::Unknown || file_type == Loader::FileType::Error) {
+        return;
+    }
+
+    u64 program_id = 0;
+    const auto res2 = loader->ReadProgramId(program_id);
+    if (res2 == Loader::ResultStatus::Success && file_type == Loader::FileType::NCA) {
+        provider->AddEntry(FileSys::TitleType::Application,
+                           FileSys::GetCRTypeFromNCAType(FileSys::NCA{file}.GetType()), program_id,
+                           file);
+    } else if (res2 == Loader::ResultStatus::Success &&
+               (file_type == Loader::FileType::XCI || file_type == Loader::FileType::NSP)) {
+        const auto nsp = file_type == Loader::FileType::NSP
+                             ? std::make_shared<FileSys::NSP>(file)
+                             : FileSys::XCI{file}.GetSecurePartitionNSP();
+        for (const auto& title : nsp->GetNCAs()) {
+            for (const auto& entry : title.second) {
+                provider->AddEntry(entry.first.first, entry.first.second, title.first,
+                                   entry.second->GetBaseFile());
+            }
+        }
+    }
+}
+
 void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t program_index,
                            StartGameType type) {
     LOG_INFO(Frontend, "yuzu starting...");
@@ -1825,6 +1862,7 @@ void GMainWindow::BootGame(const QString& filename, u64 program_id, std::size_t
 
     last_filename_booted = filename;
 
+    ConfigureFilesystemProvider(filename.toStdString());
     const auto v_file = Core::GetGameFileFromPath(vfs, filename.toUtf8().constData());
     const auto loader = Loader::GetLoader(*system, v_file, program_id, program_index);
 

+ 1 - 0
src/yuzu/main.h

@@ -399,6 +399,7 @@ private:
     void OpenPerGameConfiguration(u64 title_id, const std::string& file_name);
     bool CheckDarkMode();
     bool CheckSystemArchiveDecryption();
+    void ConfigureFilesystemProvider(const std::string& filepath);
 
     QString GetTasStateDescription() const;
     bool CreateShortcut(const std::string& shortcut_path, const std::string& title,