Merge branch 'main' into d-v3

# Conflicts:
#	BetterGenshinImpact/App.xaml.cs
#	BetterGenshinImpact/BetterGenshinImpact.csproj
This commit is contained in:
辉鸭蛋
2026-02-17 19:44:44 +08:00
892 changed files with 67571 additions and 17250 deletions

View File

@@ -1,7 +1,10 @@
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:Boolean x:Key="/Default/UserDictionary/Words/=chyan/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=enkanomiya/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Kongying/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=mirrorchan/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=onslaugh/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=retcode/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=serenitea/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=steambird/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
<s:Boolean x:Key="/Default/UserDictionary/Words/=steambird/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Teyvat/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@@ -26,6 +26,8 @@
<bgivc:EnumToVisibilityConverter x:Key="EnumToVisibilityConverter" />
<bgivc:NullToVisibilityConverter x:Key="NullToVisibilityConverter" />
<bgivc:CultureInfoNameToKVPConverter x:Key="CultureInfoNameToKVPConverter" />
<bgivc:StringToColorConverter x:Key="StringToColorConverter" />
<bgivc:TrConverter x:Key="TrConverter" />
<Style BasedOn="{StaticResource DefaultTextBoxStyle}" TargetType="{x:Type TextBox}">
<Setter Property="behavior:ClipboardInterceptor.EnableSafeClipboard" Value="True" />
</Style>

View File

@@ -1,5 +1,6 @@
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Threading.Tasks;
using System.Windows;
@@ -22,6 +23,8 @@ using BetterGenshinImpact.View.Windows;
using BetterGenshinImpact.ViewModel;
using BetterGenshinImpact.ViewModel.Pages;
using BetterGenshinImpact.ViewModel.Pages.View;
using LazyCache;
using Microsoft.Extensions.Caching.Memory;
using BetterGenshinImpact.ViewModel.Windows;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -31,10 +34,15 @@ using Serilog.Events;
using Serilog.Sinks.RichTextBox.Abstraction;
using Wpf.Ui;
using Wpf.Ui.DependencyInjection;
using Wpf.Ui.Violeta.Appearance;
using Wpf.Ui.Violeta.Controls;
using Quartz;
using BetterGenshinImpact.Model.Gear.Triggers;
// Wine 平台适配
using BetterGenshinImpact.Platform.Wine;
using BetterGenshinImpact.Service.Tavern;
namespace BetterGenshinImpact;
public partial class App : Application
@@ -84,7 +92,13 @@ public partial class App : Application
}
Log.Logger = loggerConfiguration.CreateLogger();
services.AddLogging(c => c.AddSerilog());
services.AddSingleton<IMissingTranslationReporter, SupabaseMissingTranslationReporter>();
services.AddSingleton<ITranslationService, JsonTranslationService>();
services.AddLogging(logging =>
{
logging.ClearProviders();
logging.Services.AddSingleton<ILoggerProvider, TranslatingSerilogLoggerProvider>();
});
services.AddLocalization();
@@ -161,6 +175,12 @@ public partial class App : Application
services.AddSingleton<HutaoNamedPipe>();
services.AddSingleton<BgiOnnxFactory>();
services.AddSingleton<OcrFactory>();
services.AddMemoryCache();
services.AddSingleton<IAppCache, CachingService>();
services.AddSingleton<MemoryFileCache>();
services.AddSingleton<IMihoyoMapApiService, MihoyoMapApiService>();
services.AddSingleton<IKongyingTavernApiService, KongyingTavernApiService>();
services.AddSingleton<IMaskMapPointService, MaskMapPointService>();
services.AddSingleton<GearTaskStorageService>();
services.AddSingleton<GearTriggerStorageService>();
services.AddSingleton<ITriggerHistoryService, TriggerHistoryService>();
@@ -173,6 +193,8 @@ public partial class App : Application
// Configuration
//services.Configure<AppConfig>(context.Configuration.GetSection(nameof(AppConfig)));
I18N.Culture = new CultureInfo("zh-Hans"); // #1846
}
)
.Build();
@@ -214,6 +236,8 @@ public partial class App : Application
/// </summary>
protected override async void OnStartup(StartupEventArgs e)
{
// Wine 平台适配
WinePlatformAddon.ApplyApplicationConfig();
base.OnStartup(e);
try
@@ -353,4 +377,4 @@ public partial class App : Application
// log
GetLogger<App>().LogDebug(e, "UnHandle Exception");
}
}
}

View File

@@ -2,7 +2,7 @@
<PropertyGroup>
<AssemblyName>BetterGI</AssemblyName>
<Version>0.54.1-alpha.3</Version>
<Version>0.56.3-alpha.5</Version>
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.22621.0</TargetFramework>
@@ -44,9 +44,9 @@
<PackageReference Include="BetterGI.VCRuntime" Version="14.44.35208" />
<PackageReference Include="BetterGI.Assets.Map" Version="1.0.15" />
<PackageReference Include="BetterGI.Assets.Model" Version="1.0.17" />
<PackageReference Include="BetterGI.Assets.Other" Version="1.0.10" />
<PackageReference Include="BetterGI.Assets.Map" Version="1.0.17" />
<PackageReference Include="BetterGI.Assets.Model" Version="1.0.18" />
<PackageReference Include="BetterGI.Assets.Other" Version="1.0.12" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageReference Include="DeviceId" Version="6.9.0" />
@@ -54,9 +54,11 @@
<PackageReference Include="DeviceId.Windows.Wmi" Version="6.9.0" />
<PackageReference Include="Emoji.Wpf" Version="0.3.4" />
<PackageReference Include="LibGit2Sharp" Version="0.31.0" />
<PackageReference Include="LazyCache" Version="2.4.0" />
<PackageReference Include="MailKit" Version="4.14.0" />
<PackageReference Include="Meziantou.Framework.Win32.CredentialManager" Version="1.7.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.4" />
@@ -85,17 +87,19 @@
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.RichTextBoxEx.Wpf" Version="1.1.0.1" />
<!-- <PackageReference Include="supabase-csharp" Version="0.16.2" />-->
<PackageReference Include="System.Drawing.Common" Version="10.0.0" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.11" />
<PackageReference Include="System.Drawing.Common" Version="9.0.5" />
<PackageReference Include="System.IO.Hashing" Version="9.0.4" />
<PackageReference Include="TorchSharp" Version="0.105.0" />
<PackageReference Include="Vanara.PInvoke.NtDll" Version="4.1.3" />
<PackageReference Include="Vanara.PInvoke.SHCore" Version="4.1.3" />
<PackageReference Include="Vanara.PInvoke.User32" Version="4.1.3" />
<PackageReference Include="WPF-UI" Version="4.0.2" />
<PackageReference Include="WPF-UI.DependencyInjection" Version="4.0.2" />
<PackageReference Include="WPF-UI.Tray" Version="4.0.2" />
<PackageReference Include="WPF-UI.Violeta" Version="4.0.2.3" />
<PackageReference Include="XamlAnimatedGif" Version="2.3.1" />
<PackageReference Include="WPF-UI" Version="4.2.0" />
<PackageReference Include="WPF-UI.DependencyInjection" Version="4.2.0" />
<PackageReference Include="WPF-UI.Tray" Version="4.2.0" />
<PackageReference Include="WPF-UI.Violeta" Version="4.2.0.1" />
<PackageReference Include="gong-wpf-dragdrop" Version="3.2.1" />
<PackageReference Include="YamlDotNet" Version="16.3.0" />
<PackageReference Include="YoloSharp" Version="6.0.3" />
@@ -129,6 +133,9 @@
<None Update="GameTask\AutoFishing\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoLeyLineOutcrop\Assets\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\LogParse\Assets\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
@@ -195,11 +202,18 @@
<None Update="GameTask\Common\Element\Assets\1920x1080\in_domain.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoDomain\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="User\I18n\en.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="GameTask\OneDragon\" />
<Folder Include="GameTask\UseRedeemCode\Assets\1920x1080\" />
<Folder Include="Resources\" />
<Folder Include="Service\Notification\Builder\" />
<Folder Include="User\AutoPathing\" />
</ItemGroup>

View File

