diff --git a/BetterGenshinImpact/Core/Config/HotKeyConfig.cs b/BetterGenshinImpact/Core/Config/HotKeyConfig.cs index a3a5d1fe..b8963189 100644 --- a/BetterGenshinImpact/Core/Config/HotKeyConfig.cs +++ b/BetterGenshinImpact/Core/Config/HotKeyConfig.cs @@ -29,4 +29,6 @@ public partial class HotKeyConfig : ObservableObject [ObservableProperty] private string _autoGeniusInvokation = ""; [ObservableProperty] private string _autoWoodHotkey = ""; + + [ObservableProperty] private string _autoDomainHotkey = ""; } \ No newline at end of file diff --git a/BetterGenshinImpact/Core/Simulator/PostMessageSimulator.cs b/BetterGenshinImpact/Core/Simulator/PostMessageSimulator.cs index a0acd7df..cffcbbc8 100644 --- a/BetterGenshinImpact/Core/Simulator/PostMessageSimulator.cs +++ b/BetterGenshinImpact/Core/Simulator/PostMessageSimulator.cs @@ -65,6 +65,12 @@ public class PostMessageSimulator return this; } + public PostMessageSimulator KeyDown(User32.VK vk) + { + User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYDOWN, (nint)vk, 0x1e0001); + return this; + } + public PostMessageSimulator KeyUp(User32.VK vk) { User32.PostMessage(_hWnd, User32.WindowMessage.WM_KEYUP, (nint)vk, (nint)0xc01e0001); diff --git a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainParam.cs b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainParam.cs new file mode 100644 index 00000000..992b8ee6 --- /dev/null +++ b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainParam.cs @@ -0,0 +1,23 @@ +using BetterGenshinImpact.GameTask.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace BetterGenshinImpact.GameTask.AutoDomain; + +public class AutoDomainParam : BaseTaskParam +{ + + public int DomainRoundNum { get; set; } + public AutoDomainParam(CancellationTokenSource cts, int domainRoundNum) : base(cts) + { + DomainRoundNum = domainRoundNum; + if (domainRoundNum == 0) + { + DomainRoundNum = 9999; + } + } +} \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs index cff1192a..8c82126e 100644 --- a/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs +++ b/BetterGenshinImpact/GameTask/AutoDomain/AutoDomainTask.cs @@ -1,11 +1,83 @@ -using System; +using BetterGenshinImpact.GameTask.AutoSkip.Assets; +using BetterGenshinImpact.View.Drawable; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using BetterGenshinImpact.Core.Simulator; +using BetterGenshinImpact.GameTask.AutoGeniusInvokation.Exception; +using BetterGenshinImpact.GameTask.AutoWood.Utils; +using Microsoft.Extensions.Logging; +using Vanara.PInvoke; +using static BetterGenshinImpact.GameTask.Common.TaskControl; +using BetterGenshinImpact.GameTask.AutoPick.Assets; +using BetterGenshinImpact.Helpers; +using static Vanara.PInvoke.User32; namespace BetterGenshinImpact.GameTask.AutoDomain; public class AutoDomainTask { + private readonly AutoPickAssets _autoPickAssets = new(); + + private AutoDomainParam _taskParam; + + private readonly PostMessageSimulator _postMessage; + + public AutoDomainTask(AutoDomainParam taskParam) + { + _taskParam = taskParam; + _postMessage = Simulation.PostMessage(TaskContext.Instance().GameHandle); + } + + public void Start() + { + try + { + Logger.LogInformation("→ {Text} 设置总次数:{Cnt}", "自动秘境,启动!", _taskParam.DomainRoundNum); + SystemControl.ActivateWindow(); + // 1. 走到钥匙处启动 + WalkToStartDomain(); + } + catch (Exception e) + { + Logger.LogInformation(e.Message); + } + finally + { + VisionContext.Instance().DrawContent.ClearAll(); + TaskTriggerDispatcher.Instance().StartTimer(); + } + } + + private async void WalkToStartDomain() + { + await Task.Run(() => + { + _postMessage.KeyDown(VK.VK_W); + try + { + while (true) + { + var content = CaptureToContent(); + var fRectArea = content.CaptureRectArea.Find(_autoPickAssets.FRo); + if (fRectArea.IsEmpty()) + { + Sleep(100, _taskParam.Cts); + } + else + { + Logger.LogInformation("检测到F,启动秘境"); + Simulation.SendInputEx.Keyboard.KeyPress(VK.VK_F); + break; + } + } + } + finally + { + _postMessage.KeyUp(VK.VK_W); + } + }); + } } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/Common/TaskControl.cs b/BetterGenshinImpact/GameTask/Common/TaskControl.cs index 39a97460..aa70cb97 100644 --- a/BetterGenshinImpact/GameTask/Common/TaskControl.cs +++ b/BetterGenshinImpact/GameTask/Common/TaskControl.cs @@ -41,7 +41,7 @@ public class TaskControl { if (cts.IsCancellationRequested) { - throw new NormalEndException("取消自动伐木任务"); + throw new NormalEndException("取消自动任务"); } if (millisecondsTimeout <= 0) { @@ -51,7 +51,7 @@ public class TaskControl { if (cts.IsCancellationRequested) { - throw new NormalEndException("取消自动伐木任务"); + throw new NormalEndException("取消自动任务"); } if (!SystemControl.IsGenshinImpactActiveByProcess()) { @@ -62,7 +62,7 @@ public class TaskControl Thread.Sleep(millisecondsTimeout); if (cts.IsCancellationRequested) { - throw new NormalEndException("取消自动伐木任务"); + throw new NormalEndException("取消自动任务"); } } diff --git a/BetterGenshinImpact/GameTask/Model/IndependentTaskEnum.cs b/BetterGenshinImpact/GameTask/Model/IndependentTaskEnum.cs index 0e4ba081..fafe1dbf 100644 --- a/BetterGenshinImpact/GameTask/Model/IndependentTaskEnum.cs +++ b/BetterGenshinImpact/GameTask/Model/IndependentTaskEnum.cs @@ -11,4 +11,5 @@ public enum IndependentTaskEnum AutoGeniusInvokation, AutoWood, + AutoDomain, } \ No newline at end of file diff --git a/BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs b/BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs index 807c594d..9c0c3a1e 100644 --- a/BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs +++ b/BetterGenshinImpact/GameTask/TaskTriggerDispatcher.cs @@ -13,6 +13,7 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows; +using BetterGenshinImpact.GameTask.AutoDomain; using Vanara.PInvoke; namespace BetterGenshinImpact.GameTask @@ -43,14 +44,21 @@ namespace BetterGenshinImpact.GameTask //_timer.Tick += Tick; } + public static TaskTriggerDispatcher Instance() + { + if (_instance == null) + { + throw new Exception("请先在启动页启动BetterGI,如果已经启动请重启"); + } + + return _instance; + } + public static IGameCapture GlobalGameCapture { get { - if (_instance == null) - { - throw new Exception("请先在启动页启动BetterGI,如果已经启动请重启"); - } + _instance = Instance(); if (_instance.GameCapture == null) { @@ -168,6 +176,10 @@ namespace BetterGenshinImpact.GameTask { Task.Run(() => { new AutoWoodTask().Start((WoodTaskParam)param); }); } + else if (taskType == IndependentTaskEnum.AutoDomain) + { + Task.Run(() => { new AutoDomainTask((AutoDomainParam)param).Start(); }); + } } public void Dispose() => Stop(); diff --git a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml index 7ba04bb2..7f86444d 100644 --- a/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml +++ b/BetterGenshinImpact/View/Pages/TaskSettingsPage.xaml @@ -260,6 +260,97 @@ + + + + + + + + + + + + + + 自动刷秘境 - + + 点击查看使用教程 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +