diff --git a/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs b/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs index 848e6ef6..730d9aa0 100644 --- a/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs +++ b/BetterGenshinImpact/GameTask/AutoStygianOnslaught/AutoStygianOnslaughtTask.cs @@ -31,6 +31,7 @@ using BetterGenshinImpact.GameTask.AutoDomain; using static BetterGenshinImpact.GameTask.Common.TaskControl; using static Vanara.PInvoke.User32; using BetterGenshinImpact.GameTask.AutoFight; +using OpenCvSharp; namespace BetterGenshinImpact.GameTask.AutoStygianOnslaught; @@ -260,6 +261,7 @@ public class AutoStygianOnslaughtTask : ISoloTask // 重新执行从打开活动界面开始的流程 await TpToDomain(page, isRetry: true); } + return; } @@ -400,7 +402,33 @@ public class AutoStygianOnslaughtTask : ISoloTask { try { - await Bv.WaitUntilFound(ElementAssets.Instance.BtnWhiteCancel, cts.Token, 300, 1000); + var captureRect = TaskContext.Instance().SystemInfo.ScaleMax1080PCaptureRect; + var assetScale = TaskContext.Instance().SystemInfo.AssetScale; + RecognitionObject whiteCancelRo = new RecognitionObject + { + Name = "BtnWhiteCancel", + RecognitionType = RecognitionTypes.TemplateMatch, + TemplateImageMat = ElementAssets.Instance.BtnWhiteCancel.TemplateImageMat, + RegionOfInterest = new Rect(captureRect.Width / 3, captureRect.Height - (int)(captureRect.Height * 0.22), captureRect.Width / 3, (int)(captureRect.Height * 0.22)), + Use3Channels = true + }.InitTemplate(); + + await NewRetry.WaitForAction(() => + { + using var ra = CaptureToRectArea(); + using var ret = ra.Find(whiteCancelRo); + if (ret.IsExist()) + { + // OCR 保证识别不出错 + var list = ra.FindMulti(RecognitionObject.Ocr(ret.X + 40 * assetScale, ret.Y - 20 * assetScale, 270 * assetScale, ret.Height * 2)); + if (list.Any(o => o.Text.Contains("返回"))) + { + return true; + } + } + + return false; + }, cts.Token, 300, 1000); _logger.LogInformation("检测到战斗结束,结束战斗操作线程"); await cts.CancelAsync(); } @@ -721,10 +749,9 @@ public class AutoStygianOnslaughtTask : ISoloTask private async Task ExitDomain(BvPage page) { - var exitDoor = await NewRetry.WaitForElementAppear( ElementAssets.Instance.BtnExitDoor.Value, - () => Simulation.SendInput.Keyboard.KeyPress(VK.VK_ESCAPE),// 点击队伍选择按钮 + () => Simulation.SendInput.Keyboard.KeyPress(VK.VK_ESCAPE), // 点击队伍选择按钮 _ct, 4, 1000 diff --git a/BetterGenshinImpact/GameTask/Common/BgiVision/BvImage.cs b/BetterGenshinImpact/GameTask/Common/BgiVision/BvImage.cs index 5eba374a..cd65b226 100644 --- a/BetterGenshinImpact/GameTask/Common/BgiVision/BvImage.cs +++ b/BetterGenshinImpact/GameTask/Common/BgiVision/BvImage.cs @@ -20,7 +20,7 @@ public static partial class Bv /// public static async Task WaitUntilFound(RecognitionObject ro, CancellationToken ct, int retryTimes = 5, int delayMs = 1000) { - return await NewRetry.WaitForAction(() => TaskControl.CaptureToRectArea().Find(ro).IsExist(), ct, retryTimes); + return await NewRetry.WaitForAction(() => TaskControl.CaptureToRectArea().Find(ro).IsExist(), ct, retryTimes, delayMs); } /// @@ -44,7 +44,7 @@ public static partial class Bv } return false; - }, ct, retryTimes); + }, ct, retryTimes, delayMs); }