@@ -1,588 +0,0 @@
<Project>
<PropertyGroup>
<AssemblyName>BetterGI</AssemblyName>
<IntermediateOutputPath>obj\x64\Debug\</IntermediateOutputPath>
<BaseIntermediateOutputPath>obj\</BaseIntermediateOutputPath>
<MSBuildProjectExtensionsPath>D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\</MSBuildProjectExtensionsPath>
<_TargetAssemblyProjectName>BetterGenshinImpact</_TargetAssemblyProjectName>
<RootNamespace>BetterGenshinImpact</RootNamespace>
</PropertyGroup>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<Version>0.51.1-alpha.1</Version>
<IncludeSourceRevisionInInformationalVersion>false</IncludeSourceRevisionInInformationalVersion>
<OutputType>WinExe</OutputType>
<TargetFramework>net8.0-windows10.0.22621.0</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<UseWindowsForms>true</UseWindowsForms>
<LangVersion>12.0</LangVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ApplicationIcon>Resources\Images\logo.ico</ApplicationIcon>
<Platforms>x64</Platforms>
<DebugType>embedded</DebugType>
</PropertyGroup>
<!-- <ItemGroup>
<None Remove="Assets\Images\*.jpg" />
<None Remove="Assets\Images\*" />
<None Remove="Assets\Images\*.png" />
<None Remove="Assets\Images\*.ico" />
<None Remove="Assets\Fonts\*.ttf" />
<None Remove="Assets\Highlighting\*.xshd" />
<None Remove="Assets\Strings\*.html" />
<None Remove="Assets\Strings\*.md" />
<None Remove="Assets\Audios\*.mp3" />
<None Update="Assets\Config\*"/>
</ItemGroup>-->
<ItemGroup>
</ItemGroup>
<ItemGroup>
<PackageReference Include="AvalonEdit" Version="6.3.1.120" />
<PackageReference Include="BehaviourTree" Version="1.0.73" />
<PackageReference Include="BetterGI.VCRuntime" Version="14.44.35208" />
<PackageReference Include="BetterGI.Assets.Map" Version="1.0.12" />
<PackageReference Include="BetterGI.Assets.Model" Version="1.0.12" />
<PackageReference Include="BetterGI.Assets.Other" Version="1.0.9" />
<PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" />
<PackageReference Include="DeviceId" Version="6.9.0" />
<PackageReference Include="DeviceId.Windows" Version="6.9.0" />
<PackageReference Include="DeviceId.Windows.Wmi" Version="6.9.0" />
<PackageReference Include="Emoji.Wpf" Version="0.3.4" />
<PackageReference Include="LibGit2Sharp" Version="0.31.0" />
<PackageReference Include="Meziantou.Framework.Win32.CredentialManager" Version="1.7.4" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Localization" Version="9.0.4" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.4" />
<PackageReference Include="Microsoft.ML.OnnxRuntime.DirectML" Version="1.21.0" />
<!--排除掉cpu的runtime dll-->
<PackageReference Include="Microsoft.ML.OnnxRuntime" Version="1.21.0" IncludeAssets="none" />
<PackageReference Include="Microsoft.ML.OnnxRuntime.Managed" Version="1.21.0" />
<PackageReference Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" />
<PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2592.51" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Ookii.Dialogs.Wpf" Version="5.0.1" />
<PackageReference Include="OpenCvSharp4.WpfExtensions" Version="4.11.0.20250507" />
<PackageReference Include="OpenCvSharp4.Extensions" Version="4.11.0.20250507" />
<PackageReference Include="OpenCvSharp4.Windows" Version="4.11.0.20250507" />
<PackageReference Include="Microsoft.Xaml.Behaviors.Wpf" Version="1.1.122" />
<PackageReference Include="Microsoft.ClearScript.V8" Version="7.4.5" />
<PackageReference Include="Microsoft.ClearScript.V8.Native.win-x64" Version="7.4.5" />
<PackageReference Include="MouseKeyHook" Version="5.7.1" />
<PackageReference Include="PresentMonFps" Version="2.0.5" />
<PackageReference Include="Sdl.MultiSelectComboBox" Version="1.0.103" />
<PackageReference Include="Semver" Version="3.0.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="9.0.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.RichTextBoxEx.Wpf" Version="1.1.0.1" />
<PackageReference Include="System.Drawing.Common" Version="9.0.5" />
<PackageReference Include="System.IO.Hashing" Version="9.0.4" />
<PackageReference Include="TorchSharp" Version="0.105.0" />
<PackageReference Include="Vanara.PInvoke.NtDll" Version="4.1.3" />
<PackageReference Include="Vanara.PInvoke.SHCore" Version="4.1.3" />
<PackageReference Include="Vanara.PInvoke.User32" Version="4.1.3" />
<PackageReference Include="WPF-UI" Version="4.0.2" />
<PackageReference Include="WPF-UI.DependencyInjection" Version="4.0.2" />
<PackageReference Include="WPF-UI.Tray" Version="4.0.2" />
<PackageReference Include="WPF-UI.Violeta" Version="4.0.2.3" />
<PackageReference Include="gong-wpf-dragdrop" Version="3.2.1" />
<PackageReference Include="YamlDotNet" Version="16.3.0" />
<PackageReference Include="YoloSharp" Version="6.0.3" />
</ItemGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Debug'">
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Fischless.GameCapture\Fischless.GameCapture.csproj" />
<ProjectReference Include="..\Fischless.HotkeyCapture\Fischless.HotkeyCapture.csproj" />
<ProjectReference Include="..\Fischless.WindowsInput\Fischless.WindowsInput.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="Assets\Map\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\Model\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Assets\Config\**">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoFight\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoFight\Assets\combat_avatar.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoFishing\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\LogParse\Assets\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoGeniusInvokation\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoGeniusInvokation\Assets\tcg_character_card.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoPick\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoSkip\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoSkip\Assets\hangout.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoTrackPath\Assets\tp.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\Common\Element\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\Common\Element\Assets\Json\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoWood\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoMusicGame\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\GameLoading\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\QuickTeleport\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\QuickSereniteaPot\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\AutoEat\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\QuickBuy\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\UseRedeemCode\Assets\1920x1080\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="User\**">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\LogParse\Assets\log.css">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\LogParse\Assets\log.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\GameLoading\Assets\1920x1080\enter_game.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="GameTask\Common\Element\Assets\1920x1080\in_domain.png">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>
<Folder Include="GameTask\OneDragon\" />
<Folder Include="GameTask\UseRedeemCode\Assets\1920x1080\" />
<Folder Include="Resources\" />
<Folder Include="Service\Notification\Builder\" />
<Folder Include="User\AutoPathing\" />
</ItemGroup>
<ItemGroup>
</ItemGroup>
<ItemGroup>
<Compile Update="View\Windows\WelcomeDialog.xaml.cs">
<SubType>Code</SubType>
<DependentUpon>WelcomeDialog.xaml</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<_DeploymentManifestIconFile Remove="Resources\Images\logo.ico" />
</ItemGroup>
<ItemGroup>
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\Accessibility.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\behaviourtree\1.0.73\lib\netstandard1.0\BehaviourTree.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\bettergi.assets.map\1.0.12\lib\net8.0\BetterGI.Assets.Map.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\bettergi.assets.model\1.0.12\lib\net8.0\BetterGI.Assets.Model.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\bettergi.assets.other\1.0.9\lib\net8.0\BetterGI.Assets.Other.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\bettergi.vcruntime\14.44.35208\lib\net8.0\BetterGI.VCRuntime.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.clearscript.core\7.4.5\lib\net5.0\ClearScript.Core.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.clearscript.v8\7.4.5\lib\net5.0\ClearScript.V8.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.clearscript.v8.icudata\7.4.5\lib\netstandard1.0\ClearScript.V8.ICUData.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\clipper2\1.4.0\lib\netstandard2.0\Clipper2Lib.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\communitytoolkit.mvvm\8.2.2\lib\net6.0\CommunityToolkit.Mvvm.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\deviceid\6.9.0\lib\net8.0\DeviceId.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\deviceid.windows\6.9.0\lib\net8.0-windows10.0.17763\DeviceId.Windows.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\deviceid.windows.wmi\6.9.0\lib\net8.0\DeviceId.Windows.Wmi.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.diagnostics.tracing.traceevent\3.1.13\lib\netstandard2.0\Dia2Lib.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\emoji.wpf\0.3.4\lib\netcoreapp3.1\Emoji.Wpf.dll" />
<ReferencePath Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\Fischless.GameCapture\bin\x64\Debug\net8.0-windows10.0.22621.0\Fischless.GameCapture.dll" />
<ReferencePath Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\Fischless.HotkeyCapture\bin\x64\Debug\net8.0-windows10.0.22621.0\Fischless.HotkeyCapture.dll" />
<ReferencePath Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\Fischless.WindowsInput\bin\x64\Debug\netstandard2.0\Fischless.WindowsInput.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\mousekeyhook\5.7.1\lib\net7.0-windows7.0\Gma.System.MouseKeyHook.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\gong-wpf-dragdrop\3.2.1\lib\net6.0-windows7.0\GongSolutions.WPF.DragDrop.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\google.protobuf\3.21.9\lib\net5.0\Google.Protobuf.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\avalonedit\6.3.1.120\lib\net8.0-windows7.0\ICSharpCode.AvalonEdit.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sharpziplib\1.4.0\lib\net6.0\ICSharpCode.SharpZipLib.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\libgit2sharp\0.31.0\lib\net8.0\LibGit2Sharp.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\meziantou.framework.win32.credentialmanager\1.7.4\lib\net8.0\Meziantou.Framework.Win32.CredentialManager.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\Microsoft.CSharp.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.diagnostics.tracing.traceevent\3.1.13\lib\netstandard2.0\Microsoft.Diagnostics.FastSerialization.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.diagnostics.tracing.traceevent\3.1.13\lib\netstandard2.0\Microsoft.Diagnostics.Tracing.TraceEvent.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.configuration.abstractions\9.0.4\lib\net8.0\Microsoft.Extensions.Configuration.Abstractions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.configuration.binder\9.0.4\lib\net8.0\Microsoft.Extensions.Configuration.Binder.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.configuration.commandline\9.0.4\lib\net8.0\Microsoft.Extensions.Configuration.CommandLine.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.configuration\9.0.4\lib\net8.0\Microsoft.Extensions.Configuration.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.configuration.environmentvariables\9.0.4\lib\net8.0\Microsoft.Extensions.Configuration.EnvironmentVariables.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.configuration.fileextensions\9.0.4\lib\net8.0\Microsoft.Extensions.Configuration.FileExtensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.configuration.json\9.0.4\lib\net8.0\Microsoft.Extensions.Configuration.Json.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.configuration.usersecrets\9.0.4\lib\net8.0\Microsoft.Extensions.Configuration.UserSecrets.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.dependencyinjection.abstractions\9.0.4\lib\net8.0\Microsoft.Extensions.DependencyInjection.Abstractions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.dependencyinjection\9.0.4\lib\net8.0\Microsoft.Extensions.DependencyInjection.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.diagnostics.abstractions\9.0.4\lib\net8.0\Microsoft.Extensions.Diagnostics.Abstractions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.diagnostics\9.0.4\lib\net8.0\Microsoft.Extensions.Diagnostics.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.fileproviders.abstractions\9.0.4\lib\net8.0\Microsoft.Extensions.FileProviders.Abstractions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.fileproviders.physical\9.0.4\lib\net8.0\Microsoft.Extensions.FileProviders.Physical.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.filesystemglobbing\9.0.4\lib\net8.0\Microsoft.Extensions.FileSystemGlobbing.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.hosting.abstractions\9.0.4\lib\net8.0\Microsoft.Extensions.Hosting.Abstractions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.hosting\9.0.4\lib\net8.0\Microsoft.Extensions.Hosting.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.localization.abstractions\9.0.4\lib\netstandard2.0\Microsoft.Extensions.Localization.Abstractions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.localization\9.0.4\lib\netstandard2.0\Microsoft.Extensions.Localization.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.logging.abstractions\9.0.4\lib\net8.0\Microsoft.Extensions.Logging.Abstractions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.logging.configuration\9.0.4\lib\net8.0\Microsoft.Extensions.Logging.Configuration.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.logging.console\9.0.4\lib\net8.0\Microsoft.Extensions.Logging.Console.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.logging.debug\9.0.4\lib\net8.0\Microsoft.Extensions.Logging.Debug.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.logging\9.0.4\lib\net8.0\Microsoft.Extensions.Logging.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.logging.eventlog\9.0.4\lib\net8.0\Microsoft.Extensions.Logging.EventLog.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.logging.eventsource\9.0.4\lib\net8.0\Microsoft.Extensions.Logging.EventSource.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.options.configurationextensions\9.0.4\lib\net8.0\Microsoft.Extensions.Options.ConfigurationExtensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.options\9.0.4\lib\net8.0\Microsoft.Extensions.Options.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.extensions.primitives\9.0.4\lib\net8.0\Microsoft.Extensions.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.ml.onnxruntime.managed\1.21.0\lib\net8.0\Microsoft.ML.OnnxRuntime.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.toolkit.uwp.notifications\7.1.3\lib\net5.0-windows10.0.17763\Microsoft.Toolkit.Uwp.Notifications.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\Microsoft.VisualBasic.Core.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\Microsoft.VisualBasic.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\Microsoft.VisualBasic.Forms.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.web.webview2\1.0.2592.51\lib\netcoreapp3.0\Microsoft.Web.WebView2.Core.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.web.webview2\1.0.2592.51\lib\netcoreapp3.0\Microsoft.Web.WebView2.WinForms.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.web.webview2\1.0.2592.51\lib\netcoreapp3.0\Microsoft.Web.WebView2.Wpf.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\Microsoft.Win32.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\Microsoft.Win32.Registry.AccessControl.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\Microsoft.Win32.Registry.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.win32.systemevents\9.0.5\lib\net8.0\Microsoft.Win32.SystemEvents.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windows.sdk.net.ref\10.0.22621.54\lib\net8.0\Microsoft.Windows.SDK.NET.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.xaml.behaviors.wpf\1.1.122\lib\net6.0-windows7.0\Microsoft.Xaml.Behaviors.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\mscorlib.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\netstandard.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\newtonsoft.json\13.0.3\lib\net6.0\Newtonsoft.Json.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\ookii.dialogs.wpf\5.0.1\lib\net6.0-windows7.0\Ookii.Dialogs.Wpf.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\opencvsharp4\4.11.0.20250507\lib\net6.0\OpenCvSharp.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\opencvsharp4.extensions\4.11.0.20250507\lib\net6.0\OpenCvSharp.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\opencvsharp4.wpfextensions\4.11.0.20250507\lib\net6.0\OpenCvSharp.WpfExtensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationCore.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationFramework.Aero.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationFramework.Aero2.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationFramework.AeroLite.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationFramework.Classic.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationFramework.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationFramework.Luna.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationFramework.Royale.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\PresentationUI.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\presentmonfps\2.0.5\lib\netstandard2.0\PresentMonFps.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\ReachFramework.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sdl.multiselectcombobox\1.0.103\lib\net6.0-windows7.0\Sdl.MultiSelectComboBox.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\semver\3.0.0\lib\net5.0\Semver.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\serilog\4.2.0\lib\net8.0\Serilog.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\serilog.extensions.logging\9.0.1\lib\net8.0\Serilog.Extensions.Logging.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\serilog.sinks.console\6.0.0\lib\net8.0\Serilog.Sinks.Console.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\serilog.sinks.file\6.0.0\lib\net8.0\Serilog.Sinks.File.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\serilog.sinks.richtextboxex.wpf\1.1.0.1\lib\net8.0-windows7.0\Serilog.Sinks.RichTextBoxEx.Wpf.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sharpdx.d3dcompiler\4.2.0\lib\netstandard1.1\SharpDX.D3DCompiler.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sharpdx.direct3d11\4.2.0\lib\netstandard1.1\SharpDX.Direct3D11.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sharpdx.directinput\4.2.0\lib\netstandard1.3\SharpDX.DirectInput.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sharpdx\4.2.0\lib\netstandard1.1\SharpDX.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sharpdx.dxgi\4.2.0\lib\netstandard1.1\SharpDX.DXGI.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sixlabors.fonts\2.0.8\lib\net6.0\SixLabors.Fonts.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sixlabors.imagesharp\3.1.7\lib\net6.0\SixLabors.ImageSharp.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\sixlabors.imagesharp.drawing\2.1.5\lib\net6.0\SixLabors.ImageSharp.Drawing.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\skiasharp\2.88.6\lib\net6.0\SkiaSharp.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\stfu\0.1.1\lib\netcoreapp3.1\Stfu.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.AppContext.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Buffers.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.codedom\9.0.3\lib\net8.0\System.CodeDom.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Collections.Concurrent.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Collections.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Collections.Immutable.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Collections.NonGeneric.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Collections.Specialized.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ComponentModel.Annotations.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ComponentModel.DataAnnotations.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ComponentModel.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ComponentModel.EventBasedAsync.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ComponentModel.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ComponentModel.TypeConverter.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Configuration.ConfigurationManager.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Configuration.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Console.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Core.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Data.Common.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Data.DataSetExtensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Data.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Design.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.Contracts.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.Debug.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.diagnostics.diagnosticsource\9.0.4\lib\net8.0\System.Diagnostics.DiagnosticSource.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.diagnostics.eventlog\9.0.4\lib\net8.0\System.Diagnostics.EventLog.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.FileVersionInfo.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Diagnostics.PerformanceCounter.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.Process.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.StackTrace.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.TextWriterTraceListener.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.Tools.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.TraceSource.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Diagnostics.Tracing.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.DirectoryServices.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.drawing.common\9.0.5\lib\net8.0\System.Drawing.Common.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Drawing.Design.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Drawing.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Drawing.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Dynamic.Runtime.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Formats.Asn1.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Formats.Tar.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Globalization.Calendars.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Globalization.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Globalization.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.Compression.Brotli.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.Compression.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.Compression.FileSystem.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.Compression.ZipFile.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.FileSystem.AccessControl.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.FileSystem.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.FileSystem.DriveInfo.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.FileSystem.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.FileSystem.Watcher.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.io.hashing\9.0.4\lib\net8.0\System.IO.Hashing.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.IsolatedStorage.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.MemoryMappedFiles.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.IO.Packaging.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.io.pipelines\9.0.4\lib\net8.0\System.IO.Pipelines.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.Pipes.AccessControl.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.Pipes.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.IO.UnmanagedMemoryStream.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Linq.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Linq.Expressions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Linq.Parallel.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Linq.Queryable.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.management\9.0.3\lib\net8.0\System.Management.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Memory.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Http.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Http.Json.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.HttpListener.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Mail.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.NameResolution.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.NetworkInformation.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Ping.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Quic.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Requests.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Security.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.ServicePoint.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.Sockets.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.WebClient.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.WebHeaderCollection.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.WebProxy.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.WebSockets.Client.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Net.WebSockets.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Numerics.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.numerics.tensors\9.0.0\lib\net8.0\System.Numerics.Tensors.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Numerics.Vectors.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ObjectModel.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Printing.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.drawing.common\9.0.5\lib\net8.0\System.Private.Windows.Core.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.DispatchProxy.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.Emit.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.Emit.ILGeneration.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.Emit.Lightweight.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.Metadata.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Reflection.TypeExtensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Resources.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Resources.Reader.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Resources.ResourceManager.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Resources.Writer.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.CompilerServices.Unsafe.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.CompilerServices.VisualC.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Handles.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.InteropServices.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.InteropServices.JavaScript.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.InteropServices.RuntimeInformation.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Intrinsics.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Loader.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Numerics.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Serialization.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Serialization.Formatters.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Serialization.Json.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Serialization.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Runtime.Serialization.Xml.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.AccessControl.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Claims.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.Algorithms.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.Cng.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.Csp.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.Encoding.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.OpenSsl.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.Pkcs.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.ProtectedData.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.X509Certificates.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Security.Cryptography.Xml.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Security.Permissions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Principal.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.Principal.Windows.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Security.SecureString.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ServiceModel.Web.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ServiceProcess.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Text.Encoding.CodePages.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Text.Encoding.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Text.Encoding.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.text.encodings.web\9.0.4\lib\net8.0\System.Text.Encodings.Web.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\system.text.json\9.0.4\lib\net8.0\System.Text.Json.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Text.RegularExpressions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Threading.AccessControl.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.Channels.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.Overlapped.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.Tasks.Dataflow.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.Tasks.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.Tasks.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.Tasks.Parallel.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.Thread.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.ThreadPool.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Threading.Timer.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Transactions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Transactions.Local.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.ValueTuple.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Web.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Web.HttpUtility.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Windows.Controls.Ribbon.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Windows.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Windows.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Windows.Forms.Design.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Windows.Forms.Design.Editors.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Windows.Forms.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Windows.Forms.Primitives.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Windows.Input.Manipulations.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Windows.Presentation.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\System.Xaml.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.Linq.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.ReaderWriter.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.Serialization.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.XDocument.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.XmlDocument.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.XmlSerializer.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.XPath.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\ref\net8.0\System.Xml.XPath.XDocument.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\torchsharp\0.105.0\lib\net6.0\TorchSharp.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.diagnostics.tracing.traceevent\3.1.13\lib\netstandard2.0\TraceReloggerLib.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\emoji.wpf\0.3.4\lib\netcoreapp3.1\Typography.GlyphLayout.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\emoji.wpf\0.3.4\lib\netcoreapp3.1\Typography.OpenFont.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\UIAutomationClient.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\UIAutomationClientSideProviders.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\UIAutomationProvider.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\UIAutomationTypes.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.core\4.1.3\lib\net8.0-windows7.0\Vanara.Core.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.pinvoke.dwmapi\4.1.3\lib\net8.0-windows7.0\Vanara.PInvoke.DwmApi.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.pinvoke.gdi32\4.1.3\lib\net8.0-windows7.0\Vanara.PInvoke.Gdi32.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.pinvoke.kernel32\4.1.3\lib\net8.0-windows7.0\Vanara.PInvoke.Kernel32.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.pinvoke.ntdll\4.1.3\lib\net8.0-windows7.0\Vanara.PInvoke.NtDll.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.pinvoke.shared\4.1.3\lib\net8.0-windows7.0\Vanara.PInvoke.Shared.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.pinvoke.shcore\4.1.3\lib\net8.0-windows7.0\Vanara.PInvoke.SHCore.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.pinvoke.user32\4.1.3\lib\net8.0-windows7.0\Vanara.PInvoke.User32.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\vanara.windows.extensions\4.1.3\lib\net8.0-windows7.0\Vanara.Windows.Extensions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\WindowsBase.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\ref\net8.0\WindowsFormsIntegration.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\microsoft.windows.sdk.net.ref\10.0.22621.54\lib\net8.0\WinRT.Runtime.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\wpf-ui.abstractions\4.0.2\lib\net8.0\Wpf.Ui.Abstractions.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\wpf-ui.dependencyinjection\4.0.2\lib\net8.0\Wpf.Ui.DependencyInjection.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\wpf-ui\4.0.2\lib\net8.0-windows7.0\Wpf.Ui.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\wpf-ui.tray\4.0.2\lib\net8.0-windows7.0\Wpf.Ui.Tray.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\wpf-ui.violeta\4.0.2.3\lib\net8.0-windows7.0\Wpf.Ui.Violeta.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\yamldotnet\16.3.0\lib\net8.0\YamlDotNet.dll" />
<ReferencePath Include="E:\HuiSomething\NugetPackages\yolosharp\6.0.3\lib\net8.0\YoloSharp.dll" />
</ItemGroup>
<ItemGroup>
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\CaptureTestWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\MainWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\MaskWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\CommonSettingsPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\HomePage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\HotkeyPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\JsListPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\KeyBindingsSettingsPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\KeyMouseRecordPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\MacroSettingsPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\MapPathingPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\NotificationSettingsPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragonFlowPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\CraftPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\DailyCommissionPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\DailyRewardPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\DomainPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\ForgingPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\LeyLineBlossomPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\MailPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\SereniteaPotPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\OneDragon\TcgPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\ScriptControlPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\TaskSettingsPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\TriggerSettingsPage.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\View\HardwareAccelerationView.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\View\PathingConfigView.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Pages\View\ScriptGroupConfigView.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\PickerWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\AboutWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\CheckUpdateWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\Editable\ScriptGroupProjectEditor.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\JsonMonoDialog.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\KeyBindingsWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\MapPathingDevWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\MapViewer.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\OcrDialog.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\PromptDialog.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\ScriptRepoWindow.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\View\Windows\WelcomeDialog.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\App.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\BetterGI_Content.g.cs" />
<Compile Include="D:\HuiPrograming\Projects\CSharp\MiHoYo\BetterGenshinImpact\BetterGenshinImpact\obj\x64\Debug\net8.0-windows10.0.22621.0\GeneratedInternalTypeHelper.g.cs" />
</ItemGroup>
<ItemGroup>
<Analyzer Include="C:\Users\huiyadanli\.dotnet\sdk\9.0.100\Sdks\Microsoft.NET.Sdk\targets\..\analyzers\Microsoft.CodeAnalysis.CSharp.NetAnalyzers.dll" />
<Analyzer Include="C:\Users\huiyadanli\.dotnet\sdk\9.0.100\Sdks\Microsoft.NET.Sdk\targets\..\analyzers\Microsoft.CodeAnalysis.NetAnalyzers.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\communitytoolkit.mvvm\8.2.2\analyzers\dotnet\roslyn4.3\cs\CommunityToolkit.Mvvm.CodeFixers.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\communitytoolkit.mvvm\8.2.2\analyzers\dotnet\roslyn4.3\cs\CommunityToolkit.Mvvm.SourceGenerators.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.extensions.logging.abstractions\9.0.4\analyzers\dotnet\roslyn4.4\cs\Microsoft.Extensions.Logging.Generators.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.extensions.options\9.0.4\analyzers\dotnet\roslyn4.4\cs\Microsoft.Extensions.Options.SourceGeneration.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\system.text.json\9.0.4\analyzers\dotnet\roslyn4.4\cs\System.Text.Json.SourceGeneration.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\analyzers/dotnet/cs/Microsoft.Interop.ComInterfaceGenerator.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\analyzers/dotnet/cs/Microsoft.Interop.JavaScript.JSImportGenerator.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\analyzers/dotnet/cs/Microsoft.Interop.LibraryImportGenerator.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\analyzers/dotnet/cs/Microsoft.Interop.SourceGeneration.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.netcore.app.ref\8.0.11\analyzers/dotnet/cs/System.Text.RegularExpressions.Generator.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\analyzers/dotnet/System.Windows.Forms.Analyzers.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.windowsdesktop.app.ref\8.0.11\analyzers/dotnet/cs/System.Windows.Forms.Analyzers.CSharp.dll" />
<Analyzer Include="E:\HuiSomething\NugetPackages\microsoft.windows.sdk.net.ref\10.0.22621.54\analyzers/dotnet/cs/WinRT.SourceGenerator.dll" />
</ItemGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>

View File

