mirror of
https://git.ryujinx.app/kenji-nx/ryujinx.git
synced 2025-12-13 13:37:08 +00:00
UI: Scanning for mods on DLC content
This commit is contained in:
parent
628a28290f
commit
01cd935cc3
5 changed files with 35 additions and 13 deletions
|
|
@ -298,7 +298,7 @@ namespace Ryujinx.HLE.HOS
|
|||
AddModsFromDirectory(mods, applicationDir, modMetadata);
|
||||
}
|
||||
|
||||
public static void QueryContentsDir(ModCache mods, DirectoryInfo contentsDir, ulong applicationId)
|
||||
public static void QueryContentsDir(ModCache mods, DirectoryInfo contentsDir, ulong applicationId, ulong[] installedDlcs)
|
||||
{
|
||||
if (!contentsDir.Exists)
|
||||
{
|
||||
|
|
@ -313,6 +313,16 @@ namespace Ryujinx.HLE.HOS
|
|||
{
|
||||
QueryApplicationDir(mods, applicationDir, applicationId);
|
||||
}
|
||||
|
||||
foreach (ulong installedDlcId in installedDlcs)
|
||||
{
|
||||
DirectoryInfo dlcModDir = FindApplicationDir(contentsDir, $"{installedDlcId:x16}");
|
||||
|
||||
if (dlcModDir != null)
|
||||
{
|
||||
QueryApplicationDir(mods, dlcModDir, applicationId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static int QueryCheatsDir(ModCache mods, DirectoryInfo cheatsDir)
|
||||
|
|
@ -422,7 +432,7 @@ namespace Ryujinx.HLE.HOS
|
|||
{
|
||||
foreach ((ulong applicationId, ModCache cache) in modCaches)
|
||||
{
|
||||
QueryContentsDir(cache, searchDir, applicationId);
|
||||
QueryContentsDir(cache, searchDir, applicationId, Array.Empty<ulong>());
|
||||
}
|
||||
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -146,7 +146,11 @@ namespace Ryujinx.Ava.UI.Controls
|
|||
|
||||
if (viewModel?.SelectedApplication != null)
|
||||
{
|
||||
await ModManagerWindow.Show(viewModel.SelectedApplication.Id, viewModel.SelectedApplication.Name);
|
||||
await ModManagerWindow.Show(
|
||||
viewModel.SelectedApplication.Id,
|
||||
viewModel.SelectedApplication.IdBase,
|
||||
viewModel.ApplicationLibrary,
|
||||
viewModel.SelectedApplication.Name);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ using Ryujinx.Common.Configuration;
|
|||
using Ryujinx.Common.Logging;
|
||||
using Ryujinx.Common.Utilities;
|
||||
using Ryujinx.HLE.HOS;
|
||||
using Ryujinx.UI.App.Common;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
|
|
@ -28,6 +29,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||
|
||||
private string _search;
|
||||
private readonly ulong _applicationId;
|
||||
private readonly ulong[] _installedDlcIds;
|
||||
private readonly IStorageProvider _storageProvider;
|
||||
|
||||
private static readonly ModMetadataJsonSerializerContext _serializerContext = new(JsonHelper.GetDefaultSerializerOptions());
|
||||
|
|
@ -80,10 +82,15 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||
get => string.Format(LocaleManager.Instance[LocaleKeys.ModWindowHeading], Mods.Count);
|
||||
}
|
||||
|
||||
public ModManagerViewModel(ulong applicationId)
|
||||
public ModManagerViewModel(ulong applicationId, ulong applicationIdBase, ApplicationLibrary appLibrary)
|
||||
{
|
||||
_applicationId = applicationId;
|
||||
|
||||
_installedDlcIds = appLibrary.DownloadableContents.Keys
|
||||
.Where(x => x.TitleIdBase == applicationIdBase)
|
||||
.Select(x => x.TitleId)
|
||||
.ToArray();
|
||||
|
||||
_modJsonPath = Path.Combine(AppDataManager.GamesDirPath, applicationId.ToString("x16"), "mods.json");
|
||||
|
||||
if (Application.Current.ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
|
||||
|
|
@ -91,10 +98,10 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||
_storageProvider = desktop.MainWindow.StorageProvider;
|
||||
}
|
||||
|
||||
LoadMods(applicationId);
|
||||
LoadMods(applicationId, _installedDlcIds);
|
||||
}
|
||||
|
||||
private void LoadMods(ulong applicationId)
|
||||
private void LoadMods(ulong applicationId, ulong[] installedDlcIds)
|
||||
{
|
||||
Mods.Clear();
|
||||
SelectedMods.Clear();
|
||||
|
|
@ -106,7 +113,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||
var inSd = path == ModLoader.GetSdModsBasePath();
|
||||
var modCache = new ModLoader.ModCache();
|
||||
|
||||
ModLoader.QueryContentsDir(modCache, new DirectoryInfo(Path.Combine(path, "contents")), applicationId);
|
||||
ModLoader.QueryContentsDir(modCache, new DirectoryInfo(Path.Combine(path, "contents")), applicationId, _installedDlcIds);
|
||||
|
||||
foreach (var mod in modCache.RomfsDirs)
|
||||
{
|
||||
|
|
@ -298,7 +305,7 @@ namespace Ryujinx.Ava.UI.ViewModels
|
|||
File.Copy(file, file.Replace(directory.Parent.ToString(), destinationDir), true);
|
||||
}
|
||||
|
||||
LoadMods(_applicationId);
|
||||
LoadMods(_applicationId, _installedDlcIds);
|
||||
}
|
||||
|
||||
public async void Add()
|
||||
|
|
|
|||
|
|
@ -62,7 +62,7 @@ namespace Ryujinx.Ava.UI.Windows
|
|||
|
||||
var mods = new ModLoader.ModCache();
|
||||
|
||||
ModLoader.QueryContentsDir(mods, new DirectoryInfo(Path.Combine(modsBasePath, "contents")), titleIdValue);
|
||||
ModLoader.QueryContentsDir(mods, new DirectoryInfo(Path.Combine(modsBasePath, "contents")), titleIdValue, []);
|
||||
|
||||
string currentCheatFile = string.Empty;
|
||||
string buildId = string.Empty;
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ using Ryujinx.Ava.Common.Locale;
|
|||
using Ryujinx.Ava.UI.Helpers;
|
||||
using Ryujinx.Ava.UI.Models;
|
||||
using Ryujinx.Ava.UI.ViewModels;
|
||||
using Ryujinx.UI.App.Common;
|
||||
using Ryujinx.UI.Common.Helper;
|
||||
using System.Threading.Tasks;
|
||||
using Button = Avalonia.Controls.Button;
|
||||
|
|
@ -23,21 +24,21 @@ namespace Ryujinx.Ava.UI.Windows
|
|||
InitializeComponent();
|
||||
}
|
||||
|
||||
public ModManagerWindow(ulong titleId)
|
||||
public ModManagerWindow(ulong titleId, ulong titleIdBase, ApplicationLibrary applicationLibrary)
|
||||
{
|
||||
DataContext = ViewModel = new ModManagerViewModel(titleId);
|
||||
DataContext = ViewModel = new ModManagerViewModel(titleId, titleIdBase, applicationLibrary);
|
||||
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
public static async Task Show(ulong titleId, string titleName)
|
||||
public static async Task Show(ulong titleId, ulong titleIdBase, ApplicationLibrary appLibrary, string titleName)
|
||||
{
|
||||
ContentDialog contentDialog = new()
|
||||
{
|
||||
PrimaryButtonText = "",
|
||||
SecondaryButtonText = "",
|
||||
CloseButtonText = "",
|
||||
Content = new ModManagerWindow(titleId),
|
||||
Content = new ModManagerWindow(titleId, titleIdBase, appLibrary),
|
||||
Title = string.Format(LocaleManager.Instance[LocaleKeys.ModWindowTitle], titleName, titleId.ToString("X16")),
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue