diff --git a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs index 6bda9d53..b57a6458 100644 --- a/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs +++ b/src/Snap.Hutao/Snap.Hutao/Model/Entity/SettingEntry.cs @@ -31,6 +31,11 @@ internal sealed class SettingEntry /// public const string SystemBackdropType = "SystemBackdropType"; + /// + /// 启用高级功能 + /// + public const string IsAdvancedLaunchOptionsEnabled = "IsAdvancedLaunchOptionsEnabled"; + /// /// 实时便笺刷新时间 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs index 737cbf0c..baecfbb4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.Designer.cs @@ -3561,6 +3561,15 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 启用「启动游戏-高级功能」的任意功能 您需要在设置里解锁它 的本地化字符串。 + /// + internal static string ViewPageLaunchGameAdvancedFeatureElevationHint { + get { + return ResourceManager.GetString("ViewPageLaunchGameAdvancedFeatureElevationHint", resourceCulture); + } + } + /// /// 查找类似 高级功能 的本地化字符串。 /// @@ -4191,6 +4200,33 @@ namespace Snap.Hutao.Resource.Localization { } } + /// + /// 查找类似 在完整阅读原神和胡桃工具箱用户协议后,我选择启用「启动游戏-高级功能」 的本地化字符串。 + /// + internal static string ViewPageSettingIsAdvancedLaunchOptionsEnabledDescription { + get { + return ResourceManager.GetString("ViewPageSettingIsAdvancedLaunchOptionsEnabledDescription", resourceCulture); + } + } + + /// + /// 查找类似 启动高级功能 的本地化字符串。 + /// + internal static string ViewPageSettingIsAdvancedLaunchOptionsEnabledHeader { + get { + return ResourceManager.GetString("ViewPageSettingIsAdvancedLaunchOptionsEnabledHeader", resourceCulture); + } + } + + /// + /// 查找类似 您解锁了「启动游戏-高级功能」!其含有潜在违反原神服务条款的风险,一旦启用,您将咨询承担可能的后果。慎重选择! 的本地化字符串。 + /// + internal static string ViewPageSettingFeaturesDangerousHint { + get { + return ResourceManager.GetString("ViewPageSettingFeaturesDangerousHint", resourceCulture); + } + } + /// /// 查找类似 Github 上反馈的问题会优先处理 的本地化字符串。 /// diff --git a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx index 29cf45c9..16e664c4 100644 --- a/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx +++ b/src/Snap.Hutao/Snap.Hutao/Resource/Localization/SH.resx @@ -1284,6 +1284,9 @@ 启动游戏 + + 启用「启动游戏-高级功能」的任意功能 您需要在设置里解锁它 + 高级功能 @@ -1494,6 +1497,15 @@ 显示 + + 在完整阅读原神和胡桃工具箱用户协议后,我选择启用「启动游戏-高级功能」 + + + 启动高级功能 + + + 您解锁了「启动游戏-高级功能」!其含有潜在违反原神服务条款的风险,一旦启用,您将咨询承担可能的后果。慎重选择! + Github 上反馈的问题会优先处理 diff --git a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs index fa0dd172..5632a210 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/AppOptions.cs @@ -6,6 +6,7 @@ using CommunityToolkit.Mvvm.Messaging; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Snap.Hutao.Core.Database; +using Snap.Hutao.Core.LifeCycle; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Entity.Database; using System.Globalization; @@ -24,6 +25,7 @@ internal sealed class AppOptions : ObservableObject, IOptions private bool? isEmptyHistoryWishVisible; private Core.Windowing.BackdropType? backdropType; private CultureInfo? currentCulture; + private bool? isAdvancedLaunchOptionsEnabled; /// /// 构造一个新的应用程序选项 @@ -171,6 +173,40 @@ internal sealed class AppOptions : ObservableObject, IOptions } } + /// + /// 是否启用高级功能 + /// + public bool IsAdvancedLaunchOptionsEnabled + { + get + { + if (isAdvancedLaunchOptionsEnabled == null) + { + using (IServiceScope scope = serviceScopeFactory.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + string? value = appDbContext.Settings.SingleOrDefault(e => e.Key == SettingEntry.IsAdvancedLaunchOptionsEnabled)?.Value; + _ = Activation.GetElevated() == true ? isAdvancedLaunchOptionsEnabled = value != null && bool.Parse(value) : IsAdvancedLaunchOptionsEnabled = false; + } + } + + return isAdvancedLaunchOptionsEnabled.Value; + } + + set + { + if (SetProperty(ref isAdvancedLaunchOptionsEnabled, value)) + { + using (IServiceScope scope = serviceScopeFactory.CreateScope()) + { + AppDbContext appDbContext = scope.ServiceProvider.GetRequiredService(); + appDbContext.Settings.ExecuteDeleteWhere(e => e.Key == SettingEntry.IsAdvancedLaunchOptionsEnabled); + appDbContext.Settings.AddAndSave(new(SettingEntry.IsAdvancedLaunchOptionsEnabled, value.ToString())); + } + } + } + } + /// public AppOptions Value { get => this; } } \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs index a6ee8b77..b7fbc887 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Cultivation/ICultivationService.cs @@ -1,7 +1,6 @@ // Copyright (c) DGP Studio. All rights reserved. // Licensed under the MIT license. -using Snap.Hutao.Model.Binding.Cultivation; using Snap.Hutao.Model.Entity; using Snap.Hutao.Model.Entity.Primitive; using Snap.Hutao.Model.Metadata.Item; diff --git a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs index ad1e3071..8dfa7c1b 100644 --- a/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs +++ b/src/Snap.Hutao/Snap.Hutao/Service/Game/GameService.cs @@ -301,16 +301,16 @@ internal sealed class GameService : IGameService try { Interlocked.Increment(ref runningGamesCounter); - bool isElevated = Activation.GetElevated(); + bool isPassCheck = Activation.GetElevated() == appOptions.IsAdvancedLaunchOptionsEnabled ? true : false; game.Start(); - if (isElevated && launchOptions.MultipleInstances) + if (isPassCheck && launchOptions.MultipleInstances) { ProcessInterop.DisableProtection(game, gamePath); } - if (isElevated && launchOptions.UnlockFps) + if (isPassCheck && launchOptions.UnlockFps) { await ProcessInterop.UnlockFpsAsync(game, launchOptions).ConfigureAwait(false); } diff --git a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml index 05972186..2c285939 100644 --- a/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml +++ b/src/Snap.Hutao/Snap.Hutao/View/Page/LaunchGamePage.xaml @@ -251,12 +251,18 @@ - + + + + + + + + + + + (); memoryCache = serviceProvider.GetRequiredService(); Options = serviceProvider.GetRequiredService(); + AppOptions = serviceProvider.GetRequiredService(); this.serviceProvider = serviceProvider; LaunchCommand = new AsyncRelayCommand(LaunchAsync, AsyncRelayCommandOptions.AllowConcurrentExecutions); @@ -100,6 +101,11 @@ internal sealed class LaunchGameViewModel : Abstraction.ViewModel /// public LaunchOptions Options { get; } + /// + /// 应用选项 + /// + public AppOptions AppOptions { get; } + /// /// 游戏资源 /// diff --git a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs index 1484b34e..2af84939 100644 --- a/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs +++ b/src/Snap.Hutao/Snap.Hutao/ViewModel/SettingViewModel.cs @@ -8,6 +8,7 @@ using Microsoft.Windows.AppLifecycle; using Snap.Hutao.Core.Database; using Snap.Hutao.Core.IO; using Snap.Hutao.Core.IO.DataTransfer; +using Snap.Hutao.Core.LifeCycle; using Snap.Hutao.Core.Setting; using Snap.Hutao.Core.Windowing; using Snap.Hutao.Factory.Abstraction; @@ -162,6 +163,11 @@ internal sealed class SettingViewModel : Abstraction.ViewModel /// public ExperimentalFeaturesViewModel Experimental { get; } + /// + /// 是否提权 + /// + public bool IsElevated { get => Activation.GetElevated(); } + /// /// 设置游戏路径命令 ///