@@ -1,4 +1,4 @@
using BetterGenshinImpact.GameTask;
using BetterGenshinImpact.GameTask;
using BetterGenshinImpact.GameTask.AutoCook;
using BetterGenshinImpact.GameTask.AutoDomain;
using BetterGenshinImpact.GameTask.AutoFight;
@@ -22,6 +22,9 @@ using BetterGenshinImpact.GameTask.AutoArtifactSalvage;
using BetterGenshinImpact.GameTask.AutoStygianOnslaught;
using BetterGenshinImpact.GameTask.GetGridIcons;
using BetterGenshinImpact.GameTask.AutoEat;
using BetterGenshinImpact.GameTask.AutoLeyLineOutcrop;
using BetterGenshinImpact.GameTask.MapMask;
using BetterGenshinImpact.GameTask.SkillCd;
using BetterGenshinImpact.GameTask.UseRedeemCode;
namespace BetterGenshinImpact.Core.Config;
@@ -171,7 +174,22 @@ public partial class AllConfig : ObservableObject
/// 自动吃药配置
/// </summary>
public AutoEatConfig AutoEatConfig { get; set; } = new();
/// <summary>
/// 自动地脉花配置
/// </summary>
public AutoLeyLineOutcropConfig AutoLeyLineOutcropConfig { get; set; } = new();
/// <summary>
/// 地图遮罩
/// </summary>
public MapMaskConfig MapMaskConfig { get; set; } = new();
/// <summary>
/// 技能 CD 提示
/// </summary>
public SkillCdConfig SkillCdConfig { get; set; } = new();
/// <summary>
/// 自动使用
/// </summary>
@@ -261,12 +279,15 @@ public partial class AllConfig : ObservableObject
AutoArtifactSalvageConfig.PropertyChanged += OnAnyPropertyChanged;
AutoRedeemCodeConfig.PropertyChanged += OnAnyPropertyChanged;
AutoEatConfig.PropertyChanged += OnAnyPropertyChanged;
AutoLeyLineOutcropConfig.PropertyChanged += OnAnyPropertyChanged;
MapMaskConfig.PropertyChanged += OnAnyPropertyChanged;
AutoMusicGameConfig.PropertyChanged += OnAnyPropertyChanged;
TpConfig.PropertyChanged += OnAnyPropertyChanged;
ScriptConfig.PropertyChanged += OnAnyPropertyChanged;
PathingConditionConfig.PropertyChanged += OnAnyPropertyChanged;
DevConfig.PropertyChanged += OnAnyPropertyChanged;
HardwareAccelerationConfig.PropertyChanged += OnAnyPropertyChanged;
SkillCdConfig.PropertyChanged += OnAnyPropertyChanged;
}
public void OnAnyPropertyChanged(object? sender, EventArgs args)
@@ -279,4 +300,4 @@ public partial class AllConfig : ObservableObject
{
NotificationService.Instance().RefreshNotifiers();
}
}
}

View File

@@ -1,4 +1,4 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.ComponentModel;
using System;
namespace BetterGenshinImpact.Core.Config;
@@ -44,4 +44,7 @@ public partial class GenshinStartConfig : ObservableObject
/// </summary>
[ObservableProperty]
private bool _recordGameTimeEnabled = false;
[ObservableProperty]
private bool _startGameWithCmd = false;
}

View File

@@ -1,4 +1,4 @@
using BetterGenshinImpact.Model;
using BetterGenshinImpact.Model;
using CommunityToolkit.Mvvm.ComponentModel;
using System;
@@ -100,6 +100,13 @@ public partial class HotKeyConfig : ObservableObject
[ObservableProperty]
private string _quickTeleportTickHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
// 技能CD提示开关
[ObservableProperty]
private string _skillCdEnabledHotkey = "";
[ObservableProperty]
private string _skillCdEnabledHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
// 截图
[ObservableProperty]
@@ -237,4 +244,11 @@ public partial class HotKeyConfig : ObservableObject
[ObservableProperty]
private string _onedragonHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
// 地图遮罩开关
[ObservableProperty]
private string _mapMaskEnabledHotkey = "";
[ObservableProperty]
private string _mapMaskEnabledHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
}

View File

@@ -1,4 +1,4 @@
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.ComponentModel;
using OpenCvSharp;
using System;
@@ -75,4 +75,31 @@ public partial class MaskWindowConfig : ObservableObject
/// </summary>
[ObservableProperty]
private double _textOpacity = 1.0;
[ObservableProperty]
private bool _overlayLayoutEditEnabled = false;
[ObservableProperty]
private double _logTextBoxLeftRatio = 20.0 / 1920;
[ObservableProperty]
private double _logTextBoxTopRatio = 822.0 / 1080;
[ObservableProperty]
private double _logTextBoxWidthRatio = 480.0 / 1920;
[ObservableProperty]
private double _logTextBoxHeightRatio = 188.0 / 1080;
[ObservableProperty]
private double _statusListLeftRatio = 20.0 / 1920;
[ObservableProperty]
private double _statusListTopRatio = 790.0 / 1080;
[ObservableProperty]
private double _statusListWidthRatio = 480.0 / 1920;
[ObservableProperty]
private double _statusListHeightRatio = 24.0 / 1080;
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using BetterGenshinImpact.GameTask;
using BetterGenshinImpact.GameTask.AutoLeyLineOutcrop;
using BetterGenshinImpact.Helpers;
using CommunityToolkit.Mvvm.ComponentModel;
@@ -61,6 +62,87 @@ public partial class OneDragonFlowConfig : ObservableObject
[ObservableProperty]
private List<string> _secretTreasureObjects = new();
// 地脉花一条龙模式(跳过部分准备流程)
[ObservableProperty]
private bool _leyLineOneDragonMode = false;
// 地脉花运行日期设置
[ObservableProperty]
private bool _leyLineRunMonday = true;
[ObservableProperty]
private bool _leyLineRunTuesday = true;
[ObservableProperty]
private bool _leyLineRunWednesday = true;
[ObservableProperty]
private bool _leyLineRunThursday = true;
[ObservableProperty]
private bool _leyLineRunFriday = true;
[ObservableProperty]
private bool _leyLineRunSaturday = true;
[ObservableProperty]
private bool _leyLineRunSunday = true;
// 地脉花每日类型与国家配置(为空则使用独立任务配置)
[ObservableProperty]
private string _leyLineMondayType = string.Empty;
[ObservableProperty]
private string _leyLineMondayCountry = string.Empty;
[ObservableProperty]
private string _leyLineTuesdayType = string.Empty;
[ObservableProperty]
private string _leyLineTuesdayCountry = string.Empty;
[ObservableProperty]
private string _leyLineWednesdayType = string.Empty;
[ObservableProperty]
private string _leyLineWednesdayCountry = string.Empty;
[ObservableProperty]
private string _leyLineThursdayType = string.Empty;
[ObservableProperty]
private string _leyLineThursdayCountry = string.Empty;
[ObservableProperty]
private string _leyLineFridayType = string.Empty;
[ObservableProperty]
private string _leyLineFridayCountry = string.Empty;
[ObservableProperty]
private string _leyLineSaturdayType = string.Empty;
[ObservableProperty]
private string _leyLineSaturdayCountry = string.Empty;
[ObservableProperty]
private string _leyLineSundayType = string.Empty;
[ObservableProperty]
private string _leyLineSundayCountry = string.Empty;
// 地脉花刷取次数0 表示使用独立任务配置)
[ObservableProperty]
private int _leyLineRunCount = 0;
// 地脉花树脂耗尽模式
[ObservableProperty]
private bool _leyLineResinExhaustionMode = false;
// 地脉花刷取次数取小值(仅耗尽模式生效)
[ObservableProperty]
private bool _leyLineOpenModeCountMin = false;
#region
//周一
@@ -142,5 +224,62 @@ public partial class OneDragonFlowConfig : ObservableObject
}
}
public bool ShouldRunLeyLineToday()
{
if (!LeyLineRunMonday
&& !LeyLineRunTuesday
&& !LeyLineRunWednesday
&& !LeyLineRunThursday
&& !LeyLineRunFriday
&& !LeyLineRunSaturday
&& !LeyLineRunSunday)
{
return true;
}
var serverTime = ServerTimeHelper.GetServerTimeNow();
var dayOfWeek = (serverTime.Hour >= 4 ? serverTime : serverTime.AddDays(-1)).DayOfWeek;
return dayOfWeek switch
{
DayOfWeek.Monday => LeyLineRunMonday,
DayOfWeek.Tuesday => LeyLineRunTuesday,
DayOfWeek.Wednesday => LeyLineRunWednesday,
DayOfWeek.Thursday => LeyLineRunThursday,
DayOfWeek.Friday => LeyLineRunFriday,
DayOfWeek.Saturday => LeyLineRunSaturday,
DayOfWeek.Sunday => LeyLineRunSunday,
_ => true
};
}
public (string type, string country) GetLeyLineConfigForToday(AutoLeyLineOutcropConfig fallback)
{
var serverTime = ServerTimeHelper.GetServerTimeNow();
var dayOfWeek = (serverTime.Hour >= 4 ? serverTime : serverTime.AddDays(-1)).DayOfWeek;
var (type, country) = dayOfWeek switch
{
DayOfWeek.Monday => (LeyLineMondayType, LeyLineMondayCountry),
DayOfWeek.Tuesday => (LeyLineTuesdayType, LeyLineTuesdayCountry),
DayOfWeek.Wednesday => (LeyLineWednesdayType, LeyLineWednesdayCountry),
DayOfWeek.Thursday => (LeyLineThursdayType, LeyLineThursdayCountry),
DayOfWeek.Friday => (LeyLineFridayType, LeyLineFridayCountry),
DayOfWeek.Saturday => (LeyLineSaturdayType, LeyLineSaturdayCountry),
DayOfWeek.Sunday => (LeyLineSundayType, LeyLineSundayCountry),
_ => (string.Empty, string.Empty)
};
if (string.IsNullOrWhiteSpace(type))
{
type = fallback.LeyLineOutcropType;
}
if (string.IsNullOrWhiteSpace(country))
{
country = fallback.Country;
}
return (type, country);
}
#endregion
}
}

View File

@@ -1,4 +1,4 @@
using System;
using System;
using BetterGenshinImpact.Core.Recognition;
using BetterGenshinImpact.Model;
using CommunityToolkit.Mvvm.ComponentModel;
@@ -121,4 +121,4 @@ public partial class OtherConfig : ObservableObject
/// </summary>
[ObservableProperty]
private string _uiCultureInfoName = "zh-Hans";
}
}

View File

@@ -47,4 +47,7 @@ public partial class ScriptConfig : ObservableObject
// 仓库页面是否最大化
[ObservableProperty] private WindowState _webviewState = WindowState.Normal;
// 仓库新手教程是否已阅读
[ObservableProperty] private bool _guideStatus = false;
}

View File

@@ -11,10 +11,13 @@ using System.Windows.Forms;
using Vanara.PInvoke;
using Timer = System.Timers.Timer;
// Wine 平台适配
using BetterGenshinImpact.Platform.Wine;
namespace BetterGenshinImpact.Core.Monitor;
public class MouseKeyMonitor
public partial class MouseKeyMonitor
{
/// <summary>
/// 长按F变F连发
/// </summary>
@@ -68,12 +71,15 @@ public class MouseKeyMonitor
_hWnd = gameHandle;
// Note: for the application hook, use the Hook.AppEvents() instead
GlobalHook.KeyDown += GlobalHookKeyDown;
GlobalHook.KeyUp += GlobalHookKeyUp;
GlobalHook.MouseDownExt += GlobalHookMouseDownExt;
GlobalHook.MouseUpExt += GlobalHookMouseUpExt;
GlobalHook.MouseMoveExt += GlobalHookMouseMoveExt;
GlobalHook.MouseWheelExt += GlobalHookMouseWheelExt;
if (!WinePlatformAddon.IsRunningOnWine) {
GlobalHook.KeyDown += GlobalHookKeyDown;
GlobalHook.KeyUp += GlobalHookKeyUp;
GlobalHook.MouseDownExt += GlobalHookMouseDownExt;
GlobalHook.MouseUpExt += GlobalHookMouseUpExt;
GlobalHook.MouseMoveExt += GlobalHookMouseMoveExt;
GlobalHook.MouseWheelExt += GlobalHookMouseWheelExt;
}
TrySubscribeWinePolling();
//_globalHook.KeyPress += GlobalHookKeyPress;
_pickUpKey = TaskContext.Instance().Config.KeyBindingsConfig.PickUpOrInteract.ToWinFormKeys();
@@ -208,7 +214,7 @@ public class MouseKeyMonitor
public void Unsubscribe()
{
if (_globalHook != null)
if (_globalHook != null && !WinePlatformAddon.IsRunningOnWine)
{
_globalHook.KeyDown -= GlobalHookKeyDown;
_globalHook.KeyUp -= GlobalHookKeyUp;
@@ -220,5 +226,8 @@ public class MouseKeyMonitor
_globalHook.Dispose();
_globalHook = null;
}
if (WinePlatformAddon.IsRunningOnWine){
DisposeWineAddon();
}
}
}

View File

