diff --git a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs index 669b9bbe..2880df14 100644 --- a/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs +++ b/BetterGenshinImpact/GameTask/AutoPathing/PathExecutor.cs @@ -145,16 +145,29 @@ public class PathExecutor(CancellationToken ct) private async Task RecoverWhenLowHp() { - var region = CaptureToRectArea(); + using var region = CaptureToRectArea(); if (Bv.CurrentAvatarIsLowHp(region)) { Logger.LogInformation("当前角色血量过低,去须弥七天神像恢复"); - // tp 到七天神像回血 - var tpTask = new TpTask(ct); - await tpTask.Tp(TpTask.ReviveStatueOfTheSevenPointX, TpTask.ReviveStatueOfTheSevenPointY, true); - await Delay(2000, ct); - Logger.LogInformation("HP恢复完成"); + await TpStatueOfTheSeven(); } + else if (Bv.ClickIfInReviveModal(region)) + { + await Bv.WaitForMainUi(ct); // 等待主界面加载完成 + Logger.LogInformation("复苏完成"); + await Delay(3000, ct); + // 血量肯定不满,直接去七天神像回血 + await TpStatueOfTheSeven(); + } + } + + private async Task TpStatueOfTheSeven() + { + // tp 到七天神像回血 + var tpTask = new TpTask(ct); + await tpTask.Tp(TpTask.ReviveStatueOfTheSevenPointX, TpTask.ReviveStatueOfTheSevenPointY, true); + await Delay(3000, ct); + Logger.LogInformation("HP恢复完成"); } private async Task HandleTeleportWaypoint(WaypointForTrack waypoint) diff --git a/BetterGenshinImpact/GameTask/Common/BgiVision/BvStatus.cs b/BetterGenshinImpact/GameTask/Common/BgiVision/BvStatus.cs index fa146cb7..d6e4f03b 100644 --- a/BetterGenshinImpact/GameTask/Common/BgiVision/BvStatus.cs +++ b/BetterGenshinImpact/GameTask/Common/BgiVision/BvStatus.cs @@ -4,10 +4,12 @@ using BetterGenshinImpact.GameTask.QuickTeleport.Assets; using OpenCvSharp; using System; using System.Linq; +using System.Threading.Tasks; using BetterGenshinImpact.Core.Recognition; using BetterGenshinImpact.Core.Simulator; using BetterGenshinImpact.GameTask.AutoFight; using Vanara.PInvoke; +using System.Threading; namespace BetterGenshinImpact.GameTask.Common.BgiVision; @@ -34,6 +36,26 @@ public static partial class Bv return captureRa.Find(ElementAssets.Instance.PaimonMenuRo).IsExist(); } + /// + /// 等待主界面加载完成 + /// + /// + /// + /// + public static async Task WaitForMainUi(CancellationToken ct, int retryTimes = 25) + { + for (var i = 0; i < retryTimes; i++) + { + await TaskControl.Delay(1000, ct); + using var ra3 = TaskControl.CaptureToRectArea(); + if (IsInMainUi(ra3)) + { + return true; + } + } + return false; + } + /// /// 是否在大地图界面 /// @@ -89,6 +111,29 @@ public static partial class Bv return true; } } + + return false; + } + + /// + /// 是否出现全队死亡和复苏提示 + /// + /// + /// + public static bool ClickIfInReviveModal(ImageRegion region) + { + var list = region.FindMulti(new RecognitionObject + { + RecognitionType = RecognitionTypes.Ocr, + RegionOfInterest = new Rect(0, region.Height / 4 * 3, region.Width, region.Height / 4) + }); + var r = list.FirstOrDefault(r => r.Text.Contains("复苏")); + if (r != null) + { + r.Click(); + return true; + } + return false; }