@@ -95,21 +95,33 @@ public class Rec(
// .AsParallel()
.Select(src =>
{
using var channel3 = src.Channels() switch
Mat? channel3 = default;
try
{
4 => src.CvtColor(ColorConversionCodes.BGRA2BGR),
1 => src.CvtColor(ColorConversionCodes.GRAY2BGR),
3 => src,
var x => throw new Exception($"Unexpect src channel: {x}, allow: (1/3/4)")
};
var result = OcrUtils.ResizeNormImg(channel3, new OcrShape(3, maxWidth, modelHeight),
out var owner);
lock (owners)
{
owners.Add(owner);
}
channel3 = src.Channels() switch
{
4 => src.CvtColor(ColorConversionCodes.BGRA2BGR),
1 => src.CvtColor(ColorConversionCodes.GRAY2BGR),
3 => src,
var x => throw new Exception($"Unexpect src channel: {x}, allow: (1/3/4)")
};
var result = OcrUtils.ResizeNormImg(channel3, new OcrShape(3, maxWidth, modelHeight),
out var owner);
lock (owners)
{
owners.Add(owner);
}
return result;
return result;
}
finally
{
// Only dispose Mats created in this scope
if (channel3 != null && !ReferenceEquals(channel3, src))
{
channel3.Dispose();
}
}
})
.Select(inputTensor =>
{

View File

@@ -1,4 +1,4 @@
using BetterGenshinImpact.Core.Recognition.OpenCv.Model;
using BetterGenshinImpact.Core.Recognition.OpenCv.Model;
using OpenCvSharp;
using System;
using System.Collections.Generic;
@@ -81,6 +81,79 @@ public class KeyPointFeatureBlockHelper
return (cellRow, cellCol);
}
public static (int RowStart, int RowEnd, int ColStart, int ColEnd) GetCellRange(Size originalImage, int rows, int cols, Rect rect)
{
int cellWidth = originalImage.Width / cols;
int cellHeight = originalImage.Height / rows;
var rowStart = (int)(rect.Y / cellHeight);
var rowEnd = (int)((rect.Y + rect.Height) / cellHeight);
var colStart = (int)(rect.X / cellWidth);
var colEnd = (int)((rect.X + rect.Width) / cellWidth);
rowStart = Math.Max(0, Math.Min(rowStart, rows - 1));
rowEnd = Math.Max(0, Math.Min(rowEnd, rows - 1));
colStart = Math.Max(0, Math.Min(colStart, cols - 1));
colEnd = Math.Max(0, Math.Min(colEnd, cols - 1));
if (rowEnd < rowStart)
{
rowEnd = rowStart;
}
if (colEnd < colStart)
{
colEnd = colStart;
}
return (rowStart, rowEnd, colStart, colEnd);
}
public static KeyPointFeatureBlock MergeFeaturesInRange(KeyPointFeatureBlock[][] splitKeyPoints, Mat matches, int rowStart, int rowEnd, int colStart, int colEnd)
{
var rows = splitKeyPoints.Length;
if (rows == 0)
{
return new KeyPointFeatureBlock();
}
var cols = splitKeyPoints[0].Length;
rowStart = Math.Max(0, Math.Min(rowStart, rows - 1));
rowEnd = Math.Max(0, Math.Min(rowEnd, rows - 1));
colStart = Math.Max(0, Math.Min(colStart, cols - 1));
colEnd = Math.Max(0, Math.Min(colEnd, cols - 1));
var matchesCols = matches.Cols;
var neighboringKeyPoints = new List<KeyPoint>();
var neighboringKeyPointIndices = new List<int>();
for (int i = rowStart; i <= rowEnd; i++)
{
for (int j = colStart; j <= colEnd; j++)
{
if (splitKeyPoints[i][j] != null)
{
neighboringKeyPoints.AddRange(splitKeyPoints[i][j].KeyPointList);
neighboringKeyPointIndices.AddRange(splitKeyPoints[i][j].KeyPointIndexList);
}
}
}
var mergedKeyPointBlock = new KeyPointFeatureBlock
{
MergedCenterCellCol = (colStart + colEnd) / 2,
MergedCenterCellRow = (rowStart + rowEnd) / 2,
KeyPointList = neighboringKeyPoints,
KeyPointIndexList = neighboringKeyPointIndices
};
mergedKeyPointBlock.Descriptor = new Mat(mergedKeyPointBlock.KeyPointIndexList.Count, matchesCols, MatType.CV_32FC1);
InitBlockMat(mergedKeyPointBlock.KeyPointIndexList, mergedKeyPointBlock.Descriptor, matches);
return mergedKeyPointBlock;
}
public static KeyPointFeatureBlock MergeNeighboringFeatures(KeyPointFeatureBlock[][] splitKeyPoints, Mat matches, int cellRow, int cellCol)
{
var matchesCols = matches.Cols; // SURF 64 SIFT 128

View File

@@ -0,0 +1,104 @@
using System;
using System.Diagnostics;
using OpenCvSharp;
namespace BetterGenshinImpact.Core.Recognition.OpenCv;
public class TemplateMatchStabilityDetector : IDisposable
{
private Mat previousFrame;
private readonly double similarityThreshold = 0.98; // 相似度阈值0-1
private readonly int stableFrameCount = 2;
private int currentStableCount = 0;
private double lastSimilarity = 0;
public bool IsStable(Mat currentFrame)
{
Mat processed = PreprocessFrame(currentFrame);
if (previousFrame == null)
{
previousFrame = processed;
return false;
}
// 使用归一化相关系数进行匹配
double similarity = ComputeSimilarity(previousFrame, processed);
lastSimilarity = similarity;
Debug.WriteLine("Similarity: " + similarity);
if (similarity >= similarityThreshold)
{
currentStableCount++;
if (currentStableCount >= stableFrameCount)
{
previousFrame?.Dispose();
previousFrame = processed;
return true;
}
else
{
processed.Dispose();
}
}
else
{
currentStableCount = 0;
previousFrame?.Dispose();
previousFrame = processed;
}
return false;
}
private Mat PreprocessFrame(Mat frame)
{
Mat small = new Mat();
// 降采样加速
Cv2.Resize(frame, small, new Size(320, 180), 0, 0, InterpolationFlags.Area);
return small;
}
private double ComputeSimilarity(Mat template, Mat image)
{
// 确保两帧大小相同
if (template.Size() != image.Size())
{
return 0;
}
// 使用归一化相关系数匹配
Mat result = new Mat();
Cv2.MatchTemplate(image, template, result, TemplateMatchModes.CCoeffNormed);
// 获取匹配结果(只有一个值)
double minVal, maxVal;
Point minLoc, maxLoc;
Cv2.MinMaxLoc(result, out minVal, out maxVal, out minLoc, out maxLoc);
result.Dispose();
return maxVal; // 返回相关系数(-1 到 11 表示完全相同)
}
public double GetLastSimilarity()
{
return lastSimilarity;
}
public void Reset()
{
currentStableCount = 0;
previousFrame?.Dispose();
previousFrame = null;
}
public void Dispose()
{
previousFrame?.Dispose();
previousFrame = null;
GC.SuppressFinalize(this);
}
}

View File

@@ -182,7 +182,7 @@ public class Genshin
/// 获取当前在大地图上的位置坐标
/// </summary>
/// <returns>包含X和Y坐标的Point2f结构体</returns>
public Point2f GetPositionFromBigMap()
public Point2f? GetPositionFromBigMap()
{
TpTask tpTask = new TpTask(CancellationContext.Instance.Cts.Token);
return tpTask.GetPositionFromBigMap(MapTypes.Teyvat.ToString());
@@ -193,7 +193,7 @@ public class Genshin
/// </summary>
/// <param name="mapName">大地图名称</param>
/// <returns>包含X和Y坐标的Point2f结构体</returns>
public Point2f GetPositionFromBigMap(string mapName)
public Point2f? GetPositionFromBigMap(string mapName)
{
TpTask tpTask = new TpTask(CancellationContext.Instance.Cts.Token);
return tpTask.GetPositionFromBigMap(mapName);
@@ -203,7 +203,7 @@ public class Genshin
/// 获取当前在小地图上的位置坐标
/// </summary>
/// <returns>包含X和Y坐标的Point2f结构体</returns>
public Point2f GetPositionFromMap()
public Point2f? GetPositionFromMap()
{
return GetPositionFromMap(MapTypes.Teyvat.ToString());
}
@@ -220,7 +220,7 @@ public class Genshin
/// <param name="mapName">大地图名称</param>
/// <param name="cacheTimeMs">缓存时间单位毫秒默认900ms</param>
/// <returns>包含X和Y坐标的Point2f结构体</returns>
public Point2f GetPositionFromMap(string mapName, int cacheTimeMs = 900)
public Point2f? GetPositionFromMap(string mapName, int cacheTimeMs = 900)
{
var imageRegion = CaptureToRectArea();
if (!Bv.IsInMainUi(imageRegion))
@@ -241,7 +241,7 @@ public class Genshin
/// <param name="x">世界坐标x</param>
/// <param name="y">世界坐标y</param>
/// <returns>包含X和Y坐标的Point2f结构体</returns>
public Point2f GetPositionFromMap(string mapName, float x, float y)
public Point2f? GetPositionFromMap(string mapName, float x, float y)
{
var imageRegion = CaptureToRectArea();
if (!Bv.IsInMainUi(imageRegion))
@@ -377,6 +377,15 @@ public class Genshin
{
await new ExitAndReloginJob().Start(CancellationContext.Instance.Cts.Token);
}
/// <summary>
/// 进出千星奇域
/// </summary>
/// <returns></returns>
public async Task WonderlandCycle()
{
await new EnterAndExitWonderlandJob().Start(CancellationContext.Instance.Cts.Token);
}
/// <summary>
/// 调整时间

View File

@@ -1,4 +1,5 @@
using BetterGenshinImpact.Core.Simulator;
using BetterGenshinImpact.Core.Config;
using BetterGenshinImpact.Core.Simulator;
using BetterGenshinImpact.GameTask;
using BetterGenshinImpact.GameTask.Model.Area;
using BetterGenshinImpact.Helpers;
@@ -23,6 +24,11 @@ public class GlobalMethod
{
await Task.Delay(millisecondsTimeout, CancellationContext.Instance.Cts.Token);
}
public static string GetVersion()
{
return Global.Version;
}
#region

View File

@@ -1,7 +1,10 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using BetterGenshinImpact.Core.Monitor;
using BetterGenshinImpact.GameTask;
using Gma.System.MouseKeyHook;
using Microsoft.ClearScript;
using Microsoft.Extensions.Logging;
@@ -39,219 +42,332 @@ public class KeyMouseHook: IDisposable
private EventHandler<MouseEventExtArgs>? _mouseMoveExtHandler;
private EventHandler<MouseEventExtArgs>? _mouseWheelExtHandler;
private readonly object _mouseMoveLock = new();
private DateTime _lastProcessMouseMoveTime = DateTime.MinValue;
private readonly ILogger<KeyMouseHook> _logger = App.GetLogger<KeyMouseHook>();
/// <summary>
/// 统一处理回调函数执行过程中的异常
/// </summary>
/// <param name="ex">捕获到的异常</param>
/// <param name="eventType">事件类型描述</param>
private void HandleCallbackException(Exception ex, string eventType)
{
if (ex is ScriptEngineException scriptEx)
{
_logger.LogError("执行{eventType}JS回调时发生错误{scriptEx.Message},清除所有回调",eventType, scriptEx.Message);
_logger.LogDebug("{scriptEx}",scriptEx);
}
else
{
_logger.LogError("执行{eventType}回调时发生错误:{ex.Message},清除所有回调,如果此异常出现在JS脚本结束时,请在JS脚本结束前手动调用Dispose()方法",eventType,ex.Message);
_logger.LogDebug("{ex}",ex);
}
Dispose();
}
/// <summary>
/// 将全局屏幕坐标转换为游戏窗口局部坐标
/// </summary>
/// <param name="globalX">全局X坐标</param>
/// <param name="globalY">全局Y坐标</param>
/// <returns>游戏窗口局部坐标(X, Y),转换失败时返回(-1, -1)</returns>
private (int X, int Y) ConvertToLocalCoordinates(int globalX, int globalY)
{
try
{
// 检查TaskContext是否已初始化
if (!TaskContext.Instance().IsInitialized)
{
_logger.LogError("TaskContext未初始化无法获取游戏窗口信息");
return (-1, -1);
}
var gameHandle = TaskContext.Instance().GameHandle;
if (gameHandle == IntPtr.Zero)
{
_logger.LogError("游戏窗口句柄无效,无法获取游戏窗口位置");
return (-1, -1);
}
// 获取游戏窗口捕获区域
var captureRect = SystemControl.GetCaptureRect(gameHandle);
// 检查捕获区域是否有效
if (captureRect.Width <= 0 || captureRect.Height <= 0)
{
_logger.LogError("获取的游戏窗口捕获区域无效宽度或高度为0");
return (-1, -1);
}
// 计算局部坐标
int localX = globalX - captureRect.Left;
int localY = globalY - captureRect.Top;
return (localX, localY);
}
catch (Exception ex)
{
_logger.LogError(ex, "转换鼠标坐标时发生错误");
return (-1, -1);
}
}
private readonly System.Threading.Channels.Channel<Action> _eventChannel =
System.Threading.Channels.Channel.CreateBounded<Action>(
new System.Threading.Channels.BoundedChannelOptions(2048)
{
FullMode = System.Threading.Channels.BoundedChannelFullMode.Wait,
SingleReader = true,
SingleWriter = false
});
private readonly CancellationTokenSource _cts = new();
public KeyMouseHook()
{
// 启动后台事件处理器,确保不阻塞钩子线程
_ = Task.Run(async () =>
{
try
{
var reader = _eventChannel.Reader;
while (await reader.WaitToReadAsync(_cts.Token))
{
while (reader.TryRead(out var action))
{
try
{
action();
}
catch (Exception ex)
{
// 内部错误已在 action 闭包中通过 HandleCallbackException 处理
}
}
}
}
catch (OperationCanceledException) { }
catch (Exception ex)
{
_logger.LogError(ex, "键鼠钩子后台处理器发生异常");
}
});
// 初始化事件处理程序
_keyDownHandler = (_, args) =>
{
// 创建回调列表的副本,避免迭代期间修改集合导致异常
if (_keyDownDataCallbacks.Count == 0 && _keyDownCodeCallbacks.Count == 0) return;
var keyDownDataCallbacksCopy = new List<ScriptObject>(_keyDownDataCallbacks);
var keyDownCodeCallbacksCopy = new List<ScriptObject>(_keyDownCodeCallbacks);
// 调用KeyData回调
foreach (var callback in keyDownDataCallbacksCopy)
{
try
var keyDataStr = args.KeyData.ToString();
var keyCodeStr = args.KeyCode.ToString();
if (!_eventChannel.Writer.TryWrite(() =>
{
callback.InvokeAsFunction(args.KeyData.ToString());
}
catch (InvalidOperationException ex) when (ex.Message.Contains("V8 object has been released"))
{
_logger.LogDebug("V8对象已释放清除所有回调");
RemoveAllListeners();
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "执行键盘按下事件回调时发生错误");
// 忽略单个回调执行异常,不影响其他回调
}
}
// 调用KeyCode回调
foreach (var callback in keyDownCodeCallbacksCopy)
{
try
{
callback.InvokeAsFunction(args.KeyCode.ToString());
}
catch (InvalidOperationException ex) when (ex.Message.Contains("V8 object has been released"))
{
_logger.LogDebug("V8对象已释放清除所有回调");
RemoveAllListeners();
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "执行键盘按下事件回调时发生错误");
// 忽略单个回调执行异常,不影响其他回调
}
// 调用KeyData回调
foreach (var callback in keyDownDataCallbacksCopy)
{
try
{
callback.InvokeAsFunction(keyDataStr);
}
catch (Exception ex)
{
HandleCallbackException(ex, "键盘按下事件");
return;
}
}
// 调用KeyCode回调
foreach (var callback in keyDownCodeCallbacksCopy)
{
try
{
callback.InvokeAsFunction(keyCodeStr);
}
catch (Exception ex)
{
HandleCallbackException(ex, "键盘按下事件");
return;
}
}
}))
{
_logger.LogWarning("事件队列已满或已关闭,忽略键盘按下回调");
}
};
_keyUpHandler = (_, args) =>
{
// 创建回调列表的副本,避免迭代期间修改集合导致异常
if (_keyUpDataCallbacks.Count == 0 && _keyUpCodeCallbacks.Count == 0) return;
var keyUpDataCallbacksCopy = new List<ScriptObject>(_keyUpDataCallbacks);
var keyUpCodeCallbacksCopy = new List<ScriptObject>(_keyUpCodeCallbacks);
// 调用KeyData回调
foreach (var callback in keyUpDataCallbacksCopy)
{
try
var keyDataStr = args.KeyData.ToString();
var keyCodeStr = args.KeyCode.ToString();
if (!_eventChannel.Writer.TryWrite(() =>
{
callback.InvokeAsFunction(args.KeyData.ToString());
}
catch (InvalidOperationException ex) when (ex.Message.Contains("V8 object has been released"))
{
_logger.LogDebug("V8对象已释放清除所有回调");
RemoveAllListeners();
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "执行键盘释放事件回调时发生错误");
// 忽略单个回调执行异常,不影响其他回调
}
}
// 调用KeyCode回调
foreach (var callback in keyUpCodeCallbacksCopy)
{
try
{
callback.InvokeAsFunction(args.KeyCode.ToString());
}
catch (InvalidOperationException ex) when (ex.Message.Contains("V8 object has been released"))
{
_logger.LogDebug("V8对象已释放清除所有回调");
RemoveAllListeners();
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "执行键盘释放事件回调时发生错误");
// 忽略单个回调执行异常,不影响其他回调
}
// 调用KeyData回调
foreach (var callback in keyUpDataCallbacksCopy)
{
try
{
callback.InvokeAsFunction(keyDataStr);
}
catch (Exception ex)
{
HandleCallbackException(ex, "键盘释放事件");
return;
}
}
// 调用KeyCode回调
foreach (var callback in keyUpCodeCallbacksCopy)
{
try
{
callback.InvokeAsFunction(keyCodeStr);
}
catch (Exception ex)
{
HandleCallbackException(ex, "键盘释放事件");
return;
}
}
}))
{
_logger.LogWarning("事件队列已满或已关闭,忽略键盘释放回调");
}
};
_mouseDownExtHandler = (_, args) =>
{
// 创建回调列表的副本,避免迭代期间修改集合导致异常
if (_mouseDownCallbacks.Count == 0) return;
var mouseDownCallbacksCopy = new List<ScriptObject>(_mouseDownCallbacks);
foreach (var callback in mouseDownCallbacksCopy)
{
try
var (localX, localY) = ConvertToLocalCoordinates(args.X, args.Y);
var buttonStr = args.Button.ToString();
if (!_eventChannel.Writer.TryWrite(() =>
{
callback.InvokeAsFunction(args.Button.ToString(), args.X, args.Y);
}
catch (InvalidOperationException ex) when (ex.Message.Contains("V8 object has been released"))
{
_logger.LogDebug("V8对象已释放清除所有回调");
RemoveAllListeners();
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "执行鼠标按下事件回调时发生错误");
// 忽略单个回调执行异常,不影响其他回调
}
foreach (var callback in mouseDownCallbacksCopy)
{
try
{
callback.InvokeAsFunction(buttonStr, localX, localY);
}
catch (Exception ex)
{
HandleCallbackException(ex, "鼠标按下事件");
return;
}
}
}))
{
_logger.LogWarning("事件队列已满或已关闭,忽略鼠标按下回调");
}
};
_mouseUpExtHandler = (_, args) =>
{
// 创建回调列表的副本,避免迭代期间修改集合导致异常
if (_mouseUpCallbacks.Count == 0) return;
var mouseUpCallbacksCopy = new List<ScriptObject>(_mouseUpCallbacks);
foreach (var callback in mouseUpCallbacksCopy)
var (localX, localY) = ConvertToLocalCoordinates(args.X, args.Y);
var buttonStr = args.Button.ToString();
if (!_eventChannel.Writer.TryWrite(() =>
{
foreach (var callback in mouseUpCallbacksCopy)
{
try
{
callback.InvokeAsFunction(buttonStr, localX, localY);
}
catch (Exception ex)
{
HandleCallbackException(ex, "鼠标释放事件");
return;
}
}
}))
{
try
{
callback.InvokeAsFunction(args.Button.ToString(), args.X, args.Y);
}
catch (InvalidOperationException ex) when (ex.Message.Contains("V8 object has been released"))
{
_logger.LogDebug("V8对象已释放清除所有回调");
RemoveAllListeners();
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "执行鼠标释放事件回调时发生错误");
// 忽略单个回调执行异常,不影响其他回调
}
_logger.LogWarning("事件队列已满或已关闭,忽略鼠标释放回调");
}
};
_mouseMoveExtHandler = (_, args) =>
{
if (_mouseMoveCallbacks.Count == 0) return;
var now = DateTime.Now;
// 创建回调列表的副本,避免迭代期间修改集合导致异常
if ((now - _lastProcessMouseMoveTime).TotalMilliseconds < 10) return;
_lastProcessMouseMoveTime = now;
var mouseMoveCallbacksCopy = new List<ScriptObject>(_mouseMoveCallbacks);
foreach (var callback in mouseMoveCallbacksCopy)
{
try
var (localX, localY) = ConvertToLocalCoordinates(args.X, args.Y);
if (!_eventChannel.Writer.TryWrite(() =>
{
// 获取回调的间隔时间
if (_mouseMoveCallbackIntervals.TryGetValue(callback, out var interval))
foreach (var callback in mouseMoveCallbacksCopy)
{
// 获取上次调用时间
if (_lastMouseMoveCallbackTimes.TryGetValue(callback, out var lastTime))
try
{
// 计算时间差
var timeSpan = now - lastTime;
// 如果时间差大于等于间隔时间,则执行回调
if (timeSpan.TotalMilliseconds >= interval)
lock (_mouseMoveLock)
{
callback.InvokeAsFunction(args.X, args.Y);
// 更新上次调用时间
_lastMouseMoveCallbackTimes[callback] = now;
if (_mouseMoveCallbackIntervals.TryGetValue(callback, out var interval) &&
_lastMouseMoveCallbackTimes.TryGetValue(callback, out var lastTime))
{
var timeSpan = now - lastTime;
if (timeSpan.TotalMilliseconds >= interval)
{
callback.InvokeAsFunction(localX, localY);
_lastMouseMoveCallbackTimes[callback] = now;
}
}
}
}
catch (Exception ex)
{
HandleCallbackException(ex, "鼠标移动事件");
return;
}
}
}
catch (InvalidOperationException ex) when (ex.Message.Contains("V8 object has been released"))
{
_logger.LogDebug("V8对象已释放清除所有回调");
RemoveAllListeners();
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "执行鼠标移动事件回调时发生错误");
// 忽略单个回调执行异常,不影响其他回调
}
}))
{
_logger.LogWarning("事件队列已满或已关闭,忽略鼠标移动回调");
}
};
_mouseWheelExtHandler = (_, args) =>
{
// 创建回调列表的副本,避免迭代期间修改集合导致异常
if (_mouseWheelCallbacks.Count == 0) return;
var mouseWheelCallbacksCopy = new List<ScriptObject>(_mouseWheelCallbacks);
foreach (var callback in mouseWheelCallbacksCopy)
var (localX, localY) = ConvertToLocalCoordinates(args.X, args.Y);
var delta = args.Delta;
if (!_eventChannel.Writer.TryWrite(() =>
{
foreach (var callback in mouseWheelCallbacksCopy)
{
try
{
callback.InvokeAsFunction(delta, localX, localY);
}
catch (Exception ex)
{
HandleCallbackException(ex, "鼠标滚轮事件");
return;
}
}
}))
{
try
{
callback.InvokeAsFunction(args.Delta, args.X, args.Y);
}
catch (InvalidOperationException ex) when (ex.Message.Contains("V8 object has been released"))
{
_logger.LogDebug("V8对象已释放清除所有回调");
RemoveAllListeners();
return;
}
catch (Exception ex)
{
_logger.LogError(ex, "执行鼠标滚轮事件回调时发生错误");
// 忽略单个回调执行异常,不影响其他回调
}
_logger.LogWarning("事件队列已满或已关闭,忽略鼠标滚轮回调");
}
};
@@ -342,6 +458,8 @@ public class KeyMouseHook: IDisposable
{
if (disposing)
{
_cts.Cancel();
_eventChannel.Writer.TryComplete();
// 移除所有事件监听器
if (_keyDownHandler != null)
{

View File

@@ -1,4 +1,6 @@
using BetterGenshinImpact.Core.Script.Dependence.Model.TimerConfig;
using System;
using BetterGenshinImpact.Core.Script.Dependence.Model.TimerConfig;
using BetterGenshinImpact.GameTask.AutoSkip;
using BetterGenshinImpact.Helpers;
namespace BetterGenshinImpact.Core.Script.Dependence.Model;
@@ -40,5 +42,16 @@ public class RealtimeTimer
{
Config = ScriptObjectConverter.ConvertTo<AutoPickExternalConfig>(config);
}
else if (Name == "AutoSkip")
{
if (config is AutoSkipConfig)
{
Config = config;
}
else
{
throw new ArgumentException("AutoSkip的配置参数需要为AutoSkipConfig类型");
}
}
}
}

View File

@@ -12,6 +12,7 @@ using BetterGenshinImpact.Core.Script.Utils;
using BetterGenshinImpact.GameTask.AutoDomain;
using BetterGenshinImpact.GameTask.AutoFight;
using BetterGenshinImpact.GameTask.AutoFight.Model;
using BetterGenshinImpact.GameTask.AutoSkip;
namespace BetterGenshinImpact.Core.Script;
@@ -35,12 +36,12 @@ public class EngineExtend
engine.AddHostObject("file", new LimitedFile(workDir)); // 限制文件访问
engine.AddHostObject("http", new Http()); // 限制文件访问
engine.AddHostObject("notification", new Notification());
engine.AddHostObject("keyMouseHook", new KeyMouseHook());
// 任务调度器
engine.AddHostObject("dispatcher", new Dispatcher(config));
engine.AddHostType("RealtimeTimer", typeof(RealtimeTimer));
engine.AddHostType("SoloTask", typeof(SoloTask));
engine.AddHostType("AutoSkipConfig", typeof(AutoSkipConfig));
// 添加取消令牌相关类型
engine.AddHostType("CancellationTokenSource", typeof(CancellationTokenSource));
@@ -71,8 +72,8 @@ public class EngineExtend
engine.AddHostType("AutoDomainParam", typeof(AutoDomainParam));
engine.AddHostType("AutoFightParam", typeof(AutoFightParam));
//鼠标回调
engine.AddHostType("KeyMouseHook", typeof(KeyMouseHook));
// 添加C#的类型
engine.AddHostType(typeof(Task));
@@ -117,6 +118,7 @@ public class EngineExtend
#pragma warning disable CS8974 // Converting method group to non-delegate type
engine.AddHostObject("sleep", GlobalMethod.Sleep);
engine.AddHostObject("getVersion", GlobalMethod.GetVersion);
engine.AddHostObject("keyDown", GlobalMethod.KeyDown);
engine.AddHostObject("keyUp", GlobalMethod.KeyUp);
engine.AddHostObject("keyPress", GlobalMethod.KeyPress);

View File

@@ -216,6 +216,9 @@ public partial class ScriptGroupProject : ObservableObject
}
JsScriptSettingsObject ??= new ExpandoObject();
// 清理配置中的无效值
CleanInvalidSettingsValues();
var pathingPartyConfig = GroupInfo?.Config.PathingConfig;
await Project.ExecuteAsync(JsScriptSettingsObject, pathingPartyConfig);
}
@@ -336,6 +339,67 @@ public partial class ScriptGroupProject : ObservableObject
{
OnPropertyChanged(nameof(ScheduleDesc));
}
/// <summary>
/// 清理 JsScriptSettingsObject 中不在 settings.json 定义的 Options 列表中的无效值
/// </summary>
private void CleanInvalidSettingsValues()
{
if (Project == null || JsScriptSettingsObject == null)
{
return;
}
try
{
// 加载 settings.json 中定义的配置项
var settingItems = Project.Manifest.LoadSettingItems(Project.ProjectPath);
if (settingItems.Count == 0)
{
return;
}
var settingsDict = JsScriptSettingsObject as IDictionary<string, object?>;
if (settingsDict == null)
{
return;
}
// 遍历所有 multi-checkbox 类型的配置项
foreach (var item in settingItems.Where(i => i.Type == "multi-checkbox"))
{
if (!settingsDict.ContainsKey(item.Name))
{
continue;
}
// 获取当前保存的值
var savedValue = settingsDict[item.Name];
List<string>? checkedValues = null;
if (savedValue is List<string> stringList)
{
checkedValues = stringList;
}
else if (savedValue is List<object> objectList)
{
checkedValues = objectList.Select(i => (string)i).ToList();
settingsDict[item.Name] = checkedValues;
}
// 清理不在 Options 列表中的无效值
if (checkedValues != null && item.Options != null)
{
checkedValues.RemoveAll(value => !item.Options.Contains(value));
}
}
}
catch (Exception ex)
{
// 清理失败不影响脚本执行,只记录日志
TaskControl.Logger.LogDebug(ex, "清理JS脚本配置中的无效值时发生异常");
}
}
}
public class ScriptGroupProjectExtensions

View File

@@ -0,0 +1,145 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Microsoft.ClearScript;
using Microsoft.ClearScript.JavaScript;
namespace BetterGenshinImpact.Core.Script
{
public class PackageDocumentLoader : DocumentLoader
{
private readonly string _scriptRootPath;
public PackageDocumentLoader(string scriptRootPath)
{
_scriptRootPath = Path.GetFullPath(scriptRootPath);
}
public override async Task<Document> LoadDocumentAsync(DocumentSettings settings, DocumentInfo? sourceInfo, string specifier, DocumentCategory category, DocumentContextCallback contextCallback)
{
string? targetPath = ResolvePhysicalPath(settings, sourceInfo, specifier);
if (targetPath == null || !File.Exists(targetPath))
{
return await Default.LoadDocumentAsync(settings, sourceInfo, specifier, category, contextCallback);
}
// 处理 JS 文件的重写
if (Path.GetExtension(targetPath).ToLower() == ".js")
{
string content = await File.ReadAllTextAsync(targetPath);
string processedCode = RewriteScriptCode(content, targetPath);
return new StringDocument(new DocumentInfo(targetPath) { Category = ModuleCategory.Standard }, processedCode);
}
return await Default.LoadDocumentAsync(settings, sourceInfo, specifier, category, contextCallback);
}
/// <summary>
/// js重写
/// </summary>
public string RewriteScriptCode(string code, string currentFilePath)
{
if (string.IsNullOrEmpty(code)) return code;
string result = code.Replace("../../../packages", "packages");
// 拦截资源导入
var resourceRegex = new Regex(@"import\s+([\w\d_*$]+|[\s\S]*?)\s+from\s+(['""])([^'""\n]+)(['""])");
result = resourceRegex.Replace(result, match =>
{
string importPart = match.Groups[1].Value.Trim();
string quote = match.Groups[2].Value;
string rawPath = match.Groups[3].Value;
string path = rawPath.Replace("../../../packages", "packages");
string? resourceFullPath = ResolvePathInternal(null, currentFilePath, path);
if (resourceFullPath != null && File.Exists(resourceFullPath))
{
string normalizedPath = Path.GetRelativePath(_scriptRootPath, resourceFullPath).Replace("\\", "/");
bool isJs = resourceFullPath.EndsWith(".js", StringComparison.OrdinalIgnoreCase);
bool isImage = IsImageFile(resourceFullPath);
// 图片 -> Mat
if (isImage)
{
if (importPart.StartsWith("{")) return match.Value;
return $"const {importPart} = file.ReadImageMatSync({quote}{normalizedPath}{quote});";
}
// 非 JS 资源 -> 文本内容
if (!isJs)
{
if (importPart.StartsWith("{")) return match.Value;
return $"const {importPart} = file.ReadTextSync({quote}{normalizedPath}{quote});";
}
}
return match.Value;
});
return result;
}
private string? ResolvePhysicalPath(DocumentSettings settings, DocumentInfo? sourceInfo, string specifier)
{
return ResolvePathInternal(settings.SearchPath, sourceInfo?.Name, specifier);
}
private string? ResolvePathInternal(string? searchPath, string? referrer, string specifier)
{
if (specifier.StartsWith("packages/", StringComparison.OrdinalIgnoreCase))
{
return ProbeFile(Path.Combine(_scriptRootPath, specifier));
}
if (specifier.StartsWith("."))
{
if (!string.IsNullOrEmpty(referrer))
{
string? dir = Path.GetDirectoryName(referrer);
if (dir != null)
{
return ProbeFile(Path.GetFullPath(Path.Combine(dir, specifier)));
}
}
}
if (!string.IsNullOrEmpty(searchPath))
{
var paths = searchPath.Split(';', StringSplitOptions.RemoveEmptyEntries);
foreach (var p in paths)
{
string combined = Path.Combine(p, specifier);
string? found = ProbeFile(combined);
if (found != null) return found;
}
}
return ProbeFile(Path.Combine(_scriptRootPath, specifier));
}
private string? ProbeFile(string path)
{
try
{
if (File.Exists(path)) return path;
if (File.Exists(path + ".js")) return path + ".js";
}
catch { }
return null;
}
private static bool IsImageFile(string path)
{
if (string.IsNullOrEmpty(path)) return false;
string ext = Path.GetExtension(path).ToLower();
string[] imageExtensions = { ".png", ".jpg", ".jpeg", ".bmp", ".tiff", ".webp" };
return imageExtensions.Contains(ext);
}
}
}

View File

@@ -2,8 +2,10 @@ using BetterGenshinImpact.Core.Config;
using Microsoft.ClearScript;
using Microsoft.ClearScript.V8;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
@@ -69,10 +71,24 @@ public class ScriptProject
return scrollViewer;
}
public IScriptEngine BuildScriptEngine(PathingPartyConfig? partyConfig = null)
private IScriptEngine BuildScriptEngine(PathingPartyConfig? partyConfig)
{
IScriptEngine engine = new V8ScriptEngine(V8ScriptEngineFlags.UseCaseInsensitiveMemberBinding | V8ScriptEngineFlags.EnableTaskPromiseConversion);
EngineExtend.InitHost(engine, ProjectPath, Manifest.Library,partyConfig);
V8ScriptEngine engine = new V8ScriptEngine(V8ScriptEngineFlags.UseCaseInsensitiveMemberBinding | V8ScriptEngineFlags.EnableTaskPromiseConversion);
// packages 依赖和资源重载
var loader = new PackageDocumentLoader(ProjectPath);
engine.DocumentSettings.Loader = loader;
// 添加 packages 到搜索路径
var libraries = new HashSet<string>(Manifest.Library ?? Array.Empty<string>())
{
".",
"./packages"
};
var libraryList = libraries.ToList();
EngineExtend.InitHost(engine, ProjectPath, libraryList.ToArray(), partyConfig);
return engine;
}
@@ -83,6 +99,10 @@ public class ScriptProject
// 加载代码
var code = await LoadCode();
var engine = BuildScriptEngine(partyConfig);
// 使用自定义加载器解析脚本文件
var loader = (PackageDocumentLoader)engine.DocumentSettings.Loader;
if (context != null)
{
// 写入配置的内容
@@ -90,15 +110,25 @@ public class ScriptProject
}
try
{
if (Manifest.Library.Length != 0)
bool useModule = Manifest.Library.Length != 0 ||
code.Contains("import ", StringComparison.Ordinal) ||
code.Contains("export ", StringComparison.Ordinal);
if (useModule)
{
// 清除Document缓存
DocumentLoader.Default.DiscardCachedDocuments();
await (Task)engine.Evaluate(new DocumentInfo { Category = ModuleCategory.Standard }, code);
string mainScriptPath = Path.Combine(ProjectPath, Manifest.Main);
string runtimeCode = loader.RewriteScriptCode(code, mainScriptPath);
var evaluation = engine.Evaluate(new DocumentInfo(mainScriptPath) { Category = ModuleCategory.Standard }, runtimeCode);
if (evaluation is Task task) await task;
}
else
{
await (Task)engine.Evaluate(code);
var evaluation = engine.Evaluate(code);
if (evaluation is Task task) await task;
}
}
catch (Exception e)

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,7 @@ using BetterGenshinImpact.ViewModel.Message;
using CommunityToolkit.Mvvm.Messaging;
using Newtonsoft.Json.Linq;
using System.Net;
using BetterGenshinImpact.GameTask;
namespace BetterGenshinImpact.Core.Script.WebView;
@@ -31,7 +32,7 @@ public sealed class RepoWebBridge
{
".png", ".jpg", ".jpeg", ".gif", ".webp", ".svg", ".bmp", ".ico"
};
public async Task<string> GetRepoJson()
{
try
@@ -77,7 +78,7 @@ public sealed class RepoWebBridge
return await File.ReadAllTextAsync(userConfigPath);
}
public async Task<string> GetFile(string relPath)
public Task<string> GetFile(string relPath)
{
try
{
@@ -92,34 +93,53 @@ public sealed class RepoWebBridge
string normalizedFilePath = Path.GetFullPath(filePath);
if (!normalizedFilePath.StartsWith(normalizedBasePath, StringComparison.OrdinalIgnoreCase))
{
return "404";
}
if (!File.Exists(filePath))
{
return "404";
return Task.FromResult("404");
}
string extension = Path.GetExtension(filePath).ToLower();
if (AllowedTextExtensions.Contains(extension))
{
return await File.ReadAllTextAsync(filePath);
// 读取文本文件
string? content = ScriptRepoUpdater.Instance.ReadFileFromCenterRepo(relPath);
return Task.FromResult(string.IsNullOrEmpty(content) ? "404" : content);
}
else if (AllowedImageExtensions.Contains(extension))
{
byte[] bytes = await File.ReadAllBytesAsync(filePath);
return Convert.ToBase64String(bytes);
// 读取图片文件,返回 Base64 编码
byte[]? bytes = ScriptRepoUpdater.Instance.ReadBinaryFileFromCenterRepo(relPath);
if (bytes == null || bytes.Length == 0)
{
return Task.FromResult("404");
}
string base64 = Convert.ToBase64String(bytes);
return Task.FromResult(base64);
}
return "404";
return Task.FromResult("404");
}
catch
{
return "404";
return Task.FromResult("404");
}
}
private static string GetMimeType(string extension)
{
return extension.ToLower() switch
{
".png" => "image/png",
".jpg" or ".jpeg" => "image/jpeg",
".gif" => "image/gif",
".bmp" => "image/bmp",
".webp" => "image/webp",
".svg" => "image/svg+xml",
".ico" => "image/x-icon",
_ => "application/octet-stream"
};
}
public async Task<bool> UpdateSubscribed(string path)
{
try
@@ -176,6 +196,36 @@ public sealed class RepoWebBridge
}
}
// 设置新手引导标志位
public bool SetGuideStatus(bool status)
{
try
{
var scriptConfig = TaskContext.Instance().Config.ScriptConfig;
scriptConfig.GuideStatus = status;
return true;
}
catch (Exception e)
{
Console.WriteLine(e);
return false;
}
}
// 获取新手引导标志位
public bool GetGuideStatus()
{
try
{
return TaskContext.Instance().Config.ScriptConfig.GuideStatus;
}
catch (Exception e)
{
Console.WriteLine(e);
return false;
}
}
private static string GetRepoJsonPath()
{
string updatedRepoJsonPath = Path.Combine(

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -0,0 +1,49 @@
using BetterGenshinImpact.Core.Recognition;
using BetterGenshinImpact.GameTask.Model;
using OpenCvSharp;
namespace BetterGenshinImpact.GameTask.AutoDomain.Assets;
public class AutoDomainAssets : BaseAssets<AutoDomainAssets>
{
public RecognitionObject ResinSwitchBtnRo;
public RecognitionObject ResinSwitchBtnNoActiveRo;
private AutoDomainAssets() : base()
{
Initialization(this.systemInfo);
}
protected AutoDomainAssets(ISystemInfo systemInfo) : base(systemInfo)
{
Initialization(systemInfo);
}
private void Initialization(ISystemInfo systemInfo)
{
// 可点击状态的树脂切换按钮
ResinSwitchBtnRo = new RecognitionObject
{
Name = "ResinSwitchBtn",
RecognitionType = RecognitionTypes.TemplateMatch,
TemplateImageMat = GameTaskManager.LoadAssetImage("AutoDomain", "resin_switch_btn.png", this.systemInfo),
RegionOfInterest = new Rect((int)(960 * AssetScale), (int)(430 * AssetScale), (int)(400 * AssetScale), (int)(130 * AssetScale)),
Threshold = 0.8,
DrawOnWindow = false
}.InitTemplate();
// 不可点击状态的树脂切换按钮
ResinSwitchBtnNoActiveRo = new RecognitionObject
{
Name = "ResinSwitchBtnNoActive",
RecognitionType = RecognitionTypes.TemplateMatch,
TemplateImageMat = GameTaskManager.LoadAssetImage("AutoDomain", "resin_switch_btn_no_active.png", this.systemInfo),
RegionOfInterest = new Rect((int)(960 * AssetScale), (int)(430 * AssetScale), (int)(400 * AssetScale), (int)(130 * AssetScale)),
Threshold = 0.8,
DrawOnWindow = false
}.InitTemplate();
}
}

View File

@@ -68,6 +68,13 @@ public partial class AutoDomainConfig : ObservableObject
// 使用原粹树脂刷取副本次数
[ObservableProperty]
private int _originalResinUseCount = 0;
// 使用原粹树脂(20)刷取副本次数
[ObservableProperty]
private int _originalResin20UseCount = 0;
// 使用原粹树脂(40)刷取副本次数
[ObservableProperty]
private int _originalResin40UseCount = 0;
//使用浓缩树脂刷取副本次数
[ObservableProperty]

View File

@@ -34,9 +34,13 @@ public class AutoDomainParam : BaseTaskParam<AutoDomainTask>
"浓缩树脂",
"原粹树脂"
];
// 使用原粹树脂刷取副本次数
public int OriginalResinUseCount { get; set; } = 0;
// 使用原粹树脂(20)刷取副本次数
public int OriginalResin20UseCount { get; set; } = 0;
// 使用原粹树脂(40)刷取副本次数
public int OriginalResin40UseCount { get; set; } = 0;
// 使用浓缩树脂刷取副本次数
public int CondensedResinUseCount { get; set; } = 0;
@@ -73,6 +77,8 @@ public class AutoDomainParam : BaseTaskParam<AutoDomainTask>
TransientResinUseCount = config.TransientResinUseCount;
FragileResinUseCount = config.FragileResinUseCount;
SpecifyResinUse = config.SpecifyResinUse;
OriginalResin20UseCount = config.OriginalResin20UseCount;
OriginalResin40UseCount = config.OriginalResin40UseCount;
}
public AutoDomainParam(int domainRoundNum = 0) : base(null, null)

View File

@@ -41,6 +41,7 @@ using BetterGenshinImpact.GameTask.Common;
using Compunet.YoloSharp;
using Microsoft.Extensions.DependencyInjection;
using BetterGenshinImpact.GameTask.AutoFight;
using BetterGenshinImpact.GameTask.AutoDomain.Assets;
namespace BetterGenshinImpact.GameTask.AutoDomain;
@@ -1151,6 +1152,26 @@ public class AutoDomainTask : ISoloTask
{
if (record.RemainCount > 0)
{
if (record.Name == "原粹树脂20" || record.Name == "原粹树脂40")
{
int expectedNum = record.Name == "原粹树脂20" ? 20 : 40;
bool switched;
try
{
switched = SwitchOriginalResinType(expectedNum, _ct);
}
catch (RetryException)
{
Logger.LogWarning("自动秘境:切换原粹树脂类型重试超时,跳过 {Name}", record.Name);
switched = false;
}
if (!switched)
{
continue;
}
}
var (success, _) = PressUseResin(textListInPrompt2, record.Name);
if (success)
{
@@ -1258,6 +1279,11 @@ public class AutoDomainTask : ISoloTask
public static (bool, int) PressUseResin(List<Region> regionList, string resinName)
{
if (resinName == "原粹树脂20" || resinName == "原粹树脂40")
{
resinName = "原粹树脂";
}
var resinKey = regionList.FirstOrDefault(t => t.Text.Contains(resinName));
if (resinKey != null)
{
@@ -1293,6 +1319,46 @@ public class AutoDomainTask : ISoloTask
return (false, 0);
}
private bool SwitchOriginalResinType(int expectedNum, CancellationToken ct)
{
return NewRetry.Do(() =>
{
using var ra0 = CaptureToRectArea();
var regionList = ra0.FindMulti(RecognitionObject.Ocr(ra0.Width * 0.25, ra0.Height * 0.2, ra0.Width * 0.5, ra0.Height * 0.6));
var has20 = regionList.Any(t => t.Text.Contains("20"));
var has40 = regionList.Any(t => t.Text.Contains("40"));
if (expectedNum == 20 && has20)
{
Logger.LogInformation("自动秘境已切换到使用20原粹树脂");
return true;
}
if (expectedNum == 40 && has40)
{
Logger.LogInformation("自动秘境已切换到使用40原粹树脂");
return true;
}
//切换20/40原粹树脂的按钮是亮的
var clickable = ra0.Find(AutoDomainAssets.Instance.ResinSwitchBtnRo);
if (clickable.IsExist())
{
Logger.LogDebug("自动秘境:切换原粹树脂使用数量");
clickable.Click();
}
//切换20/40原粹树脂的按钮是暗的
var disabled = ra0.Find(AutoDomainAssets.Instance.ResinSwitchBtnNoActiveRo);
if (disabled.IsExist())
{
Logger.LogWarning("自动秘境:切换原粹树脂的使用数量失败,可能是体力不足,当前目标:{Num}", expectedNum);
return false; // 不可点击
}
throw new RetryException("未检测到按钮"); // 继续重试
}, TimeSpan.FromMilliseconds(500), 10);
}
private static int GetResinNum(Region region, string resinName)
{
if (resinName == "原粹树脂")
@@ -1335,7 +1401,7 @@ public class AutoDomainTask : ISoloTask
return (region1Top <= region2Bottom && region1Bottom >= region2Top);
}
private async Task ArtifactSalvage()
private async Task ArtifactSalvage()
{
if (!_taskParam.AutoArtifactSalvage)
{

View File

@@ -32,6 +32,14 @@ public class ResinUseRecord
{
list.Add(new ResinUseRecord("浓缩树脂", taskParam.CondensedResinUseCount));
}
if (taskParam.OriginalResin40UseCount > 0)
{
list.Add(new ResinUseRecord("原粹树脂40", taskParam.OriginalResin40UseCount));
}
if (taskParam.OriginalResin20UseCount > 0)
{
list.Add(new ResinUseRecord("原粹树脂20", taskParam.OriginalResin20UseCount));
}
if (taskParam.OriginalResinUseCount > 0)
{
list.Add(new ResinUseRecord("原粹树脂", taskParam.OriginalResinUseCount));

View File

@@ -9,6 +9,7 @@ using BetterGenshinImpact.GameTask.GetGridIcons;
using BetterGenshinImpact.GameTask.Model;
using BetterGenshinImpact.GameTask.Model.Area;
using BetterGenshinImpact.GameTask.Model.GameUI;
using BetterGenshinImpact.Helpers;
using BetterGenshinImpact.View.Drawable;
using Fischless.WindowsInput;
using Microsoft.Extensions.Logging;
@@ -104,7 +105,8 @@ public class AutoEatTask : BaseIndependentTask, ISoloTask<int?>
itemRegion.Click();
#region
string numStr = itemRegion.SrcMat.GetGridItemIconText(OcrFactory.Paddle);
string ocrText = itemRegion.SrcMat.GetGridItemIconText(OcrFactory.Paddle);
string numStr = StringUtils.ConvertFullWidthNumToHalfWidth(ocrText);
if (int.TryParse(numStr, out int num))
{
count = num - 1; // 算上吃掉的1个

View File

@@ -2021,5 +2021,33 @@
"nameEn": "Columbina",
"skillCD": 17,
"weapon": "10"
},
{
"alias": [
"兹白",
"Zibai",
"白马仙人",
"白马"
],
"burstCD": 15,
"id": "10000126",
"name": "兹白",
"nameEn": "Zibai",
"skillCD": 18,
"weapon": "10"
},
{
"alias": [
"叶洛亚",
"Illuga",
"少爷",
"小少爷"
],
"burstCD": 15,
"id": "10000127",
"name": "叶洛亚",
"nameEn": "Illuga",
"skillCD": 15,
"weapon": "10"
}
]

View File

@@ -320,7 +320,8 @@ namespace BetterGenshinImpact.GameTask.AutoFight
if (retryCount == 0)
{
await Delay(delayTime,ct);
Logger.LogInformation("打开编队界面检查战斗是否结束,延时{detectDelayTime}毫秒检查", detectDelayTime);
// Logger.LogInformation("打开编队界面检查战斗是否结束,延时{detectDelayTime}毫秒检查", detectDelayTime);
Logger.LogInformation("打开编队界面检查战斗是否结束");
Simulation.SendInput.SimulateAction(GIActions.OpenPartySetupScreen);
await Delay(detectDelayTime, ct);
var ra3 = CaptureToRectArea();

View File

@@ -22,6 +22,9 @@ using Microsoft.Extensions.DependencyInjection;
using BetterGenshinImpact.GameTask.AutoPathing.Model;
using BetterGenshinImpact.GameTask.AutoPathing.Handler;
using BetterGenshinImpact.GameTask.AutoPick.Assets;
using BetterGenshinImpact.Core.Recognition;
using BetterGenshinImpact.GameTask.Common.Element.Assets;
using BetterGenshinImpact.GameTask.Common;
namespace BetterGenshinImpact.GameTask.AutoFight;
@@ -44,6 +47,10 @@ public class AutoFightTask : ISoloTask
public static bool FightStatusFlag { get; set; } = false;
private static readonly object PickLock = new object();
private readonly double _assetScale = TaskContext.Instance().SystemInfo.AssetScale;
private readonly ReturnMainUiTask _returnMainUiTask = new();
// 战斗点位
public static WaypointForTrack? FightWaypoint {get; set;} = null;
@@ -437,7 +444,7 @@ public class AutoFightTask : ISoloTask
if (_finishDetectConfig.DelayTimes.TryGetValue(command.Name, out var time))
{
delayTime = time;
Logger.LogInformation($"{command.Name}结束后,延时检查为{delayTime}毫秒");
// Logger.LogInformation($"{command.Name}结束后,延时检查为{delayTime}毫秒");
}
else
{
@@ -486,7 +493,91 @@ public class AutoFightTask : ISoloTask
// 队伍中存在万叶的时候使用一次长E
var picker = combatScenes.SelectAvatar("枫原万叶") ?? combatScenes.SelectAvatar("琴");
var oldPartyName = RunnerContext.Instance.PartyName;
string? oldPartyName = null;
if (RunnerContext.Instance.PartyName is not null)
{
oldPartyName = RunnerContext.Instance.PartyName;
}
else if(picker is null && !string.IsNullOrEmpty(_taskParam.KazuhaPartyName))
{
Logger.LogWarning("换队拾取:当前队伍名称为空,尝试读取!");
await Delay(1000, ct);
await _returnMainUiTask.Start(ct);
for (int attempt = 0; attempt < 6; attempt++)
{
Simulation.SendInput.SimulateAction(GIActions.OpenPartySetupScreen);
var enterGameAppear = await NewRetry.WaitForElementAppear(
ElementAssets.Instance.PartyBtnChooseView,
() => { },
ct,
15,
500
);
if(attempt == 5 && !enterGameAppear)
{
Logger.LogWarning("换队拾取:读取队伍名称失败,跳过换队拾取步骤");
}
}
}
if (!string.IsNullOrEmpty(_taskParam.KazuhaPartyName)){
await Delay(1000, ct);
//等待寻找2秒队伍按钮出现
var timeWaitStart = 0;
while(timeWaitStart < 6000)
{
using var ra = CaptureToRectArea();
var partyViewBtn = ra.Find(ElementAssets.Instance.PartyBtnChooseView);
if (partyViewBtn.IsExist())
{
// OCR 当前队伍名称(无法单字,中间禁止空格)
// 读取OCR原始识别文本
var rawPartyName = ra.Find(new RecognitionObject
{
RecognitionType = RecognitionTypes.Ocr,
RegionOfInterest = new Rect(partyViewBtn.Right, partyViewBtn.Top, (int)(350 * _assetScale),
partyViewBtn.Height)
}).Text;
// 核心处理逻辑1.空值兜底 2.去首尾空白 3.移除末尾的“口”字(仅最后一个是口才删)
if (string.IsNullOrWhiteSpace(rawPartyName))
{
oldPartyName = string.Empty;
}
else
{
//有概率把编辑图标识别为字符,并且含有空格或换行符,需要过滤
var tempName = rawPartyName
.Replace("\"", "") // 移除所有双引号(核心新增,解决日志里的""问题)
.Replace("\r\n", "") // 清理Windows换行符
.Replace("\r", ""); // 先清理所有双引号,避免引号干扰后续处理
// 核心逻辑:找到第一个换行符(\n)的位置,截断并删除换行+后面所有字符
int firstNewLineIndex = tempName.IndexOf('\n');
if (firstNewLineIndex != -1) // 存在换行符,截取到换行符前
{
tempName = tempName.Substring(0, firstNewLineIndex);
}
// 最后统一去首尾所有空白(空格、制表符、回车符\r等得到纯净队伍名
oldPartyName = tempName.Trim();
}
// 后续原有逻辑不变
Logger.LogInformation("换队拾取:当前队伍名称读取为:{oldPartyName}", oldPartyName);
// 加在rawPartyName赋值后打印原始文本的“原始形态”转义符会显示
Logger.LogDebug("OCR原始识别文本含转义{rawPartyName}", rawPartyName);
RunnerContext.Instance.PartyName = oldPartyName;
// await _returnMainUiTask.Start(ct);
break;
}
await Delay(200, ct);
timeWaitStart += 200;
}
}
var switchPartyFlag = false;
if (picker == null && !timeOutFlag &&!string.IsNullOrEmpty(_taskParam.KazuhaPartyName) && oldPartyName != _taskParam.KazuhaPartyName)
{
@@ -516,7 +607,12 @@ public class AutoFightTask : ISoloTask
if (picker.Name == "枫原万叶")
{
var time = TimeSpan.FromSeconds(picker.GetSkillCdSeconds());
if (!(lastFightName == picker.Name && time.TotalSeconds > 3))
// 如果配置了二次拾取,或者不满足跳过条件(上次是万叶且冷却时间>3秒则执行拾取
bool shouldSkip = lastFightName == picker.Name && time.TotalSeconds > 3;
bool forcePickup = _taskParam.QinDoublePickUp;
if (forcePickup || !shouldSkip)
{
Logger.LogInformation("使用 枫原万叶-长E 拾取掉落物");
await Delay(200, ct);
@@ -677,7 +773,8 @@ public class AutoFightTask : ISoloTask
if (!_finishDetectConfig.RotateFindEnemyEnabled)await Delay(delayTime, _ct);
Logger.LogInformation("打开编队界面检查战斗是否结束,延时{detectDelayTime}毫秒检查", detectDelayTime);
// Logger.LogInformation("打开编队界面检查战斗是否结束,延时{detectDelayTime}毫秒检查", detectDelayTime);
Logger.LogInformation("打开编队界面检查战斗是否结束");
// 最终方案确认战斗结束
Simulation.SendInput.SimulateAction(GIActions.OpenPartySetupScreen);
await Delay(detectDelayTime, _ct);
@@ -700,8 +797,9 @@ public class AutoFightTask : ISoloTask
return true;
}
Logger.LogInformation($"未识别到战斗结束yellow{b3.Item0},{b3.Item1},{b3.Item2}");
Logger.LogInformation($"未识别到战斗结束white{whiteTile.Item0},{whiteTile.Item1},{whiteTile.Item2}");
// Logger.LogInformation($"未识别到战斗结束yellow{b3.Item0},{b3.Item1},{b3.Item2}");
// Logger.LogInformation($"未识别到战斗结束white{whiteTile.Item0},{whiteTile.Item1},{whiteTile.Item2}");
Logger.LogInformation($"未识别到战斗结束: yellow{b3.Item0},{b3.Item1},{b3.Item2};white{whiteTile.Item0},{whiteTile.Item1},{whiteTile.Item2}");
if (_finishDetectConfig.RotateFindEnemyEnabled)
{
@@ -804,4 +902,4 @@ public class AutoFightTask : ISoloTask
// // 要大于 gadgetMat 的 1/2
// return list.Any(r => r.Width > gadgetMat.Width / 2 && r.Height > gadgetMat.Height / 2);
// }
}
}

View File

@@ -128,28 +128,37 @@ public class Avatar
}
Logger.LogInformation("游泳检测:尝试回到战斗地点");
var pathExecutor = new PathExecutor(ct);
var cts = new CancellationTokenSource();
var pathExecutor = new PathExecutor(cts.Token);
try
{
pathExecutor.FaceTo(AutoFightTask.FightWaypoint).Wait(2000, ct);
AutoFightTask.FightWaypoint.MoveMode = MoveModeEnum.Fly.Code;//改为跳飞
pathExecutor.FaceTo(AutoFightTask.FightWaypoint).Wait(2000,cts.Token);
AutoFightTask.FightWaypoint.MoveMode = MoveModeEnum.Fly.Code; // 改为跳飞
Simulation.SendInput.Mouse.RightButtonDown();
pathExecutor.MoveTo(AutoFightTask.FightWaypoint).Wait(15000, ct);
AutoFightTask.FightWaypoint = null;//执行后清空,即每次战斗只执行一次,第二次直接去七天神像
pathExecutor.MoveTo(AutoFightTask.FightWaypoint).Wait(15000,cts.Token);
cts.Cancel();
AutoFightTask.FightWaypoint = null;
Simulation.SendInput.Mouse.RightButtonUp();
}
catch (TaskCanceledException)
{
Logger.LogError("游泳检测:回到战斗地点任务被取消");
}
catch (Exception ex)
{
Logger.LogWarning(ex, "游泳检测:回到战斗地点异常");
Logger.LogError(ex, "游泳检测:回到战斗地点异常");
}
finally
{
Simulation.ReleaseAllKey();
}
Simulation.ReleaseAllKey();
using var ra2 = CaptureToRectArea();
if (!SwimmingConfirm(ra2))
using var bitmap2 = CaptureToRectArea();
if (!SwimmingConfirm(bitmap2))
{
Logger.LogInformation("游泳检测:游泳脱困成功");
return;
return;
}
Logger.LogWarning("游泳检测:回到战斗地点失败");
@@ -245,10 +254,10 @@ public class Avatar
// 切换成功
if (CombatScenes.GetActiveAvatarIndex(region, context) == Index)
{
if (needLog && i > 0)
{
Logger.LogInformation("成功切换角色:{Name}", Name);
}
// if (needLog && i > 0)
// {
// Logger.LogInformation("成功切换角色:{Name}", Name);
// }
return true;
}
@@ -258,6 +267,8 @@ public class Avatar
Sleep(250, Ct);
}
Logger.LogWarning("切换角色失败:{Name}", Name);
return false;
}
@@ -463,8 +474,8 @@ public class Avatar
var cd = AfterUseSkill(region);
if (cd > 0)
{
Logger.LogInformation(hold ? "{Name} 长按元素战技cd:{Cd} 秒" : "{Name} 点按元素战技cd:{Cd} 秒", Name,
Math.Round(cd, 2));
// Logger.LogInformation(hold ? "{Name} 长按元素战技cd:{Cd} 秒" : "{Name} 点按元素战技cd:{Cd} 秒", Name,
// Math.Round(cd, 2));
return;
}
}
@@ -620,6 +631,32 @@ public class Avatar
{
Sleep(ms); // 由于存在宏操作等待不应被cts取消
}
/// <summary>
/// 等待完成
/// </summary>
public void Ready()
{
Sleep(200, Ct);
for (int i = 0; i < 20; i++)
{
if (Ct is { IsCancellationRequested: true })
{
return;
}
using var region = CaptureToRectArea();
// 等待角色编号块出现
if (PartyAvatarSideIndexHelper.HasAnyIndexRect(region))
{
region.Dispose();
return;
}
Sleep(150, Ct);
}
}
/// <summary>
///
@@ -857,6 +894,11 @@ public class Avatar
GlobalMethod.MoveMouseBy(x, y);
}
public void Scroll(int scrollAmountInClicks)
{
Simulation.SendInput.Mouse.VerticalScroll(scrollAmountInClicks);
}
public void KeyDown(string key)
{
var vk = KeyBindingsSettingsPageViewModel.MappingKey(User32Helper.ToVk(key));

View File

@@ -177,6 +177,48 @@ public class CombatScenes : IDisposable
return this;
}
/// <summary>
/// 静默模式下的队伍识别(用于后台挂件)
/// </summary>
public CombatScenes InitializeTeamSilent(ImageRegion imageRegion, AutoFightConfig? autoFightConfig = null)
{
try
{
if (autoFightConfig == null)
{
autoFightConfig = TaskContext.Instance().Config.AutoFightConfig;
}
// 优先取配置
if (!string.IsNullOrEmpty(autoFightConfig.TeamNames))
{
InitializeTeamFromConfig(autoFightConfig.TeamNames, autoFightConfig);
return this;
}
// 使用 NullLogger 彻底屏蔽底层工具类的日志输出
var nullLogger = Microsoft.Extensions.Logging.Abstractions.NullLogger.Instance;
CurrentMultiGameStatus = PartyAvatarSideIndexHelper.DetectedMultiGameStatus(imageRegion, _autoFightAssets, nullLogger);
var (avatarIndexRectList, avatarSideIconRectList) = PartyAvatarSideIndexHelper.GetAllIndexRects(imageRegion, CurrentMultiGameStatus, nullLogger, _elementAssets, _systemInfo);
ExpectedTeamAvatarNum = avatarIndexRectList.Count;
var names = new string[avatarSideIconRectList.Count];
for (var i = 0; i < avatarSideIconRectList.Count; i++)
{
using var ra = imageRegion.DeriveCrop(avatarSideIconRectList[i]);
var pair = ClassifyAvatarCnName(ra.CacheImage, i + 1);
names[i] = pair.Item1;
}
Avatars = BuildAvatars([.. names], null, avatarIndexRectList, autoFightConfig);
}
catch
{
// 静默模式下完全不抛出、不记录异常
}
return this;
}
/// <summary>
/// 这个个方法主要用于在切人判断有误的情况下,且能够找到预期数量的角色编号框。此时只有两种情况

View File

@@ -167,9 +167,10 @@ public class OneKeyFightTask : Singleton<OneKeyFightTask>
{
return new Task(() =>
{
Logger.LogInformation("→ {Name}执行宏", activeAvatar.Name);
var round = 1;
while (!ct.IsCancellationRequested && IsEnabled())
{
Logger.LogInformation("→ {Name}执行宏 (第{Round}轮)", activeAvatar.Name, round);
if (IsHoldOnMode() && !_isKeyDown)
{
break;
@@ -178,8 +179,14 @@ public class OneKeyFightTask : Singleton<OneKeyFightTask>
// 通用化战斗策略
foreach (var command in combatCommands)
{
if (command.ActivatingRound != null && command.ActivatingRound.Count > 0 && !command.ActivatingRound.Contains(round))
{
// 跳过强制首轮指令
continue;
}
command.Execute(activeAvatar);
}
round++;
}
Logger.LogInformation("→ {Name}停止宏", activeAvatar.Name);
@@ -194,7 +201,7 @@ public class OneKeyFightTask : Singleton<OneKeyFightTask>
public Dictionary<string, List<CombatCommand>> LoadAvatarMacros()
{
var jsonPath = Global.Absolute("User/avatar_macro.json");
var jsonPath = GetAvatarMacroJsonPath();
var json = File.ReadAllText(jsonPath);
_lastUpdateTime = File.GetLastWriteTime(jsonPath);
var avatarMacros = JsonSerializer.Deserialize<List<AvatarMacro>>(json, ConfigService.JsonOptions);
@@ -219,10 +226,20 @@ public class OneKeyFightTask : Singleton<OneKeyFightTask>
public bool IsAvatarMacrosEdited()
{
// 通过修改时间判断是否编辑过
var jsonPath = Global.Absolute("User/avatar_macro.json");
var jsonPath = GetAvatarMacroJsonPath();
var lastWriteTime = File.GetLastWriteTime(jsonPath);
return lastWriteTime > _lastUpdateTime;
}
public static string GetAvatarMacroJsonPath()
{
var path = Global.Absolute("User/avatar_macro.json");
if (!File.Exists(path))
{
File.Copy(Global.Absolute("User/avatar_macro_default.json"), path);
}
return path;
}
public static bool IsEnabled()
{

View File

@@ -14,6 +14,8 @@ public class CombatCommand
public List<string>? Args { get; set; }
public List<int> ActivatingRound { get; set; }
public CombatCommand(string name, string command)
{
Name = name.Trim();
@@ -62,6 +64,16 @@ public class CombatCommand
throw new ArgumentException($"{Method.Alias[0]}方法的入参必须是VirtualKeyCodes枚举中的值当前入参 {Args[0]} 不合法");
}
}
else if (Method == Method.Scroll)
{
AssertUtils.IsTrue(Args.Count == 1, "scroll方法必须有一个入参代表滚动格数。例scroll(1) 或 scroll(-1)");
AssertUtils.IsTrue(int.TryParse(Args[0], out _), "滚动格数必须是整数");
}
}
public override string ToString()
{
return $"<CombatCommand {Name}, {Method}({Args}) (rounds {ActivatingRound})>";
}
public void Execute(CombatScenes combatScenes, CombatCommand? lastCommand = null)
@@ -95,7 +107,8 @@ public class CombatCommand
&& Method != Method.MoveBy
&& Method != Method.KeyDown
&& Method != Method.KeyUp
&& Method != Method.KeyPress)
&& Method != Method.KeyPress
&& Method != Method.Scroll)
{
avatar.Switch();
}
@@ -185,6 +198,10 @@ public class CombatCommand
var s = double.Parse(Args![0]);
avatar.Wait((int)TimeSpan.FromSeconds(s).TotalMilliseconds);
}
else if (Method == Method.Ready)
{
avatar.Ready();
}
else if (Method == Method.Aim)
{
throw new NotImplementedException();
@@ -264,6 +281,14 @@ public class CombatCommand
{
avatar.KeyPress(Args![0]);
}
else if (Method == Method.Scroll)
{
avatar.Scroll(int.Parse(Args![0]));
}
else if (Method == Method.Round)
{
// 作为回合标记使用,不做任何操作
}
else
{
throw new NotImplementedException();

View File

@@ -28,7 +28,9 @@ public class CombatScriptBag(List<CombatScript> combatScripts)
}
if (matchCount != avatars.Count) continue;
Logger.LogInformation("匹配到战斗脚本:{Name}", combatScript.Name);
// Logger.LogInformation("匹配到战斗脚本:{Name},共{Cnt}条指令,涉及角色:{Str}",
// combatScript.Name, combatScript.CombatCommands.Count, string.Join(",", combatScript.AvatarNames));
Logger.LogInformation("匹配到战斗脚本:{Name}", combatScript.Name);
return combatScript.CombatCommands;
}

View File

@@ -97,7 +97,7 @@ public class CombatScriptParser
}
var names = string.Join(",", combatAvatarNames);
Logger.LogDebug("战斗脚本解析完成,共{Cnt}条指令,涉及角色:{Str}", combatCommands.Count, names);
// Logger.LogDebug("战斗脚本解析完成,共{Cnt}条指令,涉及角色:{Str}", combatCommands.Count, names);
return new CombatScript(combatAvatarNames, combatCommands);
}
@@ -131,7 +131,70 @@ public class CombatScriptParser
return oneLineCombatCommands;
}
public static List<CombatCommand> ParseLineCommands(string lineWithoutAvatar, string avatarName)
public static List<int> ParseRoundCommand(CombatCommand roundCommand) {
// 解析round命令的入参返回一个整数列表代表在哪些回合执行后续指令
// 支持Round(1)、Round(1,3,5)、Round(2-4)、Round(1,3-5)等格式
var activatingRounds = new List<int>();
if (roundCommand.Args == null || roundCommand.Args.Count == 0) {
Logger.LogError("round方法必须有入参代表在哪些回合执行后续指令round(1)、round(1,3-5)");
throw new ArgumentException("round方法必须有入参代表在哪些回合执行后续指令round(1)、round(1,3-5)");
}
foreach (var arg in roundCommand.Args) {
if (arg.Contains('-')) {
// 范围
var parts = arg.Split('-', StringSplitOptions.TrimEntries);
if (parts.Length != 2) {
Logger.LogError("round方法的入参格式错误round(1-3)");
throw new ArgumentException("round方法的入参格式错误round(1-3)");
}
var start = int.Parse(parts[0]);
var end = int.Parse(parts[1]);
if (start > end || start <= 0) {
Logger.LogError("round方法的入参格式错误起始回合必须小于等于结束回合且大于0round(1-3)");
throw new ArgumentException("round方法的入参格式错误起始回合必须小于等于结束回合且大于0round(1-3)");
}
for (int i = start; i <= end; i++) {
activatingRounds.Add(i);
}
} else {
// 单个回合
var round = int.Parse(arg);
if (round <= 0) {
Logger.LogError("round方法的入参格式错误回合数必须大于0round(1)");
throw new ArgumentException("round方法的入参格式错误回合数必须大于0round(1)");
}
activatingRounds.Add(round);
}
}
return activatingRounds;
}
public static List<CombatCommand> ParseLineCommands(string lineWithoutAvatar, string avatarName) {
var parts = lineWithoutAvatar.Split("|", StringSplitOptions.RemoveEmptyEntries);
var fullCombatCommands = new List<CombatCommand>();
foreach (var part in parts)
{
var combatCommands = ParseLinePart(part, avatarName);
if (combatCommands.Count > 0 && combatCommands[0].Method == Method.Round) {
// 遇到round指令作为回合分隔符使用不加入最终指令列表
var roundCommand = combatCommands[0];
var activatingRounds = ParseRoundCommand(roundCommand);
combatCommands.RemoveAt(0);
foreach (var combatCommand in combatCommands) {
combatCommand.ActivatingRound = activatingRounds;
}
}
fullCombatCommands.AddRange(combatCommands);
}
// foreach (var combatCommand in fullCombatCommands)
// {
// Logger.LogDebug("解析战斗脚本命令:{cmd}", combatCommand.ToString());
// }
return fullCombatCommands;
}
public static List<CombatCommand> ParseLinePart(string lineWithoutAvatar, string avatarName)
{
var oneLineCombatCommands = new List<CombatCommand>();
var commandArray = lineWithoutAvatar.Split(",", StringSplitOptions.RemoveEmptyEntries);

View File

@@ -12,6 +12,7 @@ public class Method
public static readonly Method Attack = new(["attack", "普攻", "普通攻击"]);
public static readonly Method Charge = new(["charge", "重击"]);
public static readonly Method Wait = new(["wait", "after", "等待"]);
public static readonly Method Ready = new(["ready", "完成"]);
public static readonly Method Walk = new(["walk", "行走"]);
public static readonly Method W = new(["w"]);
@@ -31,6 +32,8 @@ public class Method
public static readonly Method KeyDown = new(["keydown"]);
public static readonly Method KeyUp = new(["keyup"]);
public static readonly Method KeyPress = new(["keypress"]);
public static readonly Method Scroll = new(["scroll", "verticalscroll"]);
public static readonly Method Round = new(["round"]);
public static IEnumerable<Method> Values
{
@@ -41,6 +44,7 @@ public class Method
yield return Attack;
yield return Charge;
yield return Wait;
yield return Ready;
yield return Walk;
yield return W;
@@ -60,6 +64,8 @@ public class Method
yield return KeyDown;
yield return KeyUp;
yield return KeyPress;
yield return Scroll;
yield return Round;
}
}

View File

@@ -138,7 +138,8 @@ namespace BetterGenshinImpact.GameTask.AutoFishing
{
if (!SystemControl.IsGenshinImpactActiveByProcess())
{
_logger.LogInformation("当前获取焦点的窗口不是原神,停止执行");
var name = SystemControl.GetActiveByProcess();
_logger.LogWarning($"当前获取焦点的窗口为: {name},不是原神,停止执行");
break;
}

View File

@@ -648,7 +648,7 @@
"nameEn": "charlotte",
"type": "character",
"name": "夏洛蒂",
"hp": 10,
"hp": 11,
"energy": 2,
"element": "冰元素",
"weapon": "法器",
@@ -1439,7 +1439,7 @@
"nameEn": "kamisato_ayato",
"type": "character",
"name": "神里绫人",
"hp": 10,
"hp": 11,
"energy": 2,
"element": "水元素",
"weapon": "单手剑",
@@ -2720,7 +2720,7 @@
"nameEn": "thoma",
"type": "character",
"name": "托马",
"hp": 10,
"hp": 12,
"energy": 2,
"element": "火元素",
"weapon": "长柄武器",
@@ -4222,6 +4222,83 @@
}
]
},
{
"id": 1416,
"nameEn": "ororon",
"type": "character",
"name": "欧洛伦",
"hp": 10,
"energy": 2,
"element": "雷元素",
"weapon": "弓",
"skills": [
{
"nameEn": "spiritvessel_snapshot",
"name": "宿灵闪箭",
"skillTag": [
"普通攻击"
],
"cost": [
{
"id": 1104,
"nameEn": "electro",
"type": "雷元素",
"count": 1
},
{
"id": 1109,
"nameEn": "unaligned_element",
"type": "无色元素",
"count": 2
}
]
},
{
"nameEn": "nights_sling",
"name": "暝色缒索",
"skillTag": [
"元素战技"
],
"cost": [
{
"id": 1104,
"nameEn": "electro",
"type": "雷元素",
"count": 3
}
]
},
{
"nameEn": "dark_voices_echo",
"name": "黯声回响",
"skillTag": [
"元素爆发"
],
"cost": [
{
"id": 1104,
"nameEn": "electro",
"type": "雷元素",
"count": 3
},
{
"id": 1110,
"nameEn": "energy",
"type": "充能",
"count": 2
}
]
},
{
"nameEn": "nightshade_synesthesia",
"name": "夜翳的通感",
"skillTag": [
"被动技能"
],
"cost": []
}
]
},
{
"id": 1501,
"nameEn": "sucrose",
@@ -6068,7 +6145,7 @@
"nameEn": "collei",
"type": "character",
"name": "柯莱",
"hp": 10,
"hp": 11,
"energy": 2,
"element": "草元素",
"weapon": "弓",
@@ -7457,7 +7534,7 @@
"nameEn": "hydro_tulpa",
"type": "character",
"name": "水形幻人",
"hp": 12,
"hp": 11,
"energy": 3,
"element": "水元素",
"weapon": "其他武器",
@@ -7529,6 +7606,83 @@
}
]
},
{
"id": 2207,
"nameEn": "consecrated_horned_crocodile",
"type": "character",
"name": "圣骸角鳄",
"hp": 11,
"energy": 2,
"element": "水元素",
"weapon": "其他武器",
"skills": [
{
"nameEn": "fang_bite",
"name": "尖牙噬咬",
"skillTag": [
"普通攻击"
],
"cost": [
{
"id": 1102,
"nameEn": "hydro",
"type": "水元素",
"count": 1
},
{
"id": 1109,
"nameEn": "unaligned_element",
"type": "无色元素",
"count": 2
}
]
},
{
"nameEn": "sawtoothed_surge",
"name": "鳄齿锐波",
"skillTag": [
"元素战技"
],
"cost": [
{
"id": 1102,
"nameEn": "hydro",
"type": "水元素",
"count": 3
}
]
},
{
"nameEn": "reptilian_rage",
"name": "凶鳄狂浪",
"skillTag": [
"元素爆发"
],
"cost": [
{
"id": 1102,
"nameEn": "hydro",
"type": "水元素",
"count": 3
},
{
"id": 1110,
"nameEn": "energy",
"type": "充能",
"count": 2
}
]
},
{
"nameEn": "consecrated_senses",
"name": "圣骸感应",
"skillTag": [
"被动技能"
],
"cost": []
}
]
},
{
"id": 2301,
"nameEn": "fatui_pyro_agent",
@@ -7842,7 +7996,7 @@
"nameEn": "lord_of_eroded_primal_fire",
"type": "character",
"name": "蚀灭的源焰之主",
"hp": 12,
"hp": 11,
"energy": 2,
"element": "火元素",
"weapon": "其他武器",
@@ -9220,5 +9374,76 @@
"cost": []
}
]
},
{
"id": 6605,
"nameEn": "skirk",
"type": "character",
"name": "丝柯克",
"hp": 10,
"energy": 0,
"element": "冰元素",
"weapon": "单手剑",
"skills": [
{
"nameEn": "havoc_sunder",
"name": "极恶技·断",
"skillTag": [
"普通攻击"
],
"cost": [
{
"id": 1101,
"nameEn": "cryo",
"type": "冰元素",
"count": 1
},
{
"id": 1109,
"nameEn": "unaligned_element",
"type": "无色元素",
"count": 2
}
]
},
{
"nameEn": "havoc_warp",
"name": "极恶技·闪",
"skillTag": [
"元素战技"
],
"cost": [
{
"id": 1101,
"nameEn": "cryo",
"type": "冰元素",
"count": 2
}
]
},
{
"nameEn": "havoc_extinction",
"name": "极恶技·尽",
"skillTag": [
"元素爆发"
],
"cost": [
{
"id": 1101,
"nameEn": "cryo",
"type": "冰元素",
"count": 1
}
]
},
{
"nameEn": "reason_beyond_reason",
"name": "理外之理",
"skillTag": [
"被动技能"
],
"cost": []
}
]
}
]

View File

@@ -111,7 +111,8 @@ public class GeniusInvokationControl
TaskControl.TrySuspend();
if (!SystemControl.IsGenshinImpactActiveByProcess())
{
_logger.LogWarning("当前获取焦点的窗口不是原神,暂停");
var name = SystemControl.GetActiveByProcess();
_logger.LogWarning($"当前获取焦点的窗口为: {name},不是原神,暂停");
throw new RetryException("当前获取焦点的窗口不是原神");
}
}, TimeSpan.FromSeconds(1), 100);
@@ -714,13 +715,6 @@ public class GeniusInvokationControl
Sleep(500);
}
}
// 存在吞星之鲸的情况下,烧牌后等待加血动画
if (duel.Characters.Any(c => c is { Name: "吞星之鲸" }))
{
Debug.WriteLine("存在吞星之鲸的情况下,烧牌后等待动画");
Sleep(5000);
}
}
return ActionPhaseUseSkill(skillIndex);
@@ -1254,4 +1248,4 @@ public class GeniusInvokationControl
return -10;
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 918 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 707 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 682 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1018 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

View File

@@ -0,0 +1,98 @@
{
"info": {
"authors": [],
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1757822946823,
"map_match_method": "",
"map_name": "Teyvat",
"name": "挪德卡莱3-蓝泊湖-2-rerun",
"tags": [],
"type": "collect",
"version": "1.0"
},
"positions": [
{
"action": "",
"action_params": "",
"id": 1,
"move_mode": "walk",
"type": "teleport",
"x": 9099.5234375,
"y": 2296.4248046875
},
{
"action": "stop_flying",
"action_params": "",
"id": 2,
"move_mode": "fly",
"type": "path",
"x": 9094.8037109375,
"y": 2281.67529296875
},
{
"action": "",
"action_params": "",
"id": 3,
"move_mode": "dash",
"type": "path",
"x": 9068.869140625,
"y": 2268.197021484375
},
{
"action": "",
"action_params": "",
"id": 4,
"move_mode": "dash",
"type": "path",
"x": 9058.2861328125,
"y": 2253.7373046875
},
{
"action": "",
"action_params": "",
"id": 5,
"move_mode": "run",
"type": "path",
"x": 9041.37890625,
"y": 2250.19384765625
},
{
"action": "",
"action_params": "",
"id": 6,
"move_mode": "dash",
"type": "path",
"x": 9026.62109375,
"y": 2235.5322265625
},
{
"action": "",
"action_params": "",
"id": 7,
"move_mode": "dash",
"type": "path",
"x": 9024.693359375,
"y": 2198.438720703125
},
{
"action": "stop_flying",
"action_params": "1000",
"id": 8,
"move_mode": "fly",
"type": "path",
"x": 9018.0087890625,
"y": 2152.14990234375
},
{
"action": "",
"action_params": "",
"id": 9,
"move_mode": "walk",
"type": "target",
"x": 9018.50390625,
"y": 2146.216064453125
}
]
}

View File

@@ -0,0 +1,63 @@
{
"info": {
"authors": [],
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1768391916967,
"map_match_method": "SIFT",
"map_name": "Teyvat",
"name": "挪德卡莱4-望崖营垒-2-rerun",
"tags": [],
"type": "collect",
"version": "1.0"
},
"positions": [
{
"action": "",
"action_params": "",
"id": 1,
"move_mode": "walk",
"type": "teleport",
"x": 10043.07421875,
"y": 5938.26025390625
},
{
"action": "",
"action_params": "",
"id": 2,
"move_mode": "dash",
"type": "path",
"x": 10014.490234375,
"y": 5945.666015625
},
{
"action": "",
"action_params": "",
"id": 3,
"move_mode": "jump",
"type": "path",
"x": 10011.1904296875,
"y": 5951.84716796875
},
{
"action": "",
"action_params": "",
"id": 4,
"move_mode": "walk",
"type": "path",
"x": 10006.8232421875,
"y": 5972.55029296875
},
{
"action": "",
"action_params": "",
"id": 5,
"locked": false,
"move_mode": "dash",
"type": "target",
"x": 10039.93359375,
"y": 5999.8994140625
}
]
}

View File

@@ -0,0 +1,35 @@
{
"info": {
"authors": [],
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1768473650004,
"map_match_method": "SIFT",
"map_name": "Teyvat",
"name": "挪德卡莱5-厄布拉神柱-2-rerun",
"tags": [],
"type": "collect",
"version": "1.0"
},
"positions": [
{
"action": "",
"action_params": "",
"id": 1,
"move_mode": "walk",
"type": "teleport",
"x": 9920.326171875,
"y": 5727.9716796875
},
{
"action": "",
"action_params": "",
"id": 2,
"move_mode": "dash",
"type": "target",
"x": 10005.4228515625,
"y": 5797.181640625
}
]
}

View File

@@ -0,0 +1,53 @@
{
"info": {
"authors": [],
"bgi_version": "0.45.0",
"description": "",
"enable_monster_loot_split": false,
"last_modified_time": 1768473974691,
"map_match_method": "SIFT",
"map_name": "Teyvat",
"name": "挪德卡莱5-厄布拉神柱-4-rerun",
"tags": [],
"type": "collect",
"version": "1.0"
},
"positions": [
{
"action": "",
"action_params": "",
"id": 1,
"move_mode": "walk",
"type": "teleport",
"x": 10068.767578125,
"y": 5628.6015625
},
{
"action": "",
"action_params": "",
"id": 2,
"move_mode": "dash",
"type": "path",
"x": 10106.7109375,
"y": 5636.09033203125
},
{
"action": "",
"action_params": "",
"id": 3,
"move_mode": "jump",
"type": "path",
"x": 10117.119140625,
"y": 5647.3115234375
},
{
"action": "",
"action_params": "",
"id": 4,
"move_mode": "dash",
"type": "target",
"x": 10133.953125,
"y": 5683.69970703125
}
]
}

View File

@@ -0,0 +1,40 @@
{
"info": {
"name": "枫丹1-秋分山西侧-1-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 4146.91,
"y": 2606.27,
"action_params": ""
},
{
"id": 2,
"x": 4191.61,
"y": 2522.25,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 4183.27,
"y": 2502.37,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,57 @@
{
"info": {
"name": "枫丹1-秋分山西侧-2-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4146.69,
"y": 2606.25,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4157.89,
"y": 2579.28,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4150.46,
"y": 2530.25,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 4,
"x": 4180.84,
"y": 2450.05,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 5,
"x": 4190.03,
"y": 2426.41,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,66 @@
{
"info": {
"name": "枫丹1-秋分山西侧-3-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4375.5,
"y": 2280.05,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4334.42,
"y": 2337.57,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4327.22,
"y": 2345.84,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
},
{
"id": 4,
"x": 4280.2,
"y": 2342.5,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 5,
"x": 4264.16,
"y": 2357.42,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 6,
"x": 4246.28,
"y": 2374.05,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,48 @@
{
"info": {
"name": "枫丹1-秋分山西侧-4-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4375.37,
"y": 2281.02,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4383.66,
"y": 2268.13,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4318.1,
"y": 2235.66,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 4,
"x": 4299.75,
"y": 2232.59,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "枫丹1-秋分山西侧-5-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4375.04,
"y": 2280.11,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4394.32,
"y": 2257.98,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4402.53,
"y": 2253.27,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "枫丹2-芒索斯山东麓-1-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4984.79,
"y": 4462.98,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4970.03,
"y": 4415.96,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4962.82,
"y": 4395.81,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,30 @@
{
"info": {
"name": "枫丹2-芒索斯山东麓-2-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4984.69,
"y": 4462.91,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4952.04,
"y": 4468.84,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,40 @@
{
"info": {
"name": "枫丹2-芒索斯山东麓-3-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 4984.75,
"y": 4462.97,
"action_params": ""
},
{
"id": 2,
"x": 5032.75,
"y": 4492.81,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 5043.36,
"y": 4479.99,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,58 @@
{
"info": {
"name": "枫丹2-芒索斯山东麓-4-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 4984.75,
"y": 4462.94,
"action_params": ""
},
{
"id": 2,
"x": 5046.47,
"y": 4496.56,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 5077.78,
"y": 4494.85,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 5107.19,
"y": 4542.49,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 5,
"x": 5087.02,
"y": 4573.27,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,49 @@
{
"info": {
"name": "枫丹3-新枫丹科学院-1-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 4498.18,
"y": 4710.79,
"action_params": ""
},
{
"id": 2,
"x": 4496.67,
"y": 4741.03,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 4539.94,
"y": 4771.01,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 4556.1,
"y": 4762.42,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,49 @@
{
"info": {
"name": "枫丹3-新枫丹科学院-2-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 4498.15,
"y": 4710.78,
"action_params": ""
},
{
"id": 2,
"x": 4494.08,
"y": 4762.04,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 4499.02,
"y": 4825.24,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 4517.81,
"y": 4866.48,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "枫丹3-新枫丹科学院-3-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4624.36,
"y": 4951.78,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4607.47,
"y": 4925.97,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4578.63,
"y": 4913.28,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,49 @@
{
"info": {
"name": "枫丹3-新枫丹科学院-4-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 4624.37,
"y": 4951.84,
"action_params": ""
},
{
"id": 2,
"x": 4635.65,
"y": 4951.5,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 4665.65,
"y": 4970.14,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 4679.47,
"y": 4977.83,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,58 @@
{
"info": {
"name": "枫丹4-柔灯港-1-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 2873.54,
"y": 3512.04,
"type": "teleport",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 2,
"x": 2890.51,
"y": 3532.46,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 2904.51,
"y": 3545.62,
"type": "path",
"move_mode": "climb",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 2929.82,
"y": 3563.57,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 5,
"x": 2932.47,
"y": 3583.9,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,57 @@
{
"info": {
"name": "枫丹4-柔灯港-2-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 3032.66,
"y": 3732.42,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 3019.81,
"y": 3712.95,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
},
{
"id": 3,
"x": 3015.82,
"y": 3665.19,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "target"
},
{
"id": 4,
"x": 3010.95,
"y": 3624.05,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 5,
"x": 3008.4,
"y": 3602.59,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,58 @@
{
"info": {
"name": "枫丹4-柔灯港-3-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 3032.67,
"y": 3732.43,
"action_params": ""
},
{
"id": 2,
"x": 3045.59,
"y": 3710.54,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 3039.93,
"y": 3671.22,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 3055.35,
"y": 3641.24,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 5,
"x": 3077.19,
"y": 3602.84,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,58 @@
{
"info": {
"name": "枫丹4-柔灯港-4-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 3032.68,
"y": 3732.45,
"action_params": ""
},
{
"id": 2,
"x": 3038.55,
"y": 3718.42,
"type": "path",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 3067.2,
"y": 3698.43,
"type": "target",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 4,
"x": 3079.73,
"y": 3675.76,
"type": "path",
"move_mode": "dash",
"action": "",
"action_params": ""
},
{
"id": 5,
"x": 3091.8,
"y": 3654.75,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "枫丹5-秋分山东侧-1-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4146.68,
"y": 2606.23,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4116.21,
"y": 2592.0,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4098.63,
"y": 2584.16,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "枫丹5-秋分山东侧-2-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4146.78,
"y": 2606.25,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4091.37,
"y": 2573.86,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4063.52,
"y": 2564.29,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,57 @@
{
"info": {
"name": "枫丹5-秋分山东侧-3-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 3917.29,
"y": 2576.43,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 3922.84,
"y": 2562.64,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 3986.65,
"y": 2599.51,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 4,
"x": 4034.13,
"y": 2625.87,
"action": "fight",
"move_mode": "walk",
"action_params": "",
"type": "path"
},
{
"id": 5,
"x": 3999.66,
"y": 2613.18,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,49 @@
{
"info": {
"name": "枫丹5-秋分山东侧-4-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"action": "",
"move_mode": "walk",
"type": "teleport",
"x": 3917.28,
"y": 2576.33,
"action_params": ""
},
{
"id": 2,
"x": 3917.23,
"y": 2573.3,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": ""
},
{
"id": 3,
"x": 3907.25,
"y": 2607.02,
"type": "path",
"move_mode": "fly",
"action": "stop_flying",
"action_params": ""
},
{
"id": 4,
"x": 3921.35,
"y": 2617.81,
"type": "target",
"move_mode": "walk",
"action": "",
"action_params": "",
"locked": false
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "枫丹6-厄里那斯-1-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4749.59,
"y": 2636.21,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4758.19,
"y": 2611.12,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4760.8,
"y": 2574.52,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,39 @@
{
"info": {
"name": "枫丹6-厄里那斯-2-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4689.61,
"y": 2429.43,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4631.0,
"y": 2468.98,
"action": "",
"move_mode": "fly",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4653.67,
"y": 2531.89,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "target"
}
]
}

View File

@@ -0,0 +1,57 @@
{
"info": {
"name": "枫丹6-厄里那斯-3-rerun",
"type": "collect",
"author": "平面镜",
"version": "1.1",
"description": "",
"bgi_version": "0.42.3"
},
"positions": [
{
"id": 1,
"x": 4689.57,
"y": 2429.33,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "teleport"
},
{
"id": 2,
"x": 4664.06,
"y": 2408.48,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "path"
},
{
"id": 3,
"x": 4628.4,
"y": 2418.34,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "path"
},
{
"id": 4,
"x": 4585.56,
"y": 2438.06,
"action": "",
"move_mode": "dash",
"action_params": "",
"type": "path"
},
{
"id": 5,
"x": 4568.49,
"y": 2433.23,
"action": "",
"move_mode": "walk",
"action_params": "",
"type": "target"
}
]
}

Some files were not shown because too many files have changed in this diff